![]() |
DLLProc richtig "erweitern"
Delphi-Quellcode:
Welche Variante ist nun die richtige?
type
TDllProc = procedure(Reason: Integer); {stdcall; ???} var DLLProcNext: TDllProc = nil; 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: ; end; if Assigned(DLLProcNext) then DLLProcNext(Reason); end; begin DLLProcNext := Pointer(InterlockedExchange(Integer(@DLLProc), Integer(@DLLMain))); DLLMain(DLL_PROCESS_ATTACH); end. Ich habe verschiedene Varianten von Nico und Assarbad gesehen. Bei der einen wird stdcall verwendet, bei der anderen nicht. Assarbad verwendet InterlockedExchange, hat aber bei dem Integer(@DLLProc) kein @ stehen, was sich bei D7 Personal nicht kompilieren lässt. Nico hat bei spotlite.de wiederum kein InterlockedExchange verwendet, sondern
Delphi-Quellcode:
PS: In D7 ist TDllProc bereits ohne stdcall deklariert.
TDllProc(DLLProc) := DLLMain;
|
Re: DLLProc richtig "erweitern"
Eine Vorlage könnte etwa so aussehen:
Delphi-Quellcode:
Hat den Vorteil, dass es bei Delphi 7 keine unnötigen Warnungen gibt und es auch mit Delphi 2,3,4,5 und 6 funktioniert.
library foo;
uses Windows; {$IFNDEF CONDITIONALDEFINE} // type def for Delphi 2-5 type TDLLProc = procedure(Reason: Integer); {$ENDIF} var DllProcNext: TDLLProc; // nil procedure LibraryProc(Reason: Integer); begin case Reason of DLL_PROCESS_ATTACH: DisableThreadLibraryCalls(HInstance); end; if Assigned(DllProcNext) then DllProcNext(Reason); end; begin DllProcNext := TDLLProc(DllProc); TDLLProc(DllProc) := LibraryProc; LibraryProc(DLL_PROCESS_ATTACH); end. (edit: Gross-/Kleinschreibung gefixt :)) |
Re: DLLProc richtig "erweitern"
Danke, wusste doch das da was fehlte:
Delphi-Quellcode:
War bei dem post im spotlight nicht dabei, oder ich hatte es übersehen.
DllProcNext := TDLLProc(DllProc);
|
Re: DLLProc richtig "erweitern"
Mein Fehler. Diese (offensichtliche) Zeile fehlt in dem Beitrag bei Spotlight :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:45 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