2011-01-10 6 views
9

Ich mag würde meine eigene C++ DLL-Funktion aus Excel VBA nennen:Ist es möglich, einen Verweis auf einen Zeiger von Excel VBA nach C++ zu übergeben?

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

Die C++ Funktion erstellt ein Array my_array variabler Größe n_size (diese Größe innerhalb my_cpp_fun berechnet wird).

Kann ich diese Funktion mit VBA verbinden, ohne Excel-spezifische Daten in meinem C++ - Code zu verwenden?

Also im Grunde, was ich suche ist ein VBA-Anweisung deklarieren wie

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

Ein zusätzliches Problem, das nur fiel mir ein: Wenn ich Speicher in der C++ dll mit neuen zuweisen, wird dieser Speicher einmal verfügbar sein Die DLL-Funktion gibt die Kontrolle an VB? Wenn das nicht der Fall ist, ist die oben sinnlos ...

Antwort

6

Kurze Antwort: Ja, es ist möglich (und einfacher als die COM-Route, meiner Meinung nach) Funktionen in einer DLL von VBA aufrufen. Meiner Erfahrung nach besteht der beste Weg darin, Wrapper-Funktionen mit der C-Verknüpfung zu schreiben (um zu vermeiden, in verschiedene C++ - Namensänderungsschemas zu laufen) und eine Schnittstelle von Zeigern statt Referenzen (als geeigneten VBA-Typ zum Deklarieren eines Referenzarguments oder Ergebnis wird ziemlich schwer vorherzusagen sein).

Eine gute Anleitung für das Schreiben geeigneter Declare Anweisungen (vorausgesetzt, 32-Bit-Windows) ist Kapitel 2 des Buches "Hardcore Visual Basic", wenn Sie es finden können.

Beachten Sie auch, dass alle Funktionen, die VBA über Declare-Anweisungen ausgesetzt sind, die Aufrufkonvention stdcall (alias WINAPI) verwenden müssen.

TLDR:

Ich würde dies tun:

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

und dann

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

und die verschiedenen *Ptr Funktionen von VB6/VBA verwenden, um die Zeiger auf meine zu erhalten Daten.

1

Sie müssen ein COM-Objekt erstellen, die Ihre Funktion aussetzt und laden Sie es in Ihrem VBA CreateObject

+1

So ist es nicht möglich, ohne den Excel-API zu verwenden? Ich war einfach wie an etwas gedacht Declare Sub my_cpp_fun Lib "my_cpp.dll" (n_size As Long, Magic_Ref_to_ptr_qualifier my_array As Double) – Hans

+0

Es ist möglich, aber es ist Art und Weise mehr Mühe als es wert ist, diese Route zu gehen. Es ist viel einfacher, eine COM-DLL zu haben, die Ihre Raw-DLL umschließt, wenn Sie mit VB kommunizieren. –

+3

Nein, Declare ist einfacher als COM, wenn die Oberfläche der Schnittstelle klein ist. COM ist ein königlicher Schmerz in der Rückseite, besonders von C++. –

Verwandte Themen