- ベストアンサー
VC6.0で作成したDLLでVBからの配列を受け取る方法
- VC++でDLLを作成し、VBから呼び出しで配列を渡す方法について質問しています。通常変数での受け渡しは成功していますが、配列に変更すると受け渡しがうまくいかない状況です。お力をお貸しいただける方を探しています。
- 質問者はVC++で作成したDLLをVBから呼び出し、配列を渡したいという問題に直面しています。通常変数での受け渡しは成功しており、配列に変更すると受け渡しが上手くいきません。問題の解決に関するアドバイスを求めています。
- VC++で作成したDLLをVBから呼び出す際、配列を渡したい状況で問題が発生しています。通常変数では正常に受け渡しができることを確認しており、配列に変更すると値が正しく渡らなくなることがわかっています。解決策をお待ちしています。
- みんなの回答 (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; }
その他の回答 (1)
- SSBBGLUV
- ベストアンサー率47% (11/23)
すいません。sumの初期化を忘れてました。 C側の int sum; を int sum = 0; に置き換えてください。
お礼
どうもありがとうございました(^^)。 hairetu(0)を渡すことによって無事VCに値が渡りました。 なんとお礼をいえばいいのかわからないくらい 感謝感激です。 本当にありがとうございました m( _ _ )m
補足
VB側のDim values as variant values = fncTest(hairetu(0),8) の部分の戻り値はMSDNのサンプルを参考にして書きました。 まったく意味がないことがわかったので Dim values as integer values = fncTest(hairetu(0),8) で単純に戻り値を受け取るということでよかったと思います。 今後これを参考になされる方が混乱しないように 補足しておきますね。