FreeLibrary() Unhandled exception at 0x09975b08
-
Tachyon schrieb:
Ich tippe mal auf irgendwas, dass im Dtor von
IRBGrabgemacht wird. Der Code in derDllMainkann es eigentlich nicht sein.Der DTor macht noch nichts. Hier mal der Disconnect Code. In diesem wird FreeLibrary aufgerufen.
int IRBGrab::Disconnect() { this->GetFctAddr().CloseSource(this->GetSrcID()) delete []this->FrameInfoIn.buf; this->IRBGrab_DisposeHandle(); this->GetLVMem()->DimSize = NULL; this->GetLVMem()->Elements[0] = NULL; ClearFrameStruct(this->GetFrameInfoIn); this->IRBGrab_Delete_CriticalSection(); BOOL result = FreeLibrary(this->GetHinstLib()); return 0; }
-
In der von Dir geposteten
dllMainwird aber nichts aufgerufen. Es wird nur ein Pointer zugewiesen. Mehr nicht.
Das Einzige, wo in dem Codestück noch etwas ausgeführt werden kann, ist im Ctor und Dtor vonIRBGrab.
Es sei denn, es gibt irgendwelche exotisch überladenen Operatoren.
-
Tachyon schrieb:
In der von Dir geposteten
dllMainwird aber nichts aufgerufen. Es wird nur ein Pointer zugewiesen. Mehr nicht.
Das Einzige, wo in dem Codestück noch etwas ausgeführt werden kann, ist im Ctor und Dtor vonIRBGrab.
Es sei denn, es gibt irgendwelche exotisch überladenen Operatoren.Hier wird die Funktion Disconnect aufgerufen. Über den Klassenpointer sucht sich die abstrakte Klasse die richtige SDK. In diesem Fall die IRBGrab SDK.
DLL_EXPORT int Disconnect() { return ClassPtrList[IRCamIndex]->Disconnect(); }Hier CTor und DTor:
IRBGrab::IRBGrab(unsigned int ID, bool Flags) : Abstract_Cam_Interface() { SrcID = ID; if(ObjIndex++ == 0) ClearFrameStruct(&FrameInfoIn); Live = Flags; LVMem.DimSize = NULL; LVMem.Elements[0] = NULL; }IRBGrab::~IRBGrab() { }
-
abrissbirne schrieb:
...
Nochmal: Kommt der Fehler mit der
dllMainso, wie Du sie oben gepostet hast?
Wenn ja: Da wird kein Disconnect oder sonstwas aufgerufen.
Ansonsten:DLL_EXPORT int Disconnect() { //IRCamIndex ist global und 0. Hinter ClassPtrList[0] sitzt aber kein gueltiges Objekt. return ClassPtrList[IRCamIndex]->Disconnect(); }
-
Tachyon schrieb:
abrissbirne schrieb:
...
Nochmal: Kommt der Fehler mit der
dllMainso, wie Du sie oben gepostet hast?
Wenn ja: Da wird kein Disconnect oder sonstwas aufgerufen.Erstmal Disconnect() wird aufgerufen. Innerhalb dieser wird FreeLibrary aufgerufen. Die Funktion wird ohne Fehler beendet und springt in dllMain zurück. Dort wird der Rückgabewert der Funktion Disconnect zurückgeliefert, auch noch ohne Fehler. Danach erst kommt im Disassemblyfenster irgendwann die Fehlermeldung (siehe Screenshots). Deshalb weiß ich auch nicht wo ich noch debuggen soll.
-
abrissbirne schrieb:
Erstmal Disconnect() wird aufgerufen.
Wo denn? Poste doch bitte mal den richtigen Code.
Außerdem nochmal:Tachyon schrieb:
DLL_EXPORT int Disconnect() { //IRCamIndex ist global und 0. Hinter ClassPtrList[0] sitzt aber kein gueltiges Objekt. return ClassPtrList[IRCamIndex]->Disconnect(); }
-
Also nochmal. Ich hab die Stellen kenntlich gemacht:
// dllmain.cpp : Defines the entry point for the DLL application. #include "stdafx.h" Abstract_Cam_Interface *ClassPtrList[5] = {NULL}; long int IRCamIndex = 0; IRBGrab CamOne(1, false); BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: { ClassPtrList[1] = &CamOne; // <--Hier wird die Adresse der IRBGrab Klasse hinterlegt. break; } case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } #define DLL_EXPORT extern "C" __declspec(dllexport) DLL_EXPORT int Connect(long int *CamIndex); DLL_EXPORT int Disconnect(); DLL_EXPORT int Connect(long int *CamIndex) { IRCamIndex = *CamIndex; return ClassPtrList[*CamIndex]->Connect(); } DLL_EXPORT int Disconnect() { return ClassPtrList[IRCamIndex]->Disconnect(); // <-- Hier wird auf den IRBGrab Pointer zugegriffen (IRCamIndex = 1) und somit die Funktion Disconnect() aufgerufen. }
-
Wo wird denn
int Connect(long int *CamIndex)undint Disconnect()aufgerufen? In dem Programm, welches die dll einbindet? Bist Du sicher, dass bei Connect mit den Parametern alles in Ordnung ist?
Mach mal eine Ausgabe in den Dtor rein. Vielleicht gibt es Dein CamOne-Objekt gar nicht mehr, wenn Du Connect und Disconnect aufrufst.Achso,
Abstract_Cam_Interfacehat einen virtuellen Dtor, ja?
-
Tachyon schrieb:
Wo wird denn
int Connect(long int *CamIndex)undint Disconnect()aufgerufen? In dem Programm, welches die dll einbindet?Genau.
Tachyon schrieb:
Bist Du sicher, dass bei Connect mit den Parametern alles in Ordnung ist?
Mach mal eine Ausgabe in den Dtor rein. Vielleicht gibt es Dein CamOne-Objekt gar nicht mehr, wenn Du Connect und Disconnect aufrufst.Hab ne MessageBox in den CTor und DTor gelegt. Das Object bleibt bestehen.
Tachyon schrieb:
Achso,
Abstract_Cam_Interfacehat einen virtuellen Dtor, ja?Genau:
class Abstract_Cam_Interface { private: static int ObjIndex; public: Abstract_Cam_Interface(); // Konstruktor virtual ~Abstract_Cam_Interface(); // Destruktor virtual int Connect(void) = 0; virtual int Disconnect(void) = 0; };
-
Hmm.. Zeig mal die main.cpp in der du die Fkt nutzt, die du in der dll gebastelt hast^^
-
Ich hab wohl zu sehr an meinem Code gezweifelt. Nachdem ich diesen nun Zichfach durchgegangen bin, habe ich mit dem Entwickler der von mir aufgerufenen DLL telefoniert. Es gab mitlerweile einige Updates und nun funktioniert auch das Entladen dieser. Vielen Dank an alle die mir geantwortet haben.
-
abrissbirne schrieb:
Ich hab wohl zu sehr an meinem Code gezweifelt. Nachdem ich diesen nun Zichfach durchgegangen bin, habe ich mit dem Entwickler der von mir aufgerufenen DLL telefoniert. Es gab mitlerweile einige Updates und nun funktioniert auch das Entladen dieser. Vielen Dank an alle die mir geantwortet haben.
ok : D
bb ;o)
-
unskilled schrieb:
abrissbirne schrieb:
Ich hab wohl zu sehr an meinem Code gezweifelt. Nachdem ich diesen nun Zichfach durchgegangen bin, habe ich mit dem Entwickler der von mir aufgerufenen DLL telefoniert. Es gab mitlerweile einige Updates und nun funktioniert auch das Entladen dieser. Vielen Dank an alle die mir geantwortet haben.
ok : D
bb ;o)Jo, hab das erstemal mit abstrakten Klassen gearbeitet.
