• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VB.netでのwin32api呼び出し)

VB.netでのwin32api呼び出し

このQ&Aのポイント
  • VB.netでwin32apiを呼び出し、正しくデータをセットできない問題について
  • vb.netで機器との通信を行うためwinapi32で作られたドライバdllをインポートしたが、受信データが正常に受け取れない。
  • VB6.0のプログラムをvb.netに移植し、win32apiを使用して通信を行っているが、受信データの取得に問題がある。お助けください。

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

  • ベストアンサー
回答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) とするのがシンプルで良いような気もします。

ikaruga817
質問者

お礼

ありがとうございます。まさにその通りでした。 まだ.netの事があまり分かって無く勉強する日々です 今回は勉強になりました。

その他の回答 (1)

回答No.2

一つ前の回答の <DllImport・・・ のところは、そちらの環境に合わせてくださいね。 (こちらの環境の内容のまま載せてしまいました・・・。(^^; 一度書き込みしちゃうと修正できないんですよね・・・)

関連するQ&A