Delphi-Quellcode:
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.
Welche Variante ist nun die richtige?
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
TDllProc(DLLProc) := DLLMain;
PS: In D7 ist TDllProc bereits ohne stdcall deklariert.