2011-10-24 31 views
0

我已经在C++应用程序中使用的C++中创建了COM服务器。现在我必须向COM对象添加一个方法,其中一个参数必须是指向回调函数的函数指针。 C++原始功能如下所示:函数指针作为COM方法的参数

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#中使用它的快捷方式?

回答

7

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

+0

听起来不是一个简单的解决方案,我将不得不创建一个接口,然后在C#中使用它。我寻找最快的方法,我找到了一些如何在C#中使用EnumWindows API的文章(它需要回调函数),如果可能的话,使用相同的方法也可以,但我无法通过[声明](重新声明)COM方法[ DllImport] – Mike

1

+1对于Frederik的回答。

@Michael:它会比你想象中的解决方案容易得多。 特别是随着

  • 对象生存
  • 进程边界
  • 线程安全(公寓边界,IOW)
  • 标准的一致性(铸造函数指针快进未定义行为的结构域)。 为什么你应该担心?标准一致性必须关注你的情况下,编译器更新引入了另一种优化,使您的旧的(不符合标准)代码休息
+0

好的,你可以给我一些链接,演示如何在C++中创建接口来支持回调,然后从C#中使用它?我Google搜索,但没有找到好的文章,可能是我使用了错误的关键词,因为我不知道我需要什么来使用您推荐的解决方案。恐怕会花费很多时间,如果是这样,我将通过[DllImport]而不是COM来使用我的C++ DLL。 – Mike

+0

我没有示例,但它很简单:它只是一个COM接口(以另一种方式_:将它传递给'服务器'来调用_you_)。它与源接口(IDL/COM术语)非常相似,它可能会帮助您搜索相关示例。 (但是在实践中使用回调接口比实际的COM源接口更简单; COM技术实际上只有在从诸如VB之类的语言中消耗它们时才有助于添加“语法糖”,因为它们将作为常规事件公开。顺便提一下, – sehe

+0

我会从这里开始:http://msdn.microsoft.com/en-us/library/1hee64c7.aspx C#似乎很好地包装和处理连接点机制 –