呼び出し元のコンテキストを識別する方法がないコールバック メカニズムを持つ (C) サード パーティ ライブラリを使用しようとしています。私のメイン プロジェクトは C# で、ラッパーは C ライブラリ API を呼び出す C++/CLI プロジェクトです。
この問題を回避するために、Marshal::GetFUnctionPointerForDelegate を使用しようとしています。ここに私のC#コードがあります:
void Init(Handler Callback)
{
// Create a wrapper lambda in case Callback is a non-static method.
instance.CreateBuffers((x, y) => Callback(x, y));
}
次に、C++/CLI コードで次のようにします。
void CreateBuffers(Handler^ Callback)
{
pinCallback = GCHandle::Alloc(Callback);
void (*callback)(int, int) = (void (__stdcall *)(int, int))Marshal::GetFunctionPointerForDelegate(Callback).ToPointer(),
// Use 'callback' in third party library...
}
このすべての問題は、http://msdn.microsoft.com/en-us/library/367eeye0.aspx によると、 Marshal::GetFunctionPointerForDelegate からの関数ポインターは stdcall 関数ですが、私の C コールバックは cdecl です。ここでcdecl互換関数を取得するにはどうすればよいですか?