![]() |
Reason entspricht nicht DLL_PROCESS_DETACH
Hallo zusammen!
Ich habe ein seltsames Problem mit einer DLL. Folgender (einfacher) Code für die DLL:
Delphi-Quellcode:
Nun habe ich an der Stelle "case Reason of" einen Breakpoint gesetzt.
uses
SysUtils, Classes, Windows; {$IFNDEF CONDITIONALDEFINE} // type def for Delphi 2-5 type TDLLProc = procedure(Reason: Integer); {$ENDIF} var DLLProcNext: TDLLProc; function InitTest():integer; stdcall; begin result:=0; end; procedure DLLMain(Reason: Integer); stdcall; begin case Reason of DLL_PROCESS_ATTACH: begin DisableThreadLibraryCalls(hInstance); end; DLL_THREAD_ATTACH: ; DLL_THREAD_DETACH: ; DLL_PROCESS_DETACH: begin end; end; if Assigned(DLLProcNext) then DLLProcNext(Reason); end; exports InitTest; begin DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain))); DLLMain(DLL_PROCESS_ATTACH); end. Beim Laden der DLL erhalte ich (wie erwartet) eine 1. Beende ich jetzt das Programm, das die DLL aufruft, so hält die Programmausführung zwar am Breakpoint, "Reason" enthält dann aber einen sehr hohen Wert (also nicht wie erwartet 0). Kann sich das jemand erklären? Mache ich was falsch? Ist der Code, der die DLL nützt auch noch interessant? Gruß und vielen Dank, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hi,
Hab genau das selbe Problem. Wenn meine Anwendung beendet wird dann kommt in der DLL ein Reason Parameter an der keine der Konstanten enspricht. Erst recht nicht DLL_PROCESS_DETACH... Meine Anwendung bindet die DLL statisch ein. Gruß Neutral General |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hi,
Also ich habs jetzt so gemacht:
Delphi-Quellcode:
Das is nämlich der Wert den ich immer bekomme.. Ich hoffe nur das dieser dann auch konstant bleibt....
const
DLL_PROCESS_DETACH = 11940028; Aber im Moment funktionierts... Is wahrscheinlich nicht die tollste Lösung aber naja... Gruß Neutral General |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Nach Hexadezimal umgerechnet sieht mir das ziemlich nach einem Handle aus. Wenn Du eine DLL dynamisch lädst (mit LoadLibrary) bekommst Du z.B. ein Handle zurück, dessen Wert (zumindest auf den 32-Bit-Plattformen, mit x64 hab ich noch nicht experimentiert, Zeitmangel) auch gleichzeitig die Ladeadresse der DLL ist. Wenn Du eine DLL statisch linkst, könnte dieses Handle an den Stub übergeben werden der die DLL dann nutzbar macht... Müsste ich mir mal auf Assemblerebene anschauen, was da passiert. Die nächsten 4-5 Wochen wird das aber nix, ich hab ein sehr schlimmes Projekt mit festem Präsentationstermin hier liegen :(
|
Re: Reason entspricht nicht DLL_PROCESS_DETACH
...das ist schon seltsam. Da ich das Beispiel praktisch bis auf den Inhalt aus diversen Tutorials reduziert habe, müssten das Problem doch eigentlich noch einige mehr haben, oder?
Oder liegt es letzten Endes sogar an der Delphiversion? Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Ich habe das Thema auch in anderen Foren gepostet. Vielleicht gibt es da jemanden, der dieses hier nicht gelesen aht und einen Hinweis hat.
![]() ![]() (Sollte sich was ergeben, so werde ich in den anderen Foren natürlich berichten) Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Wie ich schon vermutete, hast Du da ein Handle :)
Schau mal bitte ![]() |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
OK.
In der Datei "SysInit" findet man das:
Delphi-Quellcode:
Die Konstaten sind in der Datei "Windows" definiert:
DllProc: TDLLProc; { Called whenever DLL entry point is called }
{ DllProcEx passes the Reserved param provided by WinNT on DLL load & exit } DllProcEx: TDLLProcEx absolute DllProc;
Delphi-Quellcode:
Muss mal schauen, ob ich da was finden kann und vor allem, ob ich mich da "zurechtfinde".
DLL_PROCESS_ATTACH = 1;
{$EXTERNALSYM DLL_PROCESS_ATTACH} DLL_THREAD_ATTACH = 2; {$EXTERNALSYM DLL_THREAD_ATTACH} DLL_THREAD_DETACH = 3; {$EXTERNALSYM DLL_THREAD_DETACH} DLL_PROCESS_DETACH = 0; {$EXTERNALSYM DLL_PROCESS_DETACH} Gruß und vielen Dank, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Ich glaube ich habe jetzt auch die passende Stellen gefunden:
Delphi-Quellcode:
und für unload:
procedure _InitLib;
asm { -> EAX Inittable } { [EBP+8] Hinst } { [EBP+12] Reason } { [EBP+16] Resvd } MOV EDX,offset Module CMP dword ptr [EBP+12],DLL_PROCESS_ATTACH JNE @@notInit PUSH EAX PUSH EDX MOV ModuleIsLib,1 MOV ECX,[EBP+8] MOV HInstance,ECX MOV [EDX].TLibModule.Instance,ECX MOV [EDX].TLibModule.CodeInstance,0 MOV [EDX].TLibModule.DataInstance,0 CALL InitializeModule POP EDX POP EAX @@notInit: PUSH DllProc MOV ECX,offset TlsProc CALL _StartLib end; // ExitLib is the same as InitLib in Windows.
Delphi-Quellcode:
Hier hören aber meine Kentnisse auf.
function _ExitLib: Integer; cdecl;
asm {$IFDEF DEBUG_STARTUP} INT 3 {$ENDIF} PUSH EBP MOV EBP,ESP PUSH UNWINDFI_TOPOFSTACK XOR EAX,EAX PUSH DLL_PROCESS_DETACH // InitContext.DLLInitState PUSH EDI PUSH ESI PUSH EBX PUSH EBP PUSH EAX // InitContext.Module PUSH EAX // InitContext.InitCount PUSH EAX // InitContext.InitTable (filled in later) PUSH EAX // InitContext.OuterContext MOV EAX,ESP CALL InnerExitLib; ADD ESP, 16 POP EBP POP EBX POP ESI POP EDI MOV ESP,EBP POP EBP end; Wie kann ich ich hier Debuggen? Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Achja, könntest Du noch kurz erwähnen, welches Delphi Du benutzt? Editier am besten Dein Profil, dann kann mans immer bei Bedarf direkt sehen...
|
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Delphi 2006 Enterprise.... müsste man jetzt auch im Profil sehen können.
:dancer: |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Könnte vielleicht mal jemand mit einem älteren Delphi (z.B. Delphi 7) testen, ob mein oben genannter Code dort wie erwartet funktioniert.
Edit: Es müsste ein noch älteres Delphi sein, weil es bei Neutral General ja auch nicht funktioniert. Inzwischen glaube ich, dass wir vielleicht doch auf der falschen Fährte sind. Wäre echt super. :thumb: Vielleicht können wir so den Unterschied ermitteln. Danke! StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hi,
also mit D7 funktioniert alles so wie es soll (dynamisch eingebundene DLL). |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Danke NormanNG!
Es scheint also nur bei statisch eingebundenen DLLs so zu sein. Kannst Du vielleicht auch mal eine Funktion statisch einbinden, um die Gegenkontrolle zu machen. Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Ich glaube ihr habt beide "nur"
Delphi-Quellcode:
vergessen ;)
DllProc := @DllMain;
|
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hallo!
Ich glaube nicht, da der Austausch über "InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain))" stattfindet, oder sehe ich das falsch. Ich werde aber auf jeden Fall noch die andere Variante testen. Danke für den Hinweis! StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hi,
also statische DLLs gehen mit D7 auch ohne Problem. Edit: Zitat:
|
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hallo NormanNG!
Noch mal vielen Dank für die Hilfe! Da es bei Neutral General aber mit Delphi 7 auch nicht geht, wäre es interessant, was es da für einen Unterschied gibt. Ist es vielleicht möglich, dass Du mir den Test-Quellcode, der bei Dir geht, zukommen lässt? Alternativ dazu könnte ich auch Dir meinen Code schicken, wenn Dir das lieber ist. Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Hi,
Mit fällt grade auf: DLLMain ist bei mit nicht StdCALL. Wenn ich das einfüge, habe ich den gleichen Fehler! Lass ich das weg, geht es. |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
:wall: DAS IST DIE LÖSUNG! :wall:
Vielen Dank! Mal wieder das einfachste. Wie blind kann man sein :dancer: Ich würde Dich jetzt gerne auf ein :cheers: einladen. Noch mal vielen Dank! StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Dass die Calling conventions auf beiden Seiten identisch sein müssen, war für mich selbstverständlich, daher hab ich gar nicht an sowas gedacht :) Das mit dem Wald und den Bäumen und so ;)
|
Re: Reason entspricht nicht DLL_PROCESS_DETACH
Ja, genau so ist es mir auch gegangen....
Manchmal findet man die dümmsten Fehler selbst nicht. Ich bin froh, dass es Euch gibt .... :angel: Gruß, StTüff |
Re: Reason entspricht nicht DLL_PROCESS_DETACH
*unterschreib* :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:08 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz