Access Violation.



  • Schönen guten Morgen,

    ich arbeite im Moment an einer DLL die eine weitere DLL benutzt. Das ist nötig da die 2. DLL nicht für threads geeignet ist, ich aber solche nutzen muss.

    Beim Debuggen der eigenen DLL bekomme ich nun folgenden fehler:

    Nicht abgefangene Ausnahme in test2.exe (BSZIP.DLL): 0xC0000005: Access Violation.

    Wobei BSZIP.DLL die zweite, nicht selbstgeschriebene DLL ist.

    Ich schließe nun nicht aus das ich Fehler in meiner Threadbehandlung gemacht habe, daher frage ich ob der folgende Code Fehlerhaft ist:

    BOOL APIENTRY DllMain( HANDLE hModule, DWORD  ul_reason_for_call, LPVOID lpReserved)
    {
        switch (ul_reason_for_call)
    	{
    		case DLL_PROCESS_ATTACH:
    			hThread = _beginthread(init, 0, NULL);
    			break;
    		case DLL_THREAD_ATTACH:
    		case DLL_THREAD_DETACH:
    		case DLL_PROCESS_DETACH:
    			break;
        }
        return TRUE;
    }
    ...
    void  init(void*) {
    	while (f.function<0){
    		Sleep(30);
    	}
    	if(f.function==0) {
    		/*>>> Hier tritt der Fehler auf <<<*/
    		f.result = zCompressFiles(f.tempDir, f.password, f.compressionMethod, f.resetArchiveAttribute, f.spanSize, f.comment, (fn_prototype_RTInfo)status);
    		f.function = -1;
    	}
    	else {
    		::MessageBox(NULL, "Informationen konnten nicht geladen werden!","ERROR",MB_OK);
    	}
    	_endthread();
    }
    

    f.function wird später benutzt um zu entscheiden ob gepackt oder endpackt werden soll. Der Teil ist aber eher unwichtig, da das im moment ohnehin erstmal provisorisch ist.
    Die funktionen sind die einzigen in denen ich einen Thread benutze. Ist der Code so in Ordnung oder weiß jemand woher der Fehler sonst kommen könnte?

    MFG Staati



  • Hast Du mal die Doku zu "DllMain" gelesen?
    Darin sollte man wenn möglich gar nichts machen, oder wenn, dann nur solche Dinge die nur Funktionen der kernel32.dll verwenden!!!
    Und ich weiss ja nicht das _beginthread, zCompressFiles usw. alles macht...

    Das Design musst Du ändern und eine eigene Init-Funktion in der DLL exportieren, welche Du aus der EXE aufrufen musst, wenn die DLL komplett geladen wurde.

    Auch bezweifle ich, dass es möglich ist eine nicht-multi-thread-fähige Schnittstelle in eine solche zu verwandelt (ausser mit CSs).



  • Threads sollen nicht aus der DllMain() gestartet werden.
    Das gilt für boost.thread, ist aber sicher auch für andere Librarys gültig.



  • Danke für die Antworten!
    Ich habe eure Anmerkungen mal in die Tat umgesetzt, ändert nur leider nichts an der Fehlermeldung...

    Das funktioniert so mit den Threads wie ich es gemacht habe, aber wenn Ihr sagt das man das nciht macht mach ich das auch nicht mehr 😉

    Ich vermute das der Fehler auftritt, weil die DLL möglicherweise selbst Threads verwendet und deshalb eine Zugriffsverletzung zu stande kommt...

    Ich werde mir wohl etwas anderes überlegen müssen.


Anmelden zum Antworten