2011-10-27 5 views
0

私はいくつかのDLLファイルを持っています。これは、名前が "ABSDefaultCallback"であるいくつかのメソッドを含んでいます。だから私はこのようにこのメソッドを割り当てます。C#でアドレスを取得する方法は、delegeteからですか?

IntPtr hMod = LoadLibrary("bsgui.dll"); 
IntPtr pAddr = GetProcAddress(hMod, "ABSDefaultCallback"); 
op.Callback = pAddr; 

完璧に動作します。しかし、私は "ABSDefaultCallback"を除いて "コールバック"という名前の私自身のメソッドを呼び出したい。私はこのようなことをやろうとしています。

DELEGATE_TestFunc fred = new DELEGATE_TestFunc(Callback); 
void* pfred = Marshal.GetFunctionPointerForDelegate(fred).ToPointer(); 
op.Callback = (IntPtr)pfred; 

しかし、これは完全には機能しません。私の問題を解決するには?ありがとうございました。

+0

おそらく呼び出し規則を。実行時にカスタムデリゲートを発行するか、ILで作成する必要があります。 – leppie

答えて

1

私はあなたがp/Invokeを介してやっていることすべてに対して正しい署名を持っていると仮定しています。そうしないと、最初に修正する必要があります。

this articleによれば、代理人がガベージコレクションされているという問題が発生している可能性があります。

デリゲートでGCHandle.Allocを使用すると、ガベージコレクションされない参照を作成できます。

static void DemonstrateCallBack_With_GCHandle() 
{ 
    var callback_delegate = new CallBack(CallBackFunction); 

    GCHandle gch = GCHandle.Alloc(callback_delegate); 
    IntPtr intptr_delegate = 
     Marshal.GetFunctionPointerForDelegate(callback_delegate); 

    PerformActionWithCallBack(intptr_delegate); 

    gch.Free(); 
} 

これはあなたのために働いて終了した場合、私はあなたがIDisposableを実装するオブジェクトでGCHandle.Allocgch.Freeをラップ示唆し、おそらくSafeHandleを使用してに見えると思います。

この記事では、関連する詳細の一部を提供するかもしれない:http://obiwanjacobi.blogspot.com/2007/05/robust-pinvoke-for-windows-midi-api.html

+0

'PerformActionWithCallBack'に' GCHandle'を渡してはいけませんか? – leppie

+0

@leppie:このコードは記事のものです。私は情報を伝えています。あなたが言ったことは私には完璧な意味があるようですが、それは記事がしたものではありません。私は実際にどのようにこの仕組みのメカニズムを知っていない、私はちょうど提出に問題をGoogleにしようとしています:) –

+0

どちらも私は:)私は通常、私はすべきですが、ポインタをピン止めしないでください。 – leppie

関連する問題