【问题标题】:Function pointer as a parameter of COM method函数指针作为 COM 方法的参数
【发布时间】:2011-12-14 02:24:28
【问题描述】:

我用 C++ 创建了 COM 服务器,用于 C# 应用程序。现在我必须向我的 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# 中使用它?

【问题讨论】:

    标签: c# c++ com


    【解决方案1】:

    COM方式是把参数做成接口指针,接口声明回调函数。

    【讨论】:

    • 听起来不是一个简单的解决方案,我必须创建一个接口,然后在 C# 中使用它。我寻找最快的方法,我发现一些文章如何在 C# 中使用 EnumWindows API(它需要回调函数),如果可能的话,我可以使用相同的方式,但我不能通过 [ 声明(重新声明)COM 方法DLLImport]
    【解决方案2】:

    +1 为 Frederik 的回答。

    @Michael:这将比您想象的解决方案容易得多。 尤其是

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

    【讨论】:

    • 好的,你能给我一些链接来演示如何在 C++ 中创建接口以支持回调,然后在 C# 中使用它吗?我用谷歌搜索但没有找到好的文章,可能是我使用了错误的关键字,因为我不知道我需要什么才能使用您推荐的解决方案。恐怕这会花费很多时间,如果是这样,我将通过 [DllImport] 而不是 COM 使用我的 C++ DLL。
    • 我没有示例,但它很简单:它只是一个 COM 接口(反过来:你将它传递给“服务器”以打电话给)。它与可以帮助您搜索相关示例的源接口(IDL/COM 术语)非常相似。 (但在实践中,使用回调接口比实际的 COM 源接口简单得多;COM 技术实际上只有助于在从诸如 VB 之类的语言中使用事件时向事件添加“语法糖”,因为它们将作为常规事件公开。顺便说一下,您可能对此感兴趣。
    • 我将从这里开始:msdn.microsoft.com/en-us/library/1hee64c7.aspx C# 似乎很好地包装和处理了连接点机制。
    • @KenBrittain 谢谢! `` @Michael 为记录源接口和事件接收器指的是相同的连接点技术
    猜你喜欢
    • 2021-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    • 2011-02-04
    相关资源
    最近更新 更多