2

DLL に次のようなコードがあります。

int (*callback)(int a, int b);
void mainfunc()
{
    callback(1, 2);
    callback(3, 4);
}

C プログラムからこの DLL にアクセスするには、次のようにしました。

#include <windows.h>

int callback(int a, int b) {return a+b;}

int main()
{
    HANDLE dll = LoadLibrary("test.dll");
    *(void**)GetProcAddress(dll, "callback") = (void*)callback;
    ((void(*))GetProcAddress(dll, "mainfunc"))();
    FreeLibrary(dll);
}

DLL は引き続き C コードですが、メイン プログラムは C# に切り替わりました。関数ポインタの扱い方 そのコードは C# ではどのようになりますか?

4

1 に答える 1

3

callbackはdllのグローバル変数であるため、[1] c#から設定することはできません。

Cからも設定しないでください。コールバックが本当に共有されている場合に必要なのは、SetCallback( MyCallbackType callback )それを設定するような関数です。

しかし、おそらく、関数を mainfunc に渡したいと思うでしょう。

どちらの場合も、これは C# で簡単に実行できます。

// C#
public delegate Int32 Callback( Int32 a, Int32 b );
[DllImport("test.dll")]
static extern void mainfunc( Callback callback );
// Or if you're setting the callback globally, 
[DllImport("test.dll")]
static extern void SetCallback(Callback callback);
[DllImport("test.dll")]
static extern void mainfunc();

お持ち帰りのメッセージは、DllImport が十分にスマートで、かなり近いシグネチャを持つデリゲートを C 関数ポインターに変換できるということです。

[1] では、できるように... dll インジェクションは、これらの線に沿った多くのハックの 1 つを使用することがありますが、他の状況でそれを行うのはあらゆる種類の間違った方法です。

于 2012-09-07T14:55:43.883 に答える