Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DLLProc richtig "erweitern" (https://www.delphipraxis.net/26670-dllproc-richtig-erweitern.html)

scp 27. Jul 2004 12:37


DLLProc richtig "erweitern"
 
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
Delphi-Quellcode:
TDllProc(DLLProc) := DLLMain;
PS: In D7 ist TDllProc bereits ohne stdcall deklariert.

NicoDE 27. Jul 2004 14:42

Re: DLLProc richtig "erweitern"
 
Eine Vorlage könnte etwa so aussehen:
Delphi-Quellcode:
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.
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.
(edit: Gross-/Kleinschreibung gefixt :))

scp 27. Jul 2004 15:39

Re: DLLProc richtig "erweitern"
 
Danke, wusste doch das da was fehlte:
Delphi-Quellcode:
DllProcNext := TDLLProc(DllProc);
War bei dem post im spotlight nicht dabei, oder ich hatte es übersehen.

NicoDE 27. Jul 2004 16:47

Re: DLLProc richtig "erweitern"
 
Mein Fehler. Diese (offensichtliche) Zeile fehlt in dem Beitrag bei Spotlight :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.

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