Можно ли передать ссылку на указатель из Excel VBA на C ++? - PullRequest
9 голосов
/ 10 января 2011

Я хотел бы вызвать свою собственную функцию C ++ dll из Excel vba:

void my_cpp_fun ( int& n_size, double*& my_array);

Функция C ++ создает массив my_array переменного размера n_size (этот размер вычисляется в my_cpp_fun).

Могу ли я связать эту функцию как есть с VBA без использования каких-либо специфических вещей для Excel в моем коде C ++?

Итак, в основном я ищу оператор VBA Declare, такой как

Declare Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, Ref_to_Ptr_Qualifier my_array As Double) 

Дополнительная проблема, которая только что произошла со мной: если я выделю память внутри dll c ++, используя new, будет ли эта память доступна после того, как функция dll вернет управление VB?Если это не так, то вышеупомянутое бессмысленно ...

Ответы [ 2 ]

6 голосов
/ 10 января 2011

Краткий ответ: да, можно (и, на мой взгляд, проще, чем COM-маршрут) вызывать функции в DLL из VBA.По моему опыту, лучший способ - это написать функции-обертки со связью C (чтобы не сталкиваться с различными схемами управления именами в C ++) и предоставлять интерфейс указателей, а не ссылок (как соответствующий тип VBA для объявления ссылки).аргумент или результат будет довольно сложно предсказать).

Отличным руководством по написанию соответствующих Declare операторов (при условии 32-битной Windows) является глава 2 книги "Hardcore Visual Basic", если вы можете ее найти.

Примечаниетакже, что любые функции, предоставляемые VBA через операторы Declare, должны будут использовать соглашение о вызовах stdcall (иначе WINAPI).

TLDR:

Я бы сделал это:

extern 'C' {
    void WINAPI my_cpp_fun_wrapper ( int *n_size, double **my_array )
    { 
        my_cpp_fun(*n_size, *my_array); 
    } 
}

, а затем

Declare Sub my_cpp_fun_wrapper Lib "my_cpp.dll" (ptr_n_size As Long, ptr_ptr_my_array As Long)

и использовать различные *Ptr функции VB6 / VBA для получения указателей на мои данные.

1 голос
/ 10 января 2011

Вам нужно создать COM-объект, который предоставляет вашу функцию и загрузить его в VBA, используя CreateObject

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...