• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:コールバック関数)

DLLの関数宣言についての質問

このQ&Aのポイント
  • VB.NETにてDLLの関数を利用する方法について質問です。
  • 特に初期設定用の関数と通信開始用の関数をどのように宣言すれば良いか教えてください。
  • DLLはC++で作られており変更できないため、注意が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

以下はあくまでサンプルです。 [DWORD id] [DWORD datasize] に該当する部分をLongで切っていますが、場合によっては型を変更する必要があります。 .NETでのコールバックのサンプルとしてだけと思ってください。 このサンプルは標準モジュールにコールバック関数を書いた場合用です。 もしクラスに書くのであれば、コールバック関数を Public Function PNOTIFICATIONFUNC から Public Shared Function PNOTIFICATIONFUNC としてください。 'APIのコールバックする関数の型をここで宣言する '下のコールバック関数<PNOTIFICATIONFUNC>の宣言とセットになります。 Public Delegate Function CallBackFuncPNOTIFICATIONFUNC( _         ByVal id As Long, _         ByVal bySet1 As Byte, _         ByVal bySet2 As Byte, _         ByVal bySet3 As Byte, _         ByRef data As Byte, _         ByVal datasize As Long _       ) As Boolean Module Module1   'APIの宣言   Private Declare Sub initial Lib "DLL名" _     ( _       ByVal ip As String, _       ByVal lpFunc As CallBackFuncPNOTIFICATIONFUNC _     )   Private Declare Sub start Lib "DLL名" _     ( _       ByVal ip As String, _       ByRef code As Byte _     )   '実行   Public Sub Main()     Dim strIP As String     Dim bytCode As String     strIP = "192.168.0.1"     Call initial(strIP, AddressOf PNOTIFICATIONFUNC)     Call start(strIP, bytCode)   End Sub   'コールバック関数   Public Function PNOTIFICATIONFUNC( _         ByVal id As Long, _         ByVal bySet1 As Byte, _         ByVal bySet2 As Byte, _         ByVal bySet3 As Byte, _         ByRef data As Byte, _         ByVal datasize As Long _       ) As Boolean     'サンプルは戻り値がBooleanになっていますが、そちらがかかれている情報だけでは、     'これが有効かどうかわかりません。     'ただ、よくコールバックを利用したDLLの作りとして、コールバックの最後の値まで行く前に、     'ステータスをFALSEで返すと、コールバック中断処理が働くものが多いように思ったので、     '勝手にBooleanを利用しています。   End Function End Module

参考URL:
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/cpguide/html/cpconusingcallbackfuncti
que_sera_sera
質問者

お礼

1050YENさん、的確な回答ありがとうございます。 動かすことが出来ました。どうもポインタに引き当てるのを難しく考えすぎてたようです。  追加で質問をお願いしたいのですが、下のような場合、文字列を関数のポインタ(data)に引き当てるにはどうしたら良いでしょうか? TEST(    DOWRD id    BYTE  *data   ); よろしくお願いします。

その他の回答 (4)

回答No.5

1バイトだけでなく、複数バイトが渡るのならば、APIの受けはchar*になっているのかな? dim bytData as byte を dim bytData() as byte にして bytCode = System.Text.Encoding.Unicode.GetBytes("文字列" & vbNullChar) Call TEST(strID,bytData(0)) で渡りませんか? (かなり自信がないですが、、)

que_sera_sera
質問者

お礼

1050YEN さん。 お付き合いありがとうございました。 大変参考になりました。 また機会がありましたら、よろしくお願いします。

回答No.4

>文字列を送りたい場合はどうなるんでしょうか? 複数の文字単語ということですか? VB6なら、領域を宣言しないバイト配列に文字列をつっこんで、配列の先頭を渡すだけなのですが、、、 .NETでやったことないですが、後で実験してみます。 たぶんエンコーディングするのかな?

回答No.3

新たに質問来ましたね^^; 何となくの推測で書くので、はずしていたらすいません BYTE* => unsinged char * と考えて、半角1バイトの文字のやりとりが行われるのですよね? であれば、文字コードを使えばできると思います。 ------------------------- TEST(     DOWRD id     BYTE  *data   ); ------------------------- ↓↓↓↓↓↓↓↓↓ '宣言 Private Declare Sub TEST Lib "DLL名" _   ( _     ByVal id As String, _     ByRef data As Byte _   ) 'メイン dim strID as string = "ああ" '初期値 dim bytData as byte 'bytDataに、文字値を渡す必要がある時 bytCode = Asc("a") '実行 Call TEST(strID,bytData) 'bytDataの文字値を読む時 msgbox(Chr(bytData)) っていう感じだと思います。

que_sera_sera
質問者

補足

文字列を送りたい場合はどうなるんでしょうか?

回答No.2

すいません。 ミスりました。 [DWORD id] [DWORD datasize] に該当する部分をintegerにしておいてください^^;; でも先ほど述べたように、さらに型を変更する必要があるかもしれません。 今回の「integerにしておいてください」というのは、VB6感覚で書いてしまったためです^^;;

関連するQ&A