Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Reason entspricht nicht DLL_PROCESS_DETACH (https://www.delphipraxis.net/87426-reason-entspricht-nicht-dll_process_detach.html)

StTüff 28. Feb 2007 15:51


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:
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.
Nun habe ich an der Stelle "case Reason of" einen Breakpoint gesetzt.
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

Neutral General 3. Mär 2007 14:21

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

Neutral General 4. Mär 2007 12:00

Re: Reason entspricht nicht DLL_PROCESS_DETACH
 
Hi,

Also ich habs jetzt so gemacht:

Delphi-Quellcode:
const
  DLL_PROCESS_DETACH = 11940028;
Das is nämlich der Wert den ich immer bekomme.. Ich hoffe nur das dieser dann auch konstant bleibt....
Aber im Moment funktionierts... Is wahrscheinlich nicht die tollste Lösung aber naja...


Gruß
Neutral General

OldGrumpy 4. Mär 2007 12:26

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 :(

StTüff 5. Mär 2007 06:20

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

StTüff 5. Mär 2007 06:56

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.

http://www.delphi-forum.de/viewtopic...=425789#425789
http://forum.dsdt.info/viewtopic.php?p=204501#204501

(Sollte sich was ergeben, so werde ich in den anderen Foren natürlich berichten)

Gruß,

StTüff

OldGrumpy 5. Mär 2007 07:09

Re: Reason entspricht nicht DLL_PROCESS_DETACH
 
Wie ich schon vermutete, hast Du da ein Handle :)

Schau mal bitte hier in der MSDN wie da DllMain definiert wird... Jetzt müsstest Du Dir mal anschauen wie Borland das bei sich kapselt, laut dem Tutorial von Assarbad müsste das ja irgendwo in der System unit zu finden sein. Vielleicht hat sich da irgendwann mal die Methodik geändert.

StTüff 5. Mär 2007 07:21

Re: Reason entspricht nicht DLL_PROCESS_DETACH
 
OK.

In der Datei "SysInit" findet man das:

Delphi-Quellcode:
  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;
Die Konstaten sind in der Datei "Windows" definiert:

Delphi-Quellcode:
  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}
Muss mal schauen, ob ich da was finden kann und vor allem, ob ich mich da "zurechtfinde".

Gruß und vielen Dank,

StTüff

StTüff 5. Mär 2007 07:37

Re: Reason entspricht nicht DLL_PROCESS_DETACH
 
Ich glaube ich habe jetzt auch die passende Stellen gefunden:
Delphi-Quellcode:
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.
und für unload:

Delphi-Quellcode:
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;
Hier hören aber meine Kentnisse auf.
Wie kann ich ich hier Debuggen?

Gruß,

StTüff

OldGrumpy 5. Mär 2007 08:25

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 06:07 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz