在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
目前正在做的一个项目,大部分数据来源都是通过调用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)] 接下来我们再定义一个委托: public delegate void CallbackDelegate([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count); 注:说明一下,在给c++传入数组参数时,必须得用[marshalAs(UnmanagedType.LPArray,SizeConst=8010)] 处理一下,相当于是告诉c++,c#传入的是一个长度为8010的数组类型,如果不写这句话的话,你回调函数接收到的参数将只有一条数据。 接下来看看怎样来调用: 在调用时,我们得先写一个接受c++传回参数的方法,即我们传入委托的实现方法。 private void CallBackFunction([marshalAs(UnmanagedType.LPArray,SizeConst=8010)]byte[] buffer,int count) 一切工作准备完毕之后,我们来进行最后一步操作把 public void GetData() 经过验证,委托就是c++要的回调函数。
|
请发表评论