アプリ版:「スタンプのみでお礼する」機能のリリースについて

VB.NET デリゲートへのコールバック関数の設定

VB.NETとネイティブC/C++ DLL間でのコールバックについての質問です。
ネイティブDLLからVOID*で得られるコールバック関数をVB.NETのデリゲートに
登録するには、どのようにコーディングすればよいのでしょうか。

---------- VB.NETソース ----------

Public Delegate Sub CALLBACK_00(ByVal Arg1 As Integer, ByVal Arg2 As Integer)
Declare Function FuncPtrGet Lib "test.dll" () As CALLBACK_00
Dim Func As new CALLBACK_00(FuncPtrGet());

2行目は、実際にはVOID*が帰るDLL関数です。
3行目がコンパイルで通りません。AddressOfで関数を指定するようにメッセージが出ます。

A 回答 (1件)

えーっと,Visual BasicではなくVisual Basic.NET (=Visual Basic 7.0 or 7.1) なのですか?


それだと,安全な呼び出し方法は存在しません。
C等で呼び出しようのヘルパーを用意することになると思います。


Visual Basic 8.0かそれ以降であるならば,
MSDN: Marshal.GetDelegateForFunctionPointer メソッド (System.Runtime.InteropServices)
http://msdn.microsoft.com/ja-jp/library/system.r …
という,正規の方法があります。

Declare Function FuncPtrGet Lib "test.dll" As IntPtr
に変更後,
Dim Func As CALLBACK_00 = DirectCast(Marshal.GetDelegateForFunctionPointer(FuncPtrGet(), GetType(CALLBACK_00)), CALLBACK_00)
とすることで,Funcは適切に設定されますので,安全にメソッドを呼び出すことが来ます。
    • good
    • 0
この回答へのお礼

VB.NET 2005以降のVBなら方法があるということですね。
ありがとうございました。

お礼日時:2010/10/27 17:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!