1

デリゲートを C++ メソッド コードに渡そうとしています。

#pragma unmanaged
void login(char *uname, void (*cb)() )
{
  if ( strcmp(uname, "test")==0)
  {
      printf("Correct!\n");
      cb();
  }
  else
  {
      printf("False\n");
  }
}
#pragma managed
public ref class log
{
    public: delegate void successdelg();
    public: static void logme(String ^s, successdelg ^success)
    {
        login( (char*)(void*)Marshal::StringToHGlobalAnsi(s), success );
    }
};

しかし、次のエラーが表示されます:「エラー C2664: 'login' : パラメータ 2 を 'log::successdelg ^' から 'void (__cdecl *)(void)' に変換できません」

通常、デリゲートなしでメソッドを C++ 関数に渡すだけでこのエラーを回避できますが、これを C# アプリケーションから C++ DLL にメソッドを渡す C# プロジェクトを参照するライブラリとして使用しています。

4

1 に答える 1

1

Marshal.GetFunctionPointerForDelegate メソッドを使用します。この関数呼び出しはこのデリゲートの参照カウンターを追加しないため、コールバック関数が使用されるときは常に、このメソッドに渡されたデリゲート インスタンスを有効に保ちます。

于 2012-10-05T16:58:49.847 に答える