Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.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# 函数指针作为COM方法的参数 我在C++中创建了C++应用程序中的COM服务器。现在我必须向COM对象添加一个方法,它的一个参数必须是回调函数的函数指针。C++原始函数看起来是这样的: typedef int (__stdcall *tCallBackFunc)(int Param); void MyFunc(void* CallBackFunc) { int Param; //some code ((tCallBackFunc)(CallBackFunc))(Param); //call callback function }_C#_C++_Com - Fatal编程技术网

C# 函数指针作为COM方法的参数 我在C++中创建了C++应用程序中的COM服务器。现在我必须向COM对象添加一个方法,它的一个参数必须是回调函数的函数指针。C++原始函数看起来是这样的: typedef int (__stdcall *tCallBackFunc)(int Param); void MyFunc(void* CallBackFunc) { int Param; //some code ((tCallBackFunc)(CallBackFunc))(Param); //call callback function }

C# 函数指针作为COM方法的参数 我在C++中创建了C++应用程序中的COM服务器。现在我必须向COM对象添加一个方法,它的一个参数必须是回调函数的函数指针。C++原始函数看起来是这样的: typedef int (__stdcall *tCallBackFunc)(int Param); void MyFunc(void* CallBackFunc) { int Param; //some code ((tCallBackFunc)(CallBackFunc))(Param); //call callback function },c#,c++,com,C#,C++,Com,我需要添加MyFunc作为COM对象方法。VS VC++Add Method dialog为COM方法参数提供了一些预定义类型,如int*或bstr,我尝试将CallBackFunc参数定义为int*类型,但无法在C中使用: public delegate int tCallBackFunc(int Param); ... tCallBackFunc cb; //I will initialize it when it is compiled MyCOMObject.MyFunc(cb); /

我需要添加MyFunc作为COM对象方法。VS VC++Add Method dialog为COM方法参数提供了一些预定义类型,如int*或bstr,我尝试将CallBackFunc参数定义为int*类型,但无法在C中使用:

public delegate int  tCallBackFunc(int Param);
...
tCallBackFunc cb; //I will initialize it when it is compiled
MyCOMObject.MyFunc(cb); //cannot find any way to cast cb to "ref int"

我使用错误的方法,有一种快速声明函数指针作为C++ COM对象方法的参数,然后在C?< /P > < P>中使用COM方式使参数成为接口指针,并使接口声明回调函数。Frederik回答的

< P> + 1。< /P> @迈克尔:这将证明比你想象的解决方案容易得多。 尤其是

对象生命周期 过程边界 线程安全公寓边界,低 标准一致性转换函数指针很快进入未定义行为的领域。你为什么要担心?如果编译器更新引入了另一种优化,使旧的不一致代码中断,则必须考虑标准一致性
听起来不是一个简单的解决方案,我将不得不创建一个接口,然后在C中使用它。我寻找最快的方法,我找到了一些文章如何在C中使用EnumWindows API。它需要回调函数,如果可能的话,我可以使用相同的方法,但我不能通过[DllImport]声明重新声明COM方法Ok,你能给我一些链接来演示如何在C++中创建接口来支持回调然后从C中使用它吗?我在谷歌上搜索,但没有找到好文章,可能是我使用了错误的关键字,因为我不知道使用您推荐的解决方案需要什么。我担心它会花很多时间,如果我用C++ [DLLLL]来代替COM。我没有样本,但是它很简单:它只是一个COM接口。它非常类似于源接口IDL/COM术语,可以帮助您搜索相关示例。但实际上,使用回调接口比实际的COM源接口简单得多;当从诸如VB之类的语言中使用事件时,COM技术实际上只帮助向事件添加“语法糖”,因为它们将作为常规事件公开。顺便说一句,您可能对此感兴趣。我从这里开始:C似乎很好地包装和处理连接点机制。@KenBrittain Thx!`@Michael对于记录源接口和事件接收器的定义是指连接点的相同技术