Как передать массив в VBA из C ++ DLL?

0

У меня есть 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 сделать это возможным?

  • 0
    В MSDN есть статья на эту тему: support.microsoft.com/kb/207931
  • 0
    @ZacHowland: Да, я читал статью MSDN, но я надеялся создать эту функцию без необходимости использовать SAFEARRAY. Эта статья Tek-Tips предположила, что это возможно.
Теги:
dll

1 ответ

2
Лучший ответ

ByRef docArray() делает ожидаемый смысл при вызове внутри VB (A) - он позволяет вам заменить массив, хранящийся в переменной, на другой массив (а также изменить элементы переданного массива без замены всего массива).

Для объявленных функций используйте ByRef docArray As Long, а затем передайте docArray(LBound(docArray)) в качестве аргумента (указатель на первый элемент).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню