2011-01-10 4 views
9

desidero chiamare il mio funzione dll C++ da Excel vba:È possibile passare un riferimento a un puntatore da Excel VBA a C++?

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

La funzione C++ crea un array di my_array n_size dimensioni variabili (questo formato calcolato all'interno my_cpp_fun).

Posso interfacciare questa funzione così come è per VBA senza utilizzare elementi specifici di Excel nel mio codice C++?

Quindi, in pratica quello che sto cercando è un VBA Declare dichiarazione come

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

Un ulteriore problema che appena si è verificato a me: se io allocare la memoria all'interno del C++ dll utilizzando il nuovo, sarà che la memoria sia disponibile una volta la funzione dll restituisce il controllo a VB? Se questo non è il caso, quanto sopra è inutile ...

risposta

6

Risposta breve: sì, è possibile (e più semplice della rotta COM, a mio avviso) chiamare le funzioni in una DLL da VBA. Nella mia esperienza, il modo migliore per procedere è scrivere funzioni wrapper con il collegamento C (per evitare l'esecuzione in vari schemi di manipolazione dei nomi in C++) ed esporre un'interfaccia di puntatori piuttosto che riferimenti (come il tipo VBA appropriato per dichiarare un argomento di riferimento o il risultato sarà piuttosto difficile da prevedere).

Un'ottima guida per la scrittura delle appropriate istruzioni Declare (presupponendo Windows a 32 bit) è il capitolo 2 del libro "Hardcore Visual Basic", se è possibile trovarlo.

Si noti inoltre che qualsiasi funzione esposta a VBA tramite le istruzioni Declare dovrà utilizzare la convenzione di chiamata stdcall (alias WINAPI).

TLDR:

farei questo:

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

e poi

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

e utilizzare le varie funzioni del *Ptr VB6/VBA per ottenere i puntatori alla mia dati.

1

Avresti bisogno di creare un oggetto COM che espone la funzione e caricarlo nel vostro VBA usando CreateObject

+1

Quindi non è possibile senza utilizzare l'API di Excel? Stavo pensando a qualcosa di semplice come Declare Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, Magic_Ref_to_ptr_qualifier my_array come doppio) – Hans

+0

E 'possibile, ma è così più problemi del suo valore per percorrere quella strada. È molto più facile avere una dll COM avvolgere la tua dll raw quando si interfaccia con VB. –

+3

No, Declare è più semplice di COM se l'area della superficie dell'interfaccia è piccola. COM è un dolore reale nella parte posteriore, specialmente da C++. –