Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Definition DLLProc-Variable in Delphi7 (https://www.delphipraxis.net/151785-definition-dllproc-variable-delphi7.html)

bubuu 1. Jun 2010 15:34


Definition DLLProc-Variable in Delphi7
 
Hallo,
Ich habe zig Foren etc. durchpflügt und meinte begriffen zu haben, wie man ein DLL mit Hilfe einer call-back Funktion initialisieren kann. Mein Dll - etwas abgekürzt - sieht so aus:
Delphi-Quellcode:
library Rpc_2;


uses
  System, SysUtils, Classes, Windows,
  AT91def in 'AT91def.pas',
  RPC in 'RPC.pas',
  Link in 'Link.pas' {CIF};

{$R *.res}
var
  DLLProcNext: procedure(Reason: Integer); stdcall = nil;
  DLLProc: TDLLProc;

// exported functions ==========================================================

  function WhoAmI(var v: Cardinal; var s: PChar): EStatus; stdcall; export;
  var str: string;
  begin
    Result := Remote.WhoAmI(v, str);
    s := PChar(str);
  end;

  function SetROMP(irom: TIROM): EStatus; stdcall; export;
  begin
    Result := Remote.SetROMP(irom);
  end;

  function GetROMP( var irom: TIROM; var romstatus: Cardinal ): EStatus; stdcall; export;
  begin
    Result := Remote.GetROMP(irom, romstatus);
  end;


exports
  WhoAmI, SetROMP, GetROMP;

// initialisation routine called by system =====================================

  procedure IniRpc(Reason: Integer); stdcall;
  begin
    case Reason of
      DLL_PROCESS_ATTACH:
        DisableThreadLibraryCalls(hInstance);
      DLL_THREAD_ATTACH:
      ;
      DLL_THREAD_DETACH:
      ;
      DLL_PROCESS_DETACH:
      ;
    end;
    if Assigned(DLLProcNext) then DLLProcNext(Reason);
  end;

begin
    DLLProcNext := Pointer(InterlockedExchange(Integer(DLLProc), Integer(@IniRpc)));
    IniRpc(DLL_PROCESS_ATTACH);
end.
Wenn ich das compiliere, so kriege ich Fehler wegen des Typs TDLLProc. Ersetze ich diesen Typ durch Pointer, so kommt der Fehler, weil die Systemvariable DLLProc Delphi 7 nicht bekannt ist.
Frage 1: Wo sind TDLLProc und DLLProc definiert und wie komm ich da ran?

Die Variable CIF, definiert in der Unit Link.pas müsste initialisiert werden. Das würde man wohl nach dem Aufruf von disableThreadLibraryCalls-Aufruf in IniRpc machen - aber
Frage 2:Wie das? Bei einer Application sieht das ja so aus:
Delphi-Quellcode:
  Application.CreateForm(TCIF, CIF);
und in einer DLL?
Mit Dank und Gruss bubuu

sirius 1. Jun 2010 15:49

Re: Definition DLLProc-Variable in Delphi7
 
DLLProc ist eine globale Variable in der Unit System (die immer eingebunden ist). Die brauchst/darfst du nicht extra deklarieren

rollstuhlfahrer 1. Jun 2010 15:51

Re: Definition DLLProc-Variable in Delphi7
 
zu 2.: CIF := TCIF.Create(nil);

Bernhard

bubuu 1. Jun 2010 17:19

Re: Definition DLLProc-Variable in Delphi7
 
Zu 1.
Zitat:

DLLProc ist eine globale Variable in der Unit System (die immer eingebunden ist). Die brauchst/darfst du nicht extra deklarieren
Ja, so habe ich das auch verstanden. Doch Delphi stolpert über die erste Erwähnung von DLLProc - ob man nun System in der uses-Liste drin hat oder nicht
Delphi-Quellcode:
begin
    DLLProcNext := Pointer(InterlockedExchange(Integer(DLLProc), Integer(@IniRpc)));
mit der Meldung:
Zitat:

[Fehler] Rpc_2.dpr(143): Nicht genügend wirkliche Parameter
Der Cursor steht dabei hinter Integer(DLLProc). Und da bin ich echt ratlos :wall:

Zu 2. Für den Tip
Zitat:

CIF := TCIF.Create(nil);
mal besten Dank. Ich werd das ausprobieren wenn obiges Problem gelöst ist.

himitsu 1. Jun 2010 18:15

Re: Definition DLLProc-Variable in Delphi7
 
Integer(@DLLProc)

Sonst würde es ja heißen du willst DLLProc aufrufen und dessen Result nach Integer casten. :zwinker:

bubuu 2. Jun 2010 10:39

Re: Definition DLLProc-Variable in Delphi7
 
Mein Kommentar zu himitsu, bzw. dem fehlenden @: Du hast natürlich völlig recht. Ich könnte mir die Haare raufen - soweit noch vorhanden :wink: , dass ich das nicht selbst gemerkt habe. Danke für den Tip.

Nun compiliert meine dll. Und damit geht's jetzt an den Gebrauch dieser Ware. Allen Ratgebern herzlichen Dank.
bubuu

TERWI 1. Apr 2013 10:42

AW: Definition DLLProc-Variable in Delphi7
 
Ich wärm das hier mal auf, weil gleiches Problem - gehabt.
Aber ein weiteres (auch lösbares) kommt hinzu:

procedure IniRpc(Reason: Integer); stdcall; <- wenn ich hier mit dem stdcall kompiliere, geht das laden der DLL im Programm völlig in die Uhr mit zig Fehlermeldungen.

Lasse ich das stdcall weg, ist alles gut.

Kann das jemand erklären ?

Christian Seehase 2. Apr 2013 09:03

AW: Definition DLLProc-Variable in Delphi7
 
Moin,

wenn die Deklaration der Aufrufkonvention in der DLL und im Programm nicht übereinstimmen kommt es zu Fehlern.


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