我有一个非托管的 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/