Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Dlls benutzen (https://www.delphipraxis.net/66664-dlls-benutzen.html)

mimi 2. Apr 2006 11:50


Dlls benutzen
 
Hallo,
ich habe heute angefangen eine eigne DLL zu schreiben sie sieht im moment genau so aus:
Delphi-Quellcode:
library myStringListDll;


uses
  SysUtils,Classes,dialogs;

{$R *.res}
procedure GibtNachricht_Aus(Str:Pchar); external 'myStringListDll.dll' index 1;

type
  TTest = class
  private
  public
    procedure GibtNachricht_Aus(str:Pchar);
  end;


procedure TTest.GibtNachricht_Aus;
begin
  ShowMessage(Str);
end;



exports
  GibtNachricht_Aus;
begin
end.
ich habe mir verschiende tutorials angesehen und das grundgerüst von meiner DLL davon abzuleiten.
Das beispiel mit der Classe habe ich in einem DelphiForum gefunden(weiß aber nicht mehr ob hier oder im DF)
mein ziel ist es eine eigne TStringList mit erweiterten funktionen zu entwicklen alles auch kein problem

ich versuche jetzt diese funktion wie folgt einzubinden(beispiel aus einem DLL tutor)
Delphi-Quellcode:
unit udll;

interface

uses windows,dialogs,SysUtils;

type
  PDRGibtNachrichtaus = procedure(Str:Pchar);
 
procedure LoadDll;
procedure GibtnachrichtAus(Test:PChar);cdecl;

var
  Nachricht:PDRGibtNachrichtaus = nil;
 
implementation

Function WhatIfNoEntry: Integer;
begin
  ShowMessage('Fehler');
  Halt;
end;

procedure LoadDll;
var
  lib:THandle;
begin
  lib := LoadLibrary('D:\Daten\eigene\delphi\dlls\myStringList\dll\myStringListDll.dll');

  case lib = 0 of
    TRUE: begin
      @Nachricht := @whatifnoentry;
      messagebox(0, 'DLL kann nicht geladen werde', nil, 0);
    end;
  else begin
    @Nachricht := GetProcAddress(lib, 'GibtnachrichtAus');

    if not Assigned(Nachricht) then
      @Nachricht := @whatifnoentry;
  end;
  end;
end;

procedure GibtnachrichtAus(Test:PChar);
begin
  Nachricht(test);
end;

end.
Im Hauptform rufe ich dann nur noch Load auf ein gibtNachRichtAus doch leider wird nur die Function
whatifnoentry weil so vermute ich bei @Nachricht := GetProcAddress(lib, 'GibtnachrichtAus'); irgenwas schiefläuft.

Kann mir jemand sagen was ich falsch mache ?
mein ziel ist es eine eigne klasse in ein DLL zu packen - eigentlich nicht weiter schwirig trotzdem habe ich probleme damit - leider -

Vielen dank im voraus für eure Hilfe :)

Christian Seehase 2. Apr 2006 11:58

Re: Dlls benutzen
 
Moin Michael,

bei GetProcAddress musst Du die Funktion exakt so schreiben, wie Du sie aus der DLL exportierst, in Deinem Falle also

Delphi-Quellcode:
@Nachricht := GetProcAddress(lib, 'GibtNachricht_Aus');

SirThornberry 2. Apr 2006 12:01

Re: Dlls benutzen
 
du musst noch eine Instanz der Klasse innerhalb der DLL erstellen und dann eine Funktion schreiben welche die Instanz aufruft. Derzeit importierst du in deiner DLL die gleiche Funktion aus eben der gleichen DLL

mimi 2. Apr 2006 14:19

Re: Dlls benutzen
 
Könntes du mir ein kleines beispiel geben ?
ich habe das jetzt so:
Delphi-Quellcode:
procedure GibtNachricht_Aus1(Str:Pchar); external 'myStringListDll.dll' index 1;

type
  TTest = class
  private
  public
    procedure GibtNachricht_Aus(str:Pchar);
  end;


procedure TTest.GibtNachricht_Aus;
begin
  ShowMessage(Str);
end;

var
  t:TTest;
begin
  t:=TTest.create;
  t.GibtNachricht_Aus('test');

end.

exports
  GibtNachricht_Aus;
jetzt kommt Test gleich beim starten der anwendung ist ja auch klar warum. aber ich möchte gerine das gibtNachricht_Aus erst aufgerufen wird wenn ich den Button drücke die klasse soll schon vohrer installisiert werden. wenn .ich dann auf den button drücke kommt nur die meldung: Fehler.

mimi 2. Apr 2006 14:20

Re: Dlls benutzen
 
achja aufrufen tue ich sie von Form1 so :
Delphi-Quellcode:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    BitBtn1: TBitBtn;
    Label1: TLabel;
    Edit1: TEdit;
    procedure FormCreate(Sender: TObject);
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  LoadDll;
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
  GibtnachrichtAus('test');
end;

end.


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