FreeLibrary() Unhandled exception at 0x09975b08



  • unskilled schrieb:

    dann wird es daran liegen, dass irgendein objekt am ende des scopes zerstört wird, was zuvor kopiert wurde, welches aber nicht zum kopieren gedacht war^^

    also setz mal in alle DTors deiner Klassen nen breakpoint und wenn du dann den Übertäter hast, überlädst du dort den CopyCTor bzw op= richtig(also bei pointern, die du im dtor löschst, reicht es nicht, den pointer zu kopieren)

    bb

    Mein DTor macht bislang aber noch gar nichts. Die Speicher werden nicht im DTor freigegeben, da ich die DLL nicht komplett verlasse, sonder mich ein einer weiteren Hardware verbinden kann. Ich kann den Übeltäter nicht wirklich ausfindig machen.



  • dann setz breakpoint auf letzte zeile und step dich dann mit F11 durch...



  • Ich habs mal versucht. Anbei zwei Screenshots. Bei Screenshot1 konnte ich mit F11 nicht mehr weiter und musste drübersteppen. Screenshot2 zeigt dann die Adresse und Fehlermeldung. Ich kann damit nichts anfangen. Danke schonmal.

    http://www.dlzemtipp.kilu.de/e107_images/Uploads_Foren/Screenshot1.bmp
    http://www.dlzemtipp.kilu.de/e107_images/Uploads_Foren/Screenshot2.bmp



  • Zeig mal bitte deinen kompletten main-Code...
    Erst mal nur den, weil der Rest wahrscheinlich zu viel werden würde.
    Und ich/wir sagen dir dann, welche Klassen/Fkt/... wir noch brauchen, um dir das zu beantworten...

    bb



  • unskilled schrieb:

    Zeig mal bitte deinen kompletten main-Code...
    Erst mal nur den, weil der Rest wahrscheinlich zu viel werden würde.
    Und ich/wir sagen dir dann, welche Klassen/Fkt/... wir noch brauchen, um dir das zu beantworten...

    bb

    Ok. Hier der Main Code.

    // 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;
    		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)
    {
    	return ClassPtrList[*CamIndex]->Connect();
    }
    
    DLL_EXPORT int Disconnect()
    {
    	return ClassPtrList[IRCamIndex]->Disconnect();
    }
    

    ClassPtrList ist ein Pionterarray auf eine Abstrakte Klasse, welche Pointer der SDK Klassen aufnimmt.



  • Ich tippe mal auf irgendwas, dass im Dtor von IRBGrab gemacht wird. Der Code in der DllMain kann es eigentlich nicht sein.



  • Tachyon schrieb:

    Ich tippe mal auf irgendwas, dass im Dtor von IRBGrab gemacht wird. Der Code in der DllMain kann 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 dllMain wird 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 von IRBGrab .
    Es sei denn, es gibt irgendwelche exotisch überladenen Operatoren.



  • Tachyon schrieb:

    In der von Dir geposteten dllMain wird 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 von IRBGrab .
    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 dllMain so, 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 dllMain so, 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) und int 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_Interface hat einen virtuellen Dtor, ja?



  • Tachyon schrieb:

    Wo wird denn int Connect(long int *CamIndex) und int 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_Interface hat 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. 😃 😉


Anmelden zum Antworten