DLLからのデータ引渡し

[戻る]
かず 2009/07/02(木) 11:14:06
Visual Studio 2005を使って、(VBアプリ) + (Cで作ったDLL) のソフトを作っていま
す。
DLLから複数のバイトデータをVBアプリに渡したいのですが、ByRefを使って受け皿とな
るバイト配列を渡しているのですがうまく引き渡せません。
DLL側で確認すると、ByRefで指定したアドレスが0となっており正しく渡っていない
ようです。

Functionの宣言は次のようにしています。

Declare Auto Function vbRead Lib "test.dll" Alias "vbRead" (ByVal param1 As 
Integer, ByVal param2 As Integer, ByRef dat() As Byte) As Integer

呼び出し側は、
Dim result as Integer
Dim dat(100) as Byte
 result = vbRead(0, 0, dat)

のようにしています。
マネージド上のメモリ管理上なにか間違っていると思うのですが、よく判りません。
ヒントをいただけませんでしょうか?

よろしくお願いします。

aetos 2009/07/02(木) 11:30:50
C 側の関数の宣言はどうなってます?

かず 2009/07/02(木) 14:34:50
aetosさん 早々に返信いただきありがとうございます。

DllExport int __stdcall vbRead( int No, int Cnt, BYTE *outBuff );

このようになっています。

「ByRefで指定したアドレスが0となっており」というのは私の見間違いのようです。
なんらかのアドレスが入ってきていますが、その先のメモリは期待値ではありません。

かず 2009/07/02(木) 15:38:18
[[解決]]
すみません。なんとか動いたようです。

Byte配列の引渡し方が良くなかったようです。
Functionの宣言のByRefの所、dat() を datとした点と、呼び出し時に dat を
dat(0) とした2点の変更で動きました。

Declare Auto Function vbRead Lib "test.dll" Alias "vbRead" (ByVal param1 As 
Integer, ByVal param2 As Integer, ByRef dat As Byte) As Integer

呼び出し側は、
Dim result as Integer
Dim dat(100) as Byte
 result = vbRead(0, 0, dat(0))

VBはあまり経験がなく上記の方法でいいのかどうか????

まずは動作しましたので、解決としますが、なにかアドバイスありましたら
教えてください。

ありがとうございました。

YuO [E-Mail] 2009/07/02(木) 15:46:10
MSDN: さまざまな型の配列のマーシャリング
http://msdn.microsoft.com/ja-jp/library/hk9wyw21(VS.80).aspx
の,TestArrayOfIntsがほぼそのまま使えますね。

datは,
<[In], Out> ByVal dat As Byte()
とするのがよいと思います。
# 引数名を見る限り,実は<Out>でいいのかも。

かず 2009/07/02(木) 17:52:38
YuOさん、アドバイスありがとうございます。

アドバイスの内容を勉強しておきます。

古いスレッドには追加発言できません。