目前正在做的一個項目,大部分數據來源都是通過調用c++函數得到的,此時就遇到一個這次要說的問題。
如c++函數有個定時器,會定時調用我們c#的某個函數並把數據傳給c#,讓c#把數據顯示到界面上,在c++中有個回調函數指針的概念,只需要某個
函數在調用定時器函數時傳入一個函數指針就能達到目的,但C#中沒有函數指針的概念,我們該怎樣來實現呢。
其實說到回調函數,大家應該能想到c#中的委托,雖然名字不一樣,但在各自的語言范疇都能實現相似的功能。所以我們就可以大膽的嘗試下,把c#中的委托傳給
c++,看c++是否能夠承認它就是回調函數。
首先用c++寫一個帶有回調函數的方法 Test,在此省略。
接着,在c#中調用,
如:
[DllImport("Test.dll",ChartSet.Ansi,EntryPoint="ReadMyVideo",ExactSpelling=false,CallingConvertion=CallingConvertion.StdCall)]
private static extern void Test(string fileName,CallbackDelegate callback);
接下來我們再定義一個委托:
public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count);
public static CallbackDelegate callback;
注:說明一下,在給c++傳入數組參數時,必須得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 處理一下,相當於是告訴c++,c#傳入的是一個長度為8010的數組類型,如果不寫這句話的話,你回調函數接收到的參數將只有一條數據。
接下來看看怎樣來調用:
在調用時,我們得先寫一個接受c++傳回參數的方法,即我們傳入委托的實現方法。
private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count)
{
...//處理c++傳過來的數據s
}
一切工作准備完畢之后,我們來進行最后一步操作把
public void GetData()
{
callback=CallBackFunction;
ReadMyVideo("",callback);
}
經過驗證,委托就是c++要的回調函數。
