Persistentes Objekt in .dll verwalten
-
Ich habe folgendes Problem:
Ich habe in C++ eine Bibliothek zur Auswertung von Messdaten entwickelt, die diese auf verschiedenen Plattformen bereitstellen soll. Unter anderem ist Excel erforderlich, mit dem ich erste Schritte unternommen habe. Die Routinen als "Standalone"-Programme funktionieren alle und werden auch so verwendet.
Bei der Verwendung als .dll gibt es eine Initialisierungsfunktion, die ein Auswerteobjekt (evalobject) anlegt und einen Zeiger (hier alles noch 32-bit) auf dieses Objekt zurückliefert. Den Zeiger auf das Objekt speichere ich in einer globalen Variable:#include "stdafx.h" #include "evalobject.h" long __stdcall EvalObject_create() { evalobject* eobj=new evalobject(); return (long)eobj; }; long __stdcall EvalObject_destroy(evalobject* eobj) { if (eobj) delete eobj; return 0; };
Alle dann aus dem Excel-VBA-Script folgenden Aufrufe nutzen dann dieses Objekt, indem sie einen Zeiger darauf übergeben:
double __stdcall myfunc(evalobject* eobj,long par1,double par2) { if (eobj) return eobj->m_evaluation->myfunc(par1,par2); else return NaN; };
In VBA:
Public Declare Function EvalObject_create Lib "C:\MyPath\MyLib.dll" () As Long
Public Declare Function EvalObject_destroy Lib "C:\MyPath\MyLib.dll" (ByVal ptr As Long)
Public Declare Function myfuncLib "C:\MyPath\MyLib.dll" (ByVal ptr As Long, ByVal Par1 As Long, ByVal Par2 As Double) As DoubleDas Ganze fällt früher oder später auf die Nase mit ziemlich heftigen Abstürzen. Mein Verdacht ist, dass das in EvalObject_create() mit "new" erzeugte Objekt aus irgendeinem Grund wieder vernichtet wird (nach meinem Verständnis dürfte der Destruktor am Funktionsende nicht aufgerufen werden). Solange der Speicher nicht anderweitig verwendet wurde funktioniert dann das Ganze noch, danach knallt's natürlich!
Hat jemand eine Idee, was ich falsche mache?Schon mal vielen Dank!
Gruß, Andres
-
1. Warum gibt
long __stdcall EvalObject_create()
nicht gleich ein evalobject* zurück? Oder soll das als Error Code dienen (würde nicht funktionieren..).
2. Vor dem delete brauchst Du nicht auf 0 zu testen.Mein Verdacht ist, dass das in EvalObject_create() mit "new" erzeugte Objekt aus irgendeinem Grund wieder vernichtet wird
Sollte nicht.
(nach meinem Verständnis dürfte der Destruktor am Funktionsende nicht aufgerufen werden).
Das ist korrekt. Erst bei delete.
-
Das Problem ist, dass VBA ein evalobject natürlich nicht kennt und deshalb einen Zeiger darauf erhält, weshalb ich evalobject* in ein long caste.