DLLからのデータ引渡し – プログラミング – Home

通知
すべてクリア

[解決済] DLLからのデータ引渡し


かず
 かず
(@かず)
ゲスト
結合: 23年前
投稿: 62
Topic starter  

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
(@aetos)
Noble Member
結合: 4年前
投稿: 1480
 

C 側の関数の宣言はどうなってます?


返信引用
かず
 かず
(@かず)
ゲスト
結合: 23年前
投稿: 62
Topic starter  

aetosさん 早々に返信いただきありがとうございます。

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

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

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


返信引用
かず
 かず
(@かず)
ゲスト
結合: 23年前
投稿: 62
Topic starter  

すみません。なんとか動いたようです。

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
 YuO
(@YuO)
ゲスト
結合: 21年前
投稿: 320
 

MSDN: さまざまな型の配列のマーシャリング
http://msdn.microsoft.com/ja-jp/library/hk9wyw21(VS.80).aspx
の,TestArrayOfIntsがほぼそのまま使えますね。

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


返信引用
かず
 かず
(@かず)
ゲスト
結合: 23年前
投稿: 62
Topic starter  

YuOさん、アドバイスありがとうございます。

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました