2011-01-10 85 views
9

我想从Excel VBA中打电话给我自己C++ DLL功能:是否可以将对Excel VBA指针的引用传递给C++?

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

的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) 

,只是发生在我的另外一个问题:DLL使用新++如果我分配的C里面的内存,将内存可用一次该dll函数返回控制到VB?如果不是这种情况,上面是没有意义的......

回答

6

简短的回答加载在VBA:是的,这是可能的(并且比我的意见中的COM路由更容易)从VBA调用DLL中的函数。根据我的经验,最好的方法是使用C链接编写包装函数(以避免遇到各种C++名称压缩方案)并暴露指针接口而不是引用接口(作为用于声明引用参数的适当VBA类型或结果将很难预测)。

如果能够找到它,关于如何编写合适的Declare语句(假设32位Windows)的书籍的第2章是“Hardcore Visual Basic”的一个很好的指南。

还要注意,通过Declare语句暴露给VBA的任何函数都需要使用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)

,并使用VB6/VBA的各种*Ptr函数来获取指针到我的数据。

1

你需要创建一个公开的功能的COM对象,并使用CreateObject

+1

所以这也不是没有可能使用Excel API?我在想一些简单的像 声明子my_cpp_fun库“my_cpp.dll”(n_size长,Magic_Ref_to_ptr_qualifier my_array作为双人间) – Hans 2011-01-10 17:36:41

相关问题