转载:http://www.cnblogs.com/cssmystyle/archive/2012/03/15/2397524.html
目前正在做的一个项目,大部分数据来源都是通过调用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);
}