![]() |
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:
Dll-Code:
Delphi-Quellcode:
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....
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. Ich verzweifel noch bald an dem ganzen DLL-Kram-.- Gruß Neutral General |
Re: DLL EntryPoint
Hab zwar nie was mit der rundll32.exe gemacht, ist das nicht der Name eines Exports?
|
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 |
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. |
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 |
Re: DLL EntryPoint
Zitat:
Zitat:
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. |
Re: DLL EntryPoint
Bei seinem Code würde die Dll wieder entladen werden, da er einen neuen Thread erstellt.
|
Re: DLL EntryPoint
mhh also ich hab in CMD mal
Zitat:
Gruß Neutral General |
Re: DLL EntryPoint
Zitat:
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. |
Re: DLL EntryPoint
Warum eigentlich eine DLL und kein normales Programm?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:10 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