函数指针作为COM方法的参数

时间:2011-10-24 12:20:59

标签: c# 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
}

我需要添加MyFunc作为COM对象方法。 VS VC ++“添加方法”对话框为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#中使用它?

2 个答案:

答案 0 :(得分:7)

COM方式是使参数成为接口指针,并让接口声明回调函数。

答案 1 :(得分:1)

为Frederik的答案+1。

<迈克尔:迈克尔:这比你想象的解决方案要容易得多。 特别是

  • 对象生命周期
  • 流程边界
  • 线程安全(公寓边界,IOW)
  • 标准一致性(转换函数指针快速进入未定义行为的域)。 为什么你应该担心吗?如果编译器更新引入了另一种使旧(不符合)代码中断的优化,则标准一致性必须引起您的注意