У меня есть 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()
функции testArray()
? Должно ли ключевое слово ByRef
сделать это возможным?
ByRef docArray()
делает ожидаемый смысл при вызове внутри VB (A) - он позволяет вам заменить массив, хранящийся в переменной, на другой массив (а также изменить элементы переданного массива без замены всего массива).
Для объявленных функций используйте ByRef docArray As Long
, а затем передайте docArray(LBound(docArray))
в качестве аргумента (указатель на первый элемент).