C++ DLL があります。配列を返すエクスポートされた関数を VBA で呼び出そうとしています。戻り値の型として SAFEARRAY を処理する必要がないように、配列を参照によって関数に渡し、関数でこの配列の値を変更することにしました。ByRef
しかし、VBA 実装は、配列を渡すために使用しているにもかかわらず、変更された値を返しません。
ヘッダ:
namespace myProject
{
class FileOperator
{
public:
static __declspec(dllexport) void __stdcall testArray(long* docArray);
};
}
実装:
#include "stdafx.h"
#include "myProject.h"
using namespace std;
namespace myProject
{
void __stdcall FileOperator::testArray(long* docArray)
{
docArray[0]=303;
docArray[1]=909;
}
}
コンソール アプリのテスト:
#include "stdafx.h"
#include <iostream>
#include "../myProject/myProject.h"
using namespace std;
int main()
{
long docArray[2]={0};
myProject::FileOperator::testArray(docArray);
cout << docArray[0] << "\n" << docArray[1];
}
VBA テスト:
Private Declare Sub testArray Lib "C:\pathToDLL\myProject.dll" _
Alias "?testArray@FileOperator@myProject@@SGXPAJ@Z" _
(ByRef docArray() As Long)
Public Sub test()
Dim docArray(1) As Long
docArray(0) = 0
docArray(1) = 0
testArray docArray
For Each x In docArray
Debug.Print x
Next
End Sub
C++ コンソール アプリの出力は次のとおりです。
303
909
VBA アプリは次のように出力します。
0
0
testArray()
関数が終了すると、配列の変更が保存されないのはなぜですか? ByRef
キーワードはこれを可能にするべきではありませんか?