是否可以将对Excel VBA的指针传递给C++?

Han*_*ans 9 c++ excel vba pointers excel-vba

我想从excel vba调用我自己的C++ dll函数:

void my_cpp_fun ( int& n_size, double*& my_array);
Run Code Online (Sandbox Code Playgroud)

C++函数创建一个可变大小为n_size的数组my_array(此大小在my_cpp_fun中计算).

我可以将此功能与VBA接口,而不使用我的C++代码中的任何Excel特定内容吗?

基本上我正在寻找的是VBA声明声明

Declare Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, Ref_to_Ptr_Qualifier my_array As Double) 
Run Code Online (Sandbox Code Playgroud)

刚出现的另一个问题是:如果我使用new在c ++ dll中分配内存,那么一旦dll函数将控制权返回给VB,该内存是否可用?如果不是这样,上面就没有意义......

Der*_*urk 6

简短的回答:是的,可以(在我看来比COM路线更容易)从VBA调用DLL中的函数.根据我的经验,最好的方法是使用C链接编写包装函数(以避免遇到各种C++名称修改方案)并公开指针接口而不是引用(作为适当的VBA类型来声明引用参数或结果)将很难预测).

Declare如果你能找到它,那么如何编写适当语句(假设是32位Windows)的一个很好的指南是"Hardcore Visual Basic"一书的第2章.

另请注意,通过Declare语句向VBA公开的任何函数都需要使用stdcall(aka 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)

并使用*PtrVB6/VBA 的各种功能来获取指向我的数据的指针.