设置C++;函数指针作为C#委托 我有一个非托管C++应用程序作为COM客户机和C.Y.COM服务器。 现在我希望COM服务器可以调用C++函数。

设置C++;函数指针作为C#委托 我有一个非托管C++应用程序作为COM客户机和C.Y.COM服务器。 现在我希望COM服务器可以调用C++函数。,c#,c++,callback,com-interop,C#,C++,Callback,Com Interop,C#: C++: HRESULT hr=E_失败; CComPtr spTmp; hr=spTmp.CoCreateInstance(u_uidof(WindowsFormsApplicationVC9::SomeType)); 如果(成功(hr)) { spTmp->SetCallBack(OnCallBack); } 回拨无效(BSTR信息) { //C++函数调用… } 我不确定将OnCallBack函数指针传递给SetCallBack是否正确。 我注意到调用GeCuto TeaFoFr

C#:

C++:

HRESULT hr=E_失败;
CComPtr spTmp;
hr=spTmp.CoCreateInstance(u_uidof(WindowsFormsApplicationVC9::SomeType));
如果(成功(hr))
{
spTmp->SetCallBack(OnCallBack);
}
回拨无效(BSTR信息)
{
//C++函数调用…
}
我不确定将OnCallBack函数指针传递给SetCallBack是否正确。 我注意到调用GeCuto TeaFoFrutoToCult的一些示例应该获得PrimeAdvess来获得函数指针地址,但由于不同的函数名可能有不同的C++ COM客户机,所以我不能这样做。
有什么建议吗?

< P>一种方法是通过C++ >函数-*DEXSPEC(DLRouest:< /Cord>)来公开C++函数,然后简单地为这些函数编写P/JavaKE。现在您可以将这些P/Invoke函数用作委托


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

在进程边界上传递指针看起来很奇怪,您已经提到了这一点。也许你应该在COM接口中包上C++回调,然后将ICALBACK接口指针传递给C?不过,数据传递仍然存在问题。一个小注释——在回调委托的C++声明中,应该使用MarshalAs的(unMujdType。bSTR)属性。(
[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));
    }
}
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...;
}