Delphi-PRAXiS

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?

Neutral General 22. Mär 2007 11:03

Re: DLL EntryPoint
 
Zitat:

Zitat von Luckie
Warum eigentlich eine DLL und kein normales Programm?

Auftraggeber will DLL haben...

Neutral General 22. Mär 2007 19:09

Re: DLL EntryPoint
 
Zitat:

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

Dazu hab ich jetzt nochmal ne Frage. Denn genau das ist mein Problem. Es kommt bei meiner DLL vor das beim herunterfahren dieser Programm beenden Dialog kommt (rundll32.exe). Wisst ihr was ich meine? Das kommt garantiert von meiner Endlosschleife und davon das rundll32.exe darauf wartet... Was kann ich dagegen machen? Das Problem bei dem Problem ist das es auf MEINEM PC dieses Problem nicht gibt sondern nur beim Kunden.....Der hat aber genau wie ich WinXP Prof. Was kann ich dagegen tun? Reicht ein einfaches Application.Processmessages in meiner Schleife? Eher nicht oder? Ich habs jetzt mit AllocateHWnd versucht. Das ich da WM_ENDSESSION abfange und dann Running = false setze und aus meiner Endlos-Schleife mit

Delphi-Quellcode:
while Running do
 ...
eine endliche Schleife mache... Problem:

Delphi-Quellcode:
procedure TMyWindow.GetMessages(var Message: TMessage);
begin
 if Message.Msg = WM_ENDSESSION then
 begin
   Running := false;
   ShowMessage('!'); // <-- wird niemals ausgeführt...
 end;
   
 Message.Result := DefWindowProc(hMsgWin, Message.Msg, Message.wParam, Message.lParam);
end;
Also entweder bekomm ich keine WM_ENDSESSION Message von Windows oder ich weiß auch nicht...
Gibts da irgendwie eine Lösung?

Gruß
Neutral General

Luckie 22. Mär 2007 19:26

Re: DLL EntryPoint
 
MSDN-Library durchsuchenWM_ENDSESSION wird von Windows nur an toplevel Fenster geschickt.

Neutral General 22. Mär 2007 19:27

Re: DLL EntryPoint
 
Kann ich Windows kein Top-Level Window vorgaukeln oder das ganze irgendwie anders lösen?

Luckie 22. Mär 2007 19:28

Re: DLL EntryPoint
 
Erstell ein unsichtbares Fenster mit einer Nachrichtenschleife.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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