1

我有一个 C++ DLL;我试图在 VBA 中调用一个导出函数,该函数将返回一个数组。为了避免将 SAFEARRAY 作为返回类型处理,我选择通过引用将数组传递给函数,并让函数修改该数组的值。但是 VBA 实现不会返回修改后的值,即使我ByRef用来传递数组。

标题:

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关键字不应该使这成为可能吗?

4

1 回答 1

3

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

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

于 2013-10-28T20:59:21.700 回答