COM クライアントと C# COM サーバーとしてアンマネージ C++ アプリケーションを使用しています。今、私は 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 クライアントが存在する可能性があるため、それを行うことはできません。
なにか提案を?