AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Reason entspricht nicht DLL_PROCESS_DETACH
Thema durchsuchen
Ansicht
Themen-Optionen

Reason entspricht nicht DLL_PROCESS_DETACH

Ein Thema von StTüff · begonnen am 28. Feb 2007 · letzter Beitrag vom 5. Mär 2007
Antwort Antwort
Seite 1 von 3  1 23      
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#1

Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 28. Feb 2007, 15:51
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 3. Mär 2007, 14:21
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 4. Mär 2007, 12:00
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
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 4. Mär 2007, 12:26
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
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#5

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 06:20
...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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#6

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 06:56
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
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 07:09
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.
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#8

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 07:21
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
  Mit Zitat antworten Zitat
StTüff

Registriert seit: 3. Dez 2002
132 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 07:37
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
  Mit Zitat antworten Zitat
Benutzerbild von OldGrumpy
OldGrumpy

Registriert seit: 28. Sep 2006
Ort: Sandhausen
941 Beiträge
 
Delphi 2006 Professional
 
#10

Re: Reason entspricht nicht DLL_PROCESS_DETACH

  Alt 5. Mär 2007, 08:25
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...
"Tja ja, das Ausrufezeichen... Der virtuelle Spoiler des 21. Jahrhunderts, der Breitreifen für die Datenautobahn, die k3wle Sonnenbrille fürs Usenet. " (Henning Richter)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 Uhr.
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