Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Kleine Frage zum DLL einbinden (https://www.delphipraxis.net/38145-kleine-frage-zum-dll-einbinden.html)

Die Muhkuh 15. Jan 2005 10:48


Kleine Frage zum DLL einbinden
 
Hi,

ich hab mir eine kleine DLL geschrieben:

Delphi-Quellcode:
library Tests;

uses
  SysUtils,
  Classes,
  Windows;

{$R *.res}

function Send(Titel: PChar; Msg: Cardinal): Boolean;
var
  Handle: HWND;
begin
  Handle := FindWindow(Titel, nil);
  if Handle <> 0 then
  begin
    SendMessage(Handle, Msg, 0, 0);
    Result := true;
  end
  else
    Result := false;
end;

exports
    Send;

begin
end.
Ist nur eine Test DLL.

Jetzt gibts ja verschiedene Arten zum einbinden. Hier mal die, die ich kenne:

Delphi-Quellcode:
{ 1. Art }
unit auslagerdatei;

interface

uses
  Windows;

type
  TSummenFunktion = function (zahl1, zahl2: Integer) : Integer; stdCall;
  function addieren(zahl1, zahl2: integer): Integer;

implementation

function addieren(zahl1, zahl2: Integer): Integer;
var
  SummenFunktion: TSummenfunktion;
  Handle: THandle;
begin
  Handle := LoadLibary(PChar(ExtractFilePath(ParamStr(0)) + 'rechnen.dll'));
  if Handle <> 0 then
  begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');

    if @SummenFunktion <> nil then
    begin
      Result := SummenFunktion(zahl1, zahl2);
    end;
    FreeLibary(Handle);
  end;
end;

end.

{ 2. Art }
unit pro;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Send(Titel: PChar; Msg: Cardinal): Boolean; external 'Tests.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
  Send('Tf_MainProg', WM_CLOSE);
end;

end.
Das sind jetzt zwei unterschiedliche DLL's, aber das ist ja wurscht.

Welcher Weg ist denn der bessere?

Ultimator 15. Jan 2005 10:52

Re: Kleine Frage zum DLL einbinden
 
Kommt drauf an, ob du den Ladezeitpunkt der DLL selbst bestimmen können willst/musst (Mgl. 1), oder ob die gleich zum Progrmmstart geladen wird (das wäre Mgl. 2).

Mgl. 2 lässt das Programm gar nicht erst starten, wenn die DLL nicht gefunden wird, mit Mgl. 1 hab ich aber noch nicht gearbeitet ^^

Die Muhkuh 15. Jan 2005 10:57

Re: Kleine Frage zum DLL einbinden
 
Moin,

dann wird wohl die Mgl.1 die bessere sein, weil die DLL ja nicht ständig im Speicher gehalten werden muss oder?

Brauch ich dann für jede Funktion / Procedure der DLL immer ein Type?

Beispiel:

In der DLL "Test.dll" sind die funktionen addieren und subtrahieren.

Wie sind dann die Implementation der Mgl.1 aus?

So?
Delphi-Quellcode:
TAdd = function(Zahl1, Zahl2: Integer): Integer; stdcall;
function addiern(Zahl1, Zahl2: Integer): Integer;

TSub = function(Zahl1, Zahl2: Integer): Intger; stcall;
function subtrahieren(Zahl1, Zahl2: Integer): Integer; stdcall;

implementation

function addieren(zahl1, zahl2: Integer): Integer;
var
  Add: TAdd;
  Handle: THandle;
begin
  Handle := LoadLibary(PChar(ExtractFilePath(ParamStr(0)) + 'test.dll'));
  if Handle <> 0 then
  begin
    @Add := GetProcAddress(Handle, 'addiere');

    if @Add <> nil then
    begin
      Result := Add(zahl1, zahl2);
    end;
    FreeLibary(Handle);
  end;
end;

{ Das gleiche noch mit subtrahieren }
Geht das dann nicht komfotabler?

stefan2005 15. Jan 2005 12:20

Re: Kleine Frage zum DLL einbinden
 
hi,
nein du brauchst in diesem Fall keinen neuen Typ, weil ja TAdd und TSub gleich sind.
d.h. du kannst 2 mal den Typ TAdd (dann vielleicht unter einemn anderen Namen) verwenden.

cu,
stefan2005

Die Muhkuh 15. Jan 2005 12:25

Re: Kleine Frage zum DLL einbinden
 
Zitat:

Zitat von stefan2005
hi,
nein du brauchst in diesem Fall keinen neuen Typ, weil ja TAdd und TSub gleich sind.
d.h. du kannst 2 mal den Typ TAdd (dann vielleicht unter einemn anderen Namen) verwenden.

cu,
stefan2005

Hi,

das ist ja praktisch. Wenn ich 10 functionen hab, die genau die gleichen Parameter haben, langt ein Typ?

Das ist nicht schlecht :)


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