2011-01-10 6 views
9

chciałbym nazwać własną funkcję dll C++ z Excel VBA:Czy można przekazać odwołanie do wskaźnika z Excela VBA do C++?

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

Funkcja C++ tworzy my_array tablicy o zmiennej wielkości n_size (ta wielkość jest obliczany my_cpp_fun).

Czy mogę połączyć tę funkcję tak, jak ma to miejsce z VBA, bez używania jakichkolwiek elementów specyficznych dla programu Excel w moim kodzie C++?

Więc w zasadzie to, co szukam jest VBA stwierdzenie oświadczenie jak

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

Dodatkowym problemem, który właśnie wystąpił do mnie: Gdybym przydzielić pamięci wewnątrz C++ DLL przy użyciu nowego, będzie, że pamięć jest dostępna raz funkcja dll zwraca kontrolę do VB? Jeśli tak nie jest, to powyższe nie ma sensu ...

Odpowiedz

6

Krótka odpowiedź: tak, to jest możliwe (i moim zdaniem łatwiejsze niż w przypadku COM) wywoływanie funkcji w bibliotece DLL z VBA. Z mojego doświadczenia wynika, że ​​najlepiej jest napisać funkcje otoki z łączem C (aby uniknąć uruchamiania w różnych schematach wymazywania nazw C++) i odsłaniając interfejs wskaźników zamiast odwołań (jako odpowiedni typ VBA, aby zadeklarować argument odniesienia lub wynik będzie raczej trudny do przewidzenia).

Doskonałym przewodnikiem do napisania odpowiednich instrukcji Declare (zakładając 32-bitowy system Windows) jest rozdział 2 książki "Hardcore Visual Basic", jeśli możesz go znaleźć.

Należy również pamiętać, że wszelkie funkcje narażone na VBA za pomocą instrukcji Declare będą musiały używać konwencji wywoływania stdcall (inaczej WINAPI).

TLDR:

bym to zrobić:

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

a następnie

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

i korzystania z różnych *Ptr funkcje VB6/VBA, aby uzyskać wskazówki do mojego dane.

1

trzeba by utworzyć obiekt COM, który udostępnia swoją funkcję i załadować go w VBA przy użyciu CreateObject

+1

Więc to nie jest możliwe bez korzystania z interfejsu API programu Excel? Myślałam o coś prostego jak Declare Sub my_cpp_fun Lib „my_cpp.dll” (n_size As Long, Magic_Ref_to_ptr_qualifier my_array jako podwójne) – Hans

+0

Jest to możliwe, ale jest droga więcej kłopotu niż jego wartość. O wiele łatwiej jest mieć dll COM owinąć twój surowy dll, gdy współpracujesz z VB. –

+3

Nie, Deklaracja jest łatwiejsza niż COM, jeśli powierzchnia interfejsu jest mała. COM to królewski ból z tyłu, zwłaszcza z C++. –

Powiązane problemy