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