- ベストアンサー
VB.netでのwin32api呼び出し
- VB.netでwin32apiを呼び出し、正しくデータをセットできない問題について
- vb.netで機器との通信を行うためwinapi32で作られたドライバdllをインポートしたが、受信データが正常に受け取れない。
- VB6.0のプログラムをvb.netに移植し、win32apiを使用して通信を行っているが、受信データの取得に問題がある。お助けください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「正しくセットされない」ということですが、正しくセットされる/されない以前に、正しく実行できないのではないですか? 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) とするのがシンプルで良いような気もします。
その他の回答 (1)
- tsukasa-12r
- ベストアンサー率65% (358/549)
一つ前の回答の <DllImport・・・ のところは、そちらの環境に合わせてくださいね。 (こちらの環境の内容のまま載せてしまいました・・・。(^^; 一度書き込みしちゃうと修正できないんですよね・・・)
お礼
ありがとうございます。まさにその通りでした。 まだ.netの事があまり分かって無く勉強する日々です 今回は勉強になりました。