C++ DLL in VB bzw VBA implementieren.

asdfghjkl1234

Grünschnabel
Hallo,

ich habe eine DLL geschrieben und möchte diese in VB integrieren und einen Wert zurückbekommen. Nur leider stürzt VB sofort ab nachdem die Funktion aufgerufen wird.

VB
Deklaration Funktion
Code:
Declare Function MooreRukovenaDLL Lib "C:\...\MooreRukovenaDLL.dll" Alias "_MooreRukovenaDLL@4" (ByRef p As Double) As Double

Den Alias habe ich über den Dumpbin /Exports Befehl ausgelesen.

Funktionsaufruf
Code:
MooreRukovenaDLL (DQ)

C++
Deklaration Funktion
Code:
extern "C"  __declspec(dllexport)  void WINAPI MooreRukovenaDLL(double*);

Funktion
Code:
void WINAPI MooreRukovenaDLL(double* Dq)
{
*DQ = 1;
}

Ich habe auch schon viele andere Varianten der Funktionsdeklaration in C++ verwendet, aber diese funktioniert am besten. Bei anderen Varianten wurde die DLL oft noch nicht mal von VB gefunden.

Ich bin nach zwei Tagen ausprobieren mit meinen Latain am Ende.
Vielleicht hat ja jemand von euch eine Lösung parat.

Besten Dank im Voraus!
 
hast du mal versucht keinen pointer zu übergeben sondern nur werte?

ausserdem deklarierst du die funktion als double in VB, aber als void in C.
 
Hallo,

danke für die Antwort. Ich habe beide Varianten durchgeführt, dass Ergebnis ist allerdings das gleiche.
Excel stürzt nach dem Funktionsaufruf sofort ab.
Ich könnte noch verrückt werden.
 
Ich habe den Fehler jetzt eingegrenzt.

Und zwar deklariere ich in der DLL zwei 2D dynamische Float Felder, mit ca. 11000 Elementen in jeder Dimension. Wenn ich eines der Felder, egal welches, auskommentiere funktioniert meine DLL. Nur wenn ich beide zur gleichen Zeit verwende stürzt Excel ab.

Ich verstehe den Fehler nicht. Könnte es darin liegen, das die beiden Felder zusammengenommen für eine DLL zu groß sind?
Als Exe finktioniert der Code wunderbar.
 
Wie deklarierst du diese Felder? Mit 'new' oder 'malloc' sollte es kein Problem sein, ansonsten sprengst du vermutlich den Stack.

Gruß
MCoder
 
Ich deklariere die Felder mit 'new'.
Mich verwundert warum die Exe funktioniert und die DLL nicht.
Das macht doch gar keinen unterschied.
 
Ok, ich habe meinen Code etwas umgeschrieben so das es jetzt funktioniert.
Nun möchte ich allerdings noch ein 2d Array von VB an die DLL übermittel.
Wie geht das? Hat jemand ein Code-Beispiel?
Mit den Lösungen die ich in Google gefunden habe, kann ich nichts anfangen.

Gruß
 
Zurück