• ベストアンサー

配列をDLLの戻り値としてVBAで受け取る書き方

vbdll.dll: int * __stdcall arr() { int a[] = {1,2,3}; return a; } vba: Declare Function arr Lib "C:\temp\vbdll.dll" () As Long() Sub test() Dim ccc() As Long ccc = arr Debug.Print ccc(0) End Sub インデックスが有効範囲にありませんになります 配列をDLLの戻り値としてVBAで受け取る書き方を教えてください? 何卒、ご教授お願いします。

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

  • ベストアンサー
回答No.2

ついでに、 return a; の時、ローカル変数のaも消滅するので。 返ってくるポインタ値に何の意味もないのも、 もちろんわかって書かれているのでしょうが 念のため。

shakamandara
質問者

お礼

ついでにさん、ヒントありがとうございます あらかじめ配列用のポインタを引数に付けることで VBA側から参照できるようになりました vbdll.dll側: int __stdcall arr(int *e) { int a[] = {1,2,3}; int x; x = sizeof(a) / sizeof(a[0]); memcpy(e, a, sizeof(a)); return x; } VBA側: Declare Function arr Lib "C:\temp\vbdll.dll" (ByRef a As Long) As Long Sub test() Dim ccc() As Long Dim eee(0) As Long Dim x As Long x = arr(eee(0)) '配列要素数取得 ReDim ccc(x - 1) As Long Call arr(ccc(0)) Debug.Print ccc(0) Debug.Print ccc(1) Debug.Print ccc(2) End Sub 結果: 1 2 3

その他の回答 (1)

  • xf86conf
  • ベストアンサー率25% (51/197)
回答No.1

vbdll.dllってintになっていて、その下はAs Longとかなっていますね。 ちょっと理解できていません。

shakamandara
質問者

お礼

型対応表示によると C++がint型のときはVBAはLong型

関連するQ&A