4

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 クライアントが存在する可能性があるため、それを行うことはできません。

なにか提案を?

4

1 に答える 1

0

これを行う 1 つの方法は、C++ 関数を 経由__declspec(dllexport)で公開し、それらの関数に対して P/Invoke を記述するだけです。これらの P/Invoke 関数をデリゲートとして使用できるようになりました。

本質的にはこれがGetProcAddressアプローチですが、C# コンパイラは構文的に優れています。

于 2012-07-27T08:55:48.260 に答える