c# - 将 C++ 函数指针设置为 C# 委托(delegate)

标签 c# c++ callback com-interop

我有一个非托管的 C++ 应用程序作为 COM 客户端和一个 C# COM 服务器。 现在我希望 COM 服务器可以调用 C++ 函数。

C#:

[ClassInterface(ClassInterfaceType.AutoDual)]
public class SomeType
{
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    public delegate void DeleCallBack(string info);
    public DeleCallBack CallBack;
    public void  SetCallBack(ref IntPtr ptr)
    {
        CallBack = (DeleCallBack)Marshal.GetDelegateForFunctionPointer(ptr, typeof(DeleCallBack));
    }
}

C++:

HRESULT hr = E_FAIL;
CComPtr<WindowsFormsApplicationVC9::_SomeType> spTmp;
hr = spTmp.CoCreateInstance(__uuidof(WindowsFormsApplicationVC9::SomeType));
if (SUCCEEDED(hr))
{
    spTmp->SetCallBack(OnCallBack);
}
void  OnCallBack(BSTR info)
{
    // c++ function call...;
}

我不确定将 OnCallBack 函数指针传递给 SetCallBack 是否正确。 我注意到一些调用 GetDelegateForFunctionPointer 的示例应该 GetProcessAddress 来获取函数指针地址,但我不能这样做,因为可能有不同的 c++ COM 客户端具有不同的函数名称。

有什么建议吗?

最佳答案

一种方法是通过 __declspec(dllexport) 公开您的 C++ 函数,然后简单地为这些函数编写 P/Invoke。现在您可以将这些 P/Invoke 函数用作委托(delegate)。

从本质上讲,这本质上是 GetProcAddress 方法,但 C# 编译器使它在语法上更适合您。

关于c# - 将 C++ 函数指针设置为 C# 委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11682853/

相关文章:

Angular2 - 无法读取嵌套调用中未定义的属性 'subscribe'

c# - 自定义多线程循环

c# - 显示消息对话框的方法

c# - 在 .NET 中有效地生成一个非常大的 Excel 文件?

c++ - "Connection was broken"UDT 错误(基于 UDP 的数据传输协议(protocol))

c - 如何传递 extern(C) 函数文字?

c# - 我怎样才能从这个 C# 代码中获取基本文件名?

c++ - 查找数组中第二/第三小元素的递归方法

c++ - AVL 树插入 - 访问冲突读取位置(无法读取内存)

javascript - 设置回调数组并尝试使用数组索引作为回调中的值