• ベストアンサー

DLLの利用について

現在、VCで作成したDLLをVB使うということを行っています。 概要は、VBの方で定義した配列に1~9の数字を代入し、その和を求めるというものです。 DLLに値を渡す際は参照による引渡しをし、DLLで変数の変更を行いたいんです。 しかしその変数の変更がうまくいかないんです。 どこがまずいのでしょうか? プログラム内容は以下に示します。 よろしくお願いします。 *****VBのプログラム***** Option Explicit Private Declare Sub Sum Lib "test.dll" (aa as Integer, bb as Integer) Private Sub Command1_Click() Dim a(9) As Integer  '1~9の値の代入先 Dim b As integer   '和 Dim I As Integer For I = 0 To 9 a(I) = I + 1 Next I b = 0 Sum a, b  'DLLでの計算 MsgBox (b) '結果表示 End Sub *****DLLの中身***** _declspec(dllexport) void _stdcall Sum(short *aa, short bb) { int i; for ( i=0; i<=9; i++){ bb=bb+aa[i]; } } *****モジュール定義内容***** EXPORTS Sum

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

  • ベストアンサー
  • umejas
  • ベストアンサー率28% (9/32)
回答No.2

こんにちは。 引数で値を戻すには、参照渡しにしないといけないので、このソースのDLL側で算出した値(bb)を戻すためには、 _declspec(dllexport) void _stdcall Sum(short *aa, short *bb) とする必要があります。 また、DLL側に配列を渡す際は、先頭の要素を参照渡しにするので、 Sum a(0), b  'DLLでの計算 としてください。

k314593
質問者

お礼

御回答ありがとうございます。 なんとか解決することができました。 助かりました。

その他の回答 (1)

回答No.1

あまりこのあたり詳しくはないのですが、 Web上のサンプルとかを見てると、Integer型の基本型は 明示的に値渡しで行っているような気がします。 なので、値渡しを行うためには、構造体を定義して、 それで受け渡しを行う必要があるのかもしれません。 あと、気になったのが、VC側での Sum(short *aa, short bb) ですが、これだとbbが値渡しになりませんか? Sum(short aa, short *bb) でもしかしたらうまくいくのかも。

k314593
質問者

お礼

御回答ありがとうございます。 なんとか解決することができました。 助かりました。