プロが教えるわが家の防犯対策術!

VC++でDLLを作成しています。
VBから呼び出しで、配列を渡し、その配列の値を
VCで使用したいのです。
通常変数でテストして、うまくいっているのですが、
配列に変更したところ、値がうまく渡りません。
どなたかお分かりになられる方いらっしゃいましたら
お力をお貸し願えないでしょうか?
変数で成功しているプログラム
VB6.0
標準モジュール
Declare Function fncTest Lib "fncTest.dll" (a As Long) As Long
フォーム
Private Sub Test_Click()
dim i as integer
i = fncTest(1)
End Sub

VC++6.0
fncTest.h
fncTest_API int _stdcall fncTest(int);
fncTest.cpp
fncTest_API int _stdcall fncTest(int a)
{
a = a+1;
return a;
}
fncTest.def
    省略
変数aを配列に変更して作ってみたもの(配列bにVBからの配列aの値を入れようとしていますが、
うまくいっていません。)
VB6.0
標準モジュール
Declare Function fncTest Lib "fncTest.dll" (ByRef a() As Long) As Long
フォーム
Private Sub Test_Click()
Dim i As Integer
Dim hairetu(7) As Long
Dim values As Variant
For i = 0 To 7
hairetu(i) = i
Next i
values = fncTest(hairetu())
End Sub

VC++6.0
fncTest.h
fncTest_API int _stdcall fncTest(int*);
fncTest.cpp
fncTest_API int _stdcall fncTest(int* a)
{
int b[7];
int i;
for (i = 0;i <= 7;i++){
b[i] = a[i];
}
return 0;
}

以上よろしくお願いします。

A 回答 (2件)

VBの配列は管理領域などを含んでいますので、


そのままではうまく渡りません。
配列の先頭要素を参照渡しするとうまくいくと
思います。この場合、当然ですがC側では配列の
範囲を知ることが出来ませんので、その辺は引数で
管理してください。
ちなみに、ユーザ定義型の配列は各要素がメモリ内で
連続してないようなので、ユーザ定義型の場合は
ご注意ください。

Declare Function fncTest Lib "fncTest.dll" (ByRef a As Long, ByVal n As Long) As Long
フォーム
Private Sub Test_Click()
Dim i As Integer
Dim hairetu(7) As Long
Dim values As Variant
For i = 0 To 7
hairetu(i) = i
Next i
values = fncTest(hairetu(0), 8)
End Sub

VC++6.0
fncTest.h
fncTest_API int _stdcall fncTest(int*, int);

fncTest.cpp
fncTest_API int _stdcall fncTest(int* a, int n)
{
int sum;
int i;
for (i = 0; i < n; i++){
sum = a[i];
}
return 0;
}

この回答への補足

VB側のDim values as variant
values = fncTest(hairetu(0),8)
の部分の戻り値はMSDNのサンプルを参考にして書きました。
まったく意味がないことがわかったので
Dim values as integer
values = fncTest(hairetu(0),8)
で単純に戻り値を受け取るということでよかったと思います。
今後これを参考になされる方が混乱しないように
補足しておきますね。

補足日時:2005/04/12 11:04
    • good
    • 0
この回答へのお礼

どうもありがとうございました(^^)。
hairetu(0)を渡すことによって無事VCに値が渡りました。
なんとお礼をいえばいいのかわからないくらい
感謝感激です。
本当にありがとうございました
m( _ _ )m

お礼日時:2005/04/12 11:04

すいません。

sumの初期化を忘れてました。
C側の
int sum;

int sum = 0;
に置き換えてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!