Краткий ответ: да, можно (и, на мой взгляд, проще, чем 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 для получения указателей на мои данные.