Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;到C#回调结构编组_C#_C++_Dll_Marshalling - Fatal编程技术网

C++;到C#回调结构编组

C++;到C#回调结构编组,c#,c++,dll,marshalling,C#,C++,Dll,Marshalling,我的项目遇到了一些麻烦 我使用了C++编译的DLL(我没有机会改变它,重新编译或修改它)。我有.h,那里有一些(坏文档)信息。 此dll用于与通过USB连接的设备进行交互。该设备已正确配置,并使用dll提供的功能,我绝对确信它正确响应dll调用。 从C++和C语言中进行的编组非常简单,直到我必须使用回调来登记设备所引发的一些事件。 这是C++中的重要部分,我必须在C语言中使用。 (第一个和第二个事件是假名称) 我有一些问题,让c++dll调用我定义的C++函数来处理设备引发的事件。< /P> 我

我的项目遇到了一些麻烦

<>我使用了C++编译的DLL(我没有机会改变它,重新编译或修改它)。我有.h,那里有一些(坏文档)信息。 此dll用于与通过USB连接的设备进行交互。该设备已正确配置,并使用dll提供的功能,我绝对确信它正确响应dll调用。 从C++和C语言中进行的编组非常简单,直到我必须使用回调来登记设备所引发的一些事件。

这是C++中的重要部分,我必须在C语言中使用。 (第一个和第二个事件是假名称)

<>我有一些问题,让c++dll调用我定义的C++函数来处理设备引发的事件。< /P> 我遵循了许多发现的示例,但我发现我无法以正确的方式使用这些功能。基本上C应用程序崩溃没有任何进一步的信息(我认为是因为错误是在C++ DLL中,我不能捕捉到错误)。 能给我一个上面代码片段的实现示例吗

我深入搜索,只发现了类似的问题,但没有人能帮我。
我是来澄清的,谢谢你的建议

嗯,我不知道您已经完成了多少封送处理,所以我假设您确实为
FirstEvent
SecondEvent
数据类型在C#中创建了二进制兼容类型

对于函数指针,只需
IntPtr

在所有这些之后(如果您没有创建二进制兼容类型,我将对此进行扩展),您所要做的就是创建一个本身与二进制兼容的委托:

delegate void FirstEventListener(ref FirstEvent firstEvent, IntPtr userData);
delegate void SecondEventListener(ref SecondEvent secondEvent, IntPtr userData);
然后,您可以为实际的处理程序创建一个委托实例,并使用
[Marshal.GetFunctionPointerForDelegate](http://msdn.microsoft.com/en-us/library/at4fb09f.ASPX)
获取指针(如
IntPtr


请记住,只要可以调用回调,就要保持该委托实例的活动状态(即,保留对它的引用)。

您没有提到您遇到了什么问题……对不起,我取消了聚会。我将编辑帖子来回答您的问题。您是否保留处理程序的委托实例,直到不再需要回调?如何完成?我看到一些C++的例子,但我认为这不是重点(我想WONG)我能举个小例子吗?谢谢,我会测试和看!!如果我不能解决这个问题,我会发布一些我的c#解决方案。解决了非常感谢,我犯了一个严重的错误。这两个结构(FirstEvent和SecondEvent)不是由ref创建的。再次感谢!
delegate void FirstEventListener(ref FirstEvent firstEvent, IntPtr userData);
delegate void SecondEventListener(ref SecondEvent secondEvent, IntPtr userData);