Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi DLL EntryPoint (https://www.delphipraxis.net/88819-dll-entrypoint.html)

Neutral General 21. Mär 2007 15:48


DLL EntryPoint
 
Hi,

Wenn ich meine DLL mit der rundll32.exe starten will dann bekomm ich immer Ärger wegen dem EntryPoint weil ich nicht genau weiß was ich da angeben soll...

Im Moment mach ich das mit ner .bat und zwar so:

Zitat:

rundll32.exe Meine.dll,_DllMainCRTStartup
_DllMainCRTStartup hab ich in MSDN unter DllMain gefunden...

Dll-Code:
Delphi-Quellcode:
library Meine;

// [...]

procedure DllMain(Reason: Integer);
begin
  case Reason of
    DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(hInstance);
    DLL_THREAD_ATTACH : ;
    DLL_THREAD_DETACH : Running:= false;
    DLL_PROCESS_DETACH: Running:= false;
  end;
  if Assigned(DLLProcNext) then DLLProcNext(Reason);
end;

// [...]

begin
  DllProc := @DllMain;
  ShowMessage('hey!'); <-- zum debuggen nur
  DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain)));
  DLLMain(DLL_PROCESS_ATTACH);

  Thread:= CreateThread(nil, 0, TFNThreadStartRoutine(@ThreadProc),nil, 0, ThreadID); // unwichtig für das Problem
  if Thread <> 0 then CloseHandle(Thread); // dito
end.
Ohne die erste Zeile gibts immer ne Fehlermeldung das der EntryPoint <ZweiterParameter> nicht existiert und es passiert NIX. Mit dieser Zeile bekomm ich die ShowMessage angezeigt aber danach verabschiedet sich das ganze mit ner AV und nem Overflow....
Ich verzweifel noch bald an dem ganzen DLL-Kram-.-

Gruß
Neutral General

brechi 21. Mär 2007 16:01

Re: DLL EntryPoint
 
Hab zwar nie was mit der rundll32.exe gemacht, ist das nicht der Name eines Exports?

hoika 21. Mär 2007 16:01

Re: DLL EntryPoint
 
Hallo,

lade dir bei MS den Dependency Walker herunter (umsonst).
Dann öffne deine DLL damit, er zeigt dir u.a. auch die
exportierten Funktionsnamen an.


Heiko

Flocke 21. Mär 2007 16:15

Re: DLL EntryPoint
 
rundll32 lädt deine DLL, führt eine Funktion daraus aus, und entlädt die DLL wieder. Die Initialisierung wird dabei automatisch durchgeführt.

Du musst also nicht den Entry-Point der DLL angeben, sondern die Funktion aus der DLL, die ausgeführt werden soll - schreibe dir zur Not eine Dummy-Funktion dafür.

Neutral General 21. Mär 2007 16:19

Re: DLL EntryPoint
 
Naja meine DLL/Funktion hat/ist eine (fast)Endlosschleife... Ist das schlimm ?^^

Kann ich in der Funktion DllMain aufrufen oder wird DllMain trotzdem benutzt? weil dann könnte ich die Endlosschleife bei DLL_PROCESS_DETACH oder DLL_THREAD_DETACH beenden...

Gruß
Neutral General

Flocke 21. Mär 2007 16:24

Re: DLL EntryPoint
 
Zitat:

Zitat von Neutral General
Kann ich in der Funktion DllMain aufrufen oder wird DllMain trotzdem benutzt?

Zitat:

Zitat von Flocke
Die Initialisierung wird dabei automatisch durchgeführt.

Das meinte ich mit dem Satz eigentlich.

rundll32 macht eigentlich nichts besonderes:
1. ein LoadLibrary mit deiner DLL
2. ein GetProcAddress mit der angegebenen Funktion
3. diese wird aufgerufen (mit den Parametern)
4. die DLL wird mit FreeLibrary wieder freigegeben
5. rundll32.exe wird beendet

Bei einer Endlosschleife würdest du ja PROCESS_DETACH nie bekommen, da rundll32 auf ewig auf die Rückkehr aus deiner Funktion wartet.

brechi 21. Mär 2007 16:26

Re: DLL EntryPoint
 
Bei seinem Code würde die Dll wieder entladen werden, da er einen neuen Thread erstellt.

Neutral General 21. Mär 2007 16:33

Re: DLL EntryPoint
 
mhh also ich hab in CMD mal

Zitat:

Meine.dll, MeineFunktion
aufgerufen und das Programm war am laufen und CMD hat nicht weitergemacht.. weil rundll32 noch beschäftigt war... Ist die Endlosschleife denn Schlimm? Bzw. WENN sie schlimm ist... Was mach ich dagegen?

Gruß
Neutral General

Flocke 21. Mär 2007 22:13

Re: DLL EntryPoint
 
Zitat:

Zitat von Neutral General
Ist die Endlosschleife denn Schlimm? Bzw. WENN sie schlimm ist... Was mach ich dagegen?

Nö, schlimm ist das nicht. Eine EXE-Datei würde ja wahrscheinlich genau so lange laufen.

Du musst mal ausprobieren, ob der Shutdown vernünftig klappt. Ansonsten vielleicht wie Brechi schrieb die Arbeit in einen Thread auslagern und in der Funktion selbst ein verstecktes Fenster erzeugen, das auf WM_ENDSESSION reagiert.

Luckie 21. Mär 2007 22:55

Re: DLL EntryPoint
 
Warum eigentlich eine DLL und kein normales Programm?


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:40 Uhr.
Seite 1 von 2  1 2      

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