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++要的回调函数。

时间: 2024-10-26 23:20:07

c#调用c++带有回调函数方法的实现的相关文章

delphi-Delphi 调用C++ dll 回调函数

问题描述 Delphi 调用C++ dll 回调函数 用Delphi 调用容联云通信的动态库CCPAppClient.DLL,其中有一个函数 Function CCPinit( CallbackInterface: CCPCALLBACKINTERFACE ):Integer;stdcall; 参数CCPCALLBACKINTERFACE 是一个结构体指针,包含 onConnected , onConnectError 等回调函数. 在调用函数CCPinit调用成功后(返回值0),会触发CCPC

C#调用带有回调函数的DLL的问题 !!!!急!!!!!!

问题描述 //------------dll中的回调函数---------------voidkinescope(void(*kines)(floatx,floaty)){D3DXVECTOR3vec=d3d->GetCamera()->GetPos();kines(vec.x,vec.y); //----------------C#中调用代码---------------//------------委托声明-------------publicdelegatevoidkinds(floatx

在C#里面调用带有回调函数和自定义结构体的DLL的例程

函数 开发环境: WinXP Pro(SP2英文版) + VS.NET 2003中文版接口库版本: CMPP2.0 API第二版(V2.6) 该例程演示了如何在C#里面调用VC6.0开发的带回调函数的API,而且回调函数的参数包含结构体,使用C#的委托和IntPtr方法实现. 由于我使用C#刚两天,这是我写的第一个C#程序,因此例程写的可能有点粗糙,但是编译和运行完全没有问题. CMPP2.0的API封装成了标准C调用的方法,提供以下三个接口,使用的时候只要有CMPPAPI.dll就可以了. #

详解C#中委托,事件与回调函数讲解_C#教程

.Net编程中最经常用的元素,事件必然是其中之一.无论在ASP.NET还是WINFrom开发中,窗体加载(Load),绘制(Paint),初始化(Init)等等. "protected void Page_Load(object sender, EventArgs e)"这段代码相信没有人不熟悉的.细心一点一定会发现,非常多的事件方法都是带了"object sender, EventArgs e"这两个参数.这是不是和委托非常相似呢? 一.委托(有些书中也称为委派)

jQuery回调函数的定义及用法实例_jquery

本文实例讲述了jQuery回调函数的定义及用法.分享给大家供大家参考.具体分析如下: jQuery代码中对回调函数有着广泛的应用,对其有精准的理解是非常有必要的,下面就通过实例对此方法进行简单的介绍. 代码实例如下: 利用回调函数,当div全部隐藏之后弹出一个提示框. 复制代码 代码如下: <!DOCTYPE html> <html> <head> <meta charset=" utf-8"> <meta name="a

c++ delphi 回调函数-一个数据结构的题目,涉及Hash、双链表、回调函数等,求大神指教?

问题描述 一个数据结构的题目,涉及Hash.双链表.回调函数等,求大神指教? 数据结构相关的题目描述 typedef?struct?_FILE_NODE?{ _FILE_NODE?*Prev; _FILE_NODE?*Next; WCHAR?wzFileName[MAX_PATH]; DWORD?dwLowDateTimeLastWrite; }?FILE_NODE,?*LPFILENODE; 实现两个项目: 一.DLL 1.实现文件遍历的功能 2.导出接口中,可由用户指定遍历哪个文件夹 3.提

jquery序列化表单以及回调函数的使用示例_jquery

在开发项目中,将前台的值传给后台,有时的JSP表单中的值有一两个,也有全部的值,如果这时一个个传,必定不是很好的办法,所以使用jQuery提供的表单序列化方法,可以很好的解决这个问题,同时可以封装成通用的函数,执行成功可以调用各自的回调函数,实现各自的功能. 代码如下: function queryUserInfo(actionUrl,formId,fun){ var params=new Object(); //声明数组 $.each($("#"+formId).serializeA

JNA回调函数问题

问题描述 Java调用C++写的dll,dll内部也回调Java的函数.(使用JNA)功能已实现,但回调有个问题:dll回调Java函数若干次后就回调不成功了!(dll内部执行是没问题的)回调函数很简单:typedefvoid(__stdcall*InterfaceCallback)(intdata); Java这端的定义:publicinterfaceCTP2JAVADLLextendsStdCallLibrary{publicinterfaceICallbackextendsStdCallC

C#调用C++回调函数的问题

C++的回调函数中有一个参数是,是返回一个字符串,原则如下: typedef void (*TDataEvent)(char *AData ,int ALen); 其中char *AData是从DLL中返回一个字符串,串的内存已经在DLL中分配了 下面中我在C#中定义的委托 public delegate void TDataEvent(Byte[] AData, int ALen); 下面是回调函数的设置代码: Event=new clReceivelDllPoxy.TDataEvent(ge