お世話になります。VB.NETにてソフト制作をしています。
今回、DLLの関数を利用する事になりましたが、うまく宣言できず困っています。御教授お願いします。
DLLはC++で作られており変更できません。
DLLは通信を補助するための物で、初期設定の関数と通信開始の物があります。
初期設定用を呼んだ後、通信開始を行なうようです。
説明には下記のような内容がありました。
【初期設定用】
initial(DWORD ip,
LPNOTIFICATIONFUNC notificationFunc);
ip=相手先のipアドレス
notificationFunc=コールバック関数へのポインタ
コールバック関数
WINAPI *PNOTIFICATIONFUNC(
DWORD id,
BYTE bySet1,
BYTE bySet2,
BYTE bySet3,
BYTE *data,
DWORD datasize
);
【通信開始用】
start(DWORD ip
BYTE *code
);
ip=通信元のipアドレス
code=相手のコードの格納アドレス
以上
全体的にどう宣言したら良いのか解りません。
(特にコールバック関数の宣言と、ポインタへの引数の渡し方)
すみませんが、御教授お願いします。
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/defa …
1050YENさん、的確な回答ありがとうございます。
動かすことが出来ました。どうもポインタに引き当てるのを難しく考えすぎてたようです。
追加で質問をお願いしたいのですが、下のような場合、文字列を関数のポインタ(data)に引き当てるにはどうしたら良いでしょうか?
TEST(
DOWRD id
BYTE *data
);
よろしくお願いします。
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))
で渡りませんか?
(かなり自信がないですが、、)
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))
っていう感じだと思います。
No.2
- 回答日時:
すいません。
ミスりました。
[DWORD id]
[DWORD datasize]
に該当する部分をintegerにしておいてください^^;;
でも先ほど述べたように、さらに型を変更する必要があるかもしれません。
今回の「integerにしておいてください」というのは、VB6感覚で書いてしまったためです^^;;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA-DLLの引数受け渡しについて
-
C#でstringをポインタとして渡す
-
nullと""、\\0とEOFの違いにつ...
-
%dなどの違い
-
C#のGUIからサーバー側のPHPへ...
-
シリアル通信で0x00を送信した...
-
引用符と二重引用符
-
文字コードによる表記
-
Excelシートを固定長のテキスト...
-
文字列型の一般的な変数名は?
-
C言語の勉強しています。すみま...
-
WSH(VBS)でJSONの文字列を読み...
-
C++で入力した文字列から数字を...
-
for文での配列の指定について(...
-
16進数を2文字ずつ配列に格納し...
-
数字の入った配列をファイルへ...
-
アルファベットの出て来た回数
-
C言語についてです学籍番号、名...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
【c++】文字列の操作
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プログラムによく出てくるst...
-
C#でstringをポインタとして渡す
-
nullと""、\\0とEOFの違いにつ...
-
WSH(VBS)でJSONの文字列を読み...
-
VB6.0でのバイナリデータの扱い...
-
TCL言語で文字列検索方法を教え...
-
C++で入力した文字列から数字を...
-
シリアル通信で0x00を送信した...
-
16進数を2文字ずつ配列に格納し...
-
char型配列の最大要素数
-
[C++]WCHARの1文字目しか表示で...
-
_tcscpy_s(wcscpy_s)の第二引数...
-
構造体→文字列→構造体 をする方法
-
%dなどの違い
-
数字の入った配列をファイルへ...
-
c#で他のアプリの文字入力フォ...
-
引用符と二重引用符
-
Shift_JIS(16進)を文字に変換す...
-
CSVファイルの「”」について
-
AnsiStringについて
おすすめ情報