VB.netでwin32apiを呼び出したが変数にデータが正しくセットされない
vb6.0のプログラムをvb.netに移植作業しています。
vb.netで機器との通信を行うためwinapi32で作られたドライバdllをインポートしたのですが受信データが正常に受け取れません。もう1週間も悩み続けています。
詳しい方お助けください。
//win32api側//
DWORD Receive(HANDLE handle,PBYTE pbReceiveBuffer,WORD wBufferLength, _
PWORD pwReceiveLength,PDWORD pdwErrCode);
//VB側//
<DllImport("Des_DLL", CharSet:=CharSet.Auto)> _
Public Function Receive(ByVal hPath As Intptr, ByRef ReceiveBuffer As IntPtr, _
ByVal ReceiveBuffLength As Ushort ByRef ReceiveLength As Ushort, _
ByRef lErrCode As Uint) As Uint
End Function
Dim rd_buf(1018) As Byte
Dim rbf_l As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(rd_buf)) 'アンマネージメモリ 確保
Marshal.Copy(rbf_l, rd_buf, 0, rd_buf.Length) 'アンマネージメモリからマネージメモリにコピー
ret = Receive(Path, rbf_l, rdbuffer_length, rd_length, ErrCode)
Call des_datawrite(rd_buf, rd_length, 2) ' 受信データの書き込み
For i = 0 To rd_length - 1 ' 受信データセット
DES.rd_buf(DES.rd_cnt) = rd_buf(i)
DES.rd_cnt = DES.rd_cnt + 1
Next i
DesRD_Normal = True
Marshal.FreeCoTaskMem(rbf_l)
End Function
Receive()は機器からの情報吸い上げレスポンス関数です。
Public Sub des_datawrite(ByVal wt_data() As Byte, ByVal length As Integer, ByVal Mode As Integer)
Dim free_num As Integer
Dim i As Integer
Dim cv_buf As String
cv_buf = ""
For i = 0 To length - 1
cv_buf = cv_buf & Microsoft.VisualBasic.Right("00" & Hex(wt_data(i)), 2) & " "
Next i
free_num = FreeFile()
FileOpen(free_num, GetAppPath() & DES_DATA, OpenMode.Append)
If Mode = 1 Then
Print(free_num, "[<-sd(" & DateTime.Now.ToString("yyyyMMddHHmm") & ")]" & Mid (cv_buf, 1, Len(cv_buf) - 1))
ElseIf Mode = 2 Then
ElseIf Mode = 2 Then
Print(free_num, "[->rd(" & DateTime.Now.ToString("yyyyMMddHHmm") & ")]" & Mid(cv_buf, 1, Len(cv_buf) - 1))
End If
FileClose(free_num)
End Sub
No.2
- 回答日時:
一つ前の回答の
<DllImport・・・
のところは、そちらの環境に合わせてくださいね。
(こちらの環境の内容のまま載せてしまいました・・・。(^^; 一度書き込みしちゃうと修正できないんですよね・・・)
No.1ベストアンサー
- 回答日時:
「正しくセットされない」ということですが、正しくセットされる/されない以前に、正しく実行できないのではないですか?
C 側が
PBYTE pbReceiveBuffer
となっているのに、VB 側の Recieve の宣言が
ByRef ReceiveBuffer As IntPtr
となっていると、rbf_l に格納されている値(つまり、Marshal.AllocHGlobal で確保したメモリのアドレス ) を渡したいのに、rbf_1 自身のアドレスを渡してしまいます。
rbuf_1 って、ポインタですから、32 bit 環境なら 4 バイトしかないワケで、4バイトしか確保されていないところに1018 byte ものデータを書き込もうとするとメモリアクセス違反が起きるはずです。
ByVal ReceiveBuffer As IntPtr
にしてみてください。
あと、たぶん、Marshal.Copy と Recieve の順番が逆ですね。
それか、Marshal.AllocHGlobal、Marshal.Copy とかは使用せずに、
<DllImport("D:\Nobuyuki\Projects\Test\VcDllTest\Debug\VcDllTest.dll", CharSet:=CharSet.Auto)> _
Public Function Receive(ByVal hPath As IntPtr, ByVal ReceiveBuffer() As Byte, ByVal ReceiveBuffLength As UShort, ByRef ReceiveLength As UShort, ByRef lErrCode As UInt32) As UInt32
End Function
と宣言しておいて、
Dim ret As Integer = Receive(Path, rd_buf, rd_buf.Length, rd_length, ErrCode)
とするのがシンプルで良いような気もします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) このマクロの説明文を教えてほしいです。 1 2023/01/12 09:17
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) フォルダの場所を可変にしたいです(マクロ) 4 2023/05/11 10:00
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Visual Basic(VBA) 空白のセルを変更しようとした時(アクティブセル)に インプットボックスを5回出す インプットボックス 1 2023/03/14 11:01
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
c言語のポインタへの文字列入力...
-
Accessで、メモリを開放するタ...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ビットをローテートするプログ...
-
配列の添え字の最大数とは?
-
malloc呼び出し時のセグメンテ...
-
malloc関数の使い方
-
OpenCV cvLoadImageについて
-
プログラムが途中で強制終了し...
-
C++のnewで確保したメモリーの...
-
LPTSTR型の変数に文字を格納
-
mallocについて
-
C++で、メンバもヒープに確保さ...
-
void*型のデータサイズ
-
ポインタのポインタの初期化法
-
DLLのマルチスレッドの動作につ...
-
stringの最大サイズ
-
GlobalAlloc について
-
mallocで確保するメモリの領域...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
mallocについて
-
c言語のポインタへの文字列入力...
-
allocってなんですか?
-
newしないオブジェクトについて
-
ヒープメモリの解放について
-
C++で、メンバもヒープに確保さ...
-
MSDNがgethostbynameではなくge...
-
プログラムが途中で強制終了し...
-
配列の添え字の最大数とは?
-
Accessで、メモリを開放するタ...
-
malloc呼び出し時のセグメンテ...
-
ヒープ領域の限界値設定
-
スタック破壊の上手な見つけ方...
-
C言語 mallocとfreeについて
-
指定したメモリアドレスの値の...
-
stringの最大サイズ
-
16進ダンプのプログラム
-
入れ子になった構造体について
-
64ビットと32ビットの違い
-
free関数で動作が止まる
おすすめ情報