![]() |
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...
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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