2011-01-10 17 views
9

me gustaría llamar a mi propia función DLL C++ desde Excel VBA:¿Es posible pasar una referencia a un puntero desde Excel VBA a C++?

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

La función de C++ crea una serie de my_array n_size tamaño variable (este tamaño se calcula dentro my_cpp_fun).

¿Puedo interactuar esta función tal como está con VBA sin usar ningún elemento específico de Excel en mi código C++?

Así que básicamente lo que estoy buscando es una VBA DECLARE como

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

Un problema adicional que simplemente se me ocurrió: Si asignar memoria dentro de la DLL de C++ utilizando nueva, estará disponible que la memoria una vez la función dll devuelve el control a VB? Si ese no es el caso, lo anterior no tiene sentido ...

Respuesta

6

Respuesta corta: Sí, es posible (y más fácil que la ruta COM, en mi opinión) llamar funciones en una DLL de VBA. En mi experiencia, la mejor manera de hacerlo es escribir funciones de contenedor con el enlace C (para evitar ejecutar varios esquemas de modificación de nombres C++) y exponer una interfaz de punteros en lugar de referencias (como el tipo de VBA apropiado para declarar un argumento de referencia o el resultado será bastante difícil de predecir).

Una gran guía para cómo escribir las declaraciones Declare apropiadas (suponiendo Windows de 32 bits) es el Capítulo 2 del libro "Hardcore Visual Basic", si puede encontrarlo.

Tenga en cuenta también que cualquier función expuesta a VBA a través de las declaraciones Declare deberá usar la convención de llamada stdcall (también conocida como WINAPI).

TLDR:

que haría esto:

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

y luego

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

y uso de las distintas funciones de *Ptr VB6/VBA para obtener los punteros a mi datos.

1

Se necesitaría para crear un objeto COM que expone a su función y cargarlo en su VBA utilizando CreateObject

+1

lo que no es posible sin el uso de la API de Excel? Estaba pensando en algo tan sencillo como Declarar Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, my_array Magic_Ref_to_ptr_qualifier As Double) – Hans

+0

Es posible, pero es camino más problemas de los que merece la pena para ir por esa ruta. Es mucho más fácil tener un dll COM para envolver su dll sin procesar al interactuar con VB. –

+3

No, declarar es más fácil que COM si la superficie de la interfaz es pequeña. COM es un dolor real en la parte trasera, especialmente de C++. –

Cuestiones relacionadas