我有一个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
关键字不应该这样做吗?
答案 0 :(得分:2)
ByRef docArray()
在VB(A)内部调用时具有预期的意义 - 它允许您将存储在变量中的数组替换为另一个数组(以及更改传递的数组的元素而不替换整个数组)。
对于声明的函数,使用ByRef docArray As Long
,然后传递docArray(LBound(docArray))
作为参数(指向第一个元素的指针)。