- ベストアンサー
DLLの関数宣言についての質問
- VB.NETにてDLLの関数を利用する方法について質問です。
- 特に初期設定用の関数と通信開始用の関数をどのように宣言すれば良いか教えてください。
- DLLはC++で作られており変更できないため、注意が必要です。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
以下はあくまでサンプルです。 [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
その他の回答 (4)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
1バイトだけでなく、複数バイトが渡るのならば、APIの受けはchar*になっているのかな? dim bytData as byte を dim bytData() as byte にして bytCode = System.Text.Encoding.Unicode.GetBytes("文字列" & vbNullChar) Call TEST(strID,bytData(0)) で渡りませんか? (かなり自信がないですが、、)
お礼
1050YEN さん。 お付き合いありがとうございました。 大変参考になりました。 また機会がありましたら、よろしくお願いします。
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
>文字列を送りたい場合はどうなるんでしょうか? 複数の文字単語ということですか? VB6なら、領域を宣言しないバイト配列に文字列をつっこんで、配列の先頭を渡すだけなのですが、、、 .NETでやったことないですが、後で実験してみます。 たぶんエンコーディングするのかな?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
新たに質問来ましたね^^; 何となくの推測で書くので、はずしていたらすいません 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)) っていう感じだと思います。
補足
文字列を送りたい場合はどうなるんでしょうか?
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
すいません。 ミスりました。 [DWORD id] [DWORD datasize] に該当する部分をintegerにしておいてください^^;; でも先ほど述べたように、さらに型を変更する必要があるかもしれません。 今回の「integerにしておいてください」というのは、VB6感覚で書いてしまったためです^^;;
お礼
1050YENさん、的確な回答ありがとうございます。 動かすことが出来ました。どうもポインタに引き当てるのを難しく考えすぎてたようです。 追加で質問をお願いしたいのですが、下のような場合、文字列を関数のポインタ(data)に引き当てるにはどうしたら良いでしょうか? TEST( DOWRD id BYTE *data ); よろしくお願いします。