2012-07-27 99 views
4

我有一个非托管的C++应用程序作为COM客户端和C#COM服务器。 现在我想COM服务器可以调用一个C++函数。将C++函数指针设置为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客户端具有不同的函数名称。

有什么建议吗?

+0

在整个过程的边界上传递指针看起来很奇怪,你已经提到了它。也许你应该将C++回调包装在COM接口中,并将ICallbackInterface指针传递给C#?仍然会有数据传递的问题。一个小问题 - 在你的C#回调委托声明中,你应该为字符串使用[MarshalAs(UnmanagedType.BStr)]属性。 – 2012-07-27 08:09:28

回答

0

一种方法是通过__declspec(dllexport)公开您的C++函数,然后为这些函数编写P/Invoke。现在你可以使用这些P/Invoke函数作为代表。

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

+0

以我的理解,使用dll导出是C#可以从C++调用回调的唯一方法。 :( – ArdenZhao 2012-07-28 03:35:25