如何从C ++ DLL将数组传递给VBA?

时间:2013-10-28 20:52:55

标签: c++ vba dll

我有一个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关键字不应该这样做吗?

1 个答案:

答案 0 :(得分:2)

ByRef docArray()在VB(A)内部调用时具有预期的意义 - 它允许您将存储在变量中的数组替换为另一个数组(以及更改传递的数组的元素而不替换整个数组)。

对于声明的函数,使用ByRef docArray As Long,然后传递docArray(LBound(docArray))作为参数(指向第一个元素的指针)。