Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi dll Problem (https://www.delphipraxis.net/106485-dll-problem.html)

STS301 11. Jan 2008 15:33


dll Problem
 
Allmählich langt es mir mit den Fehlern, aber leider hat es den Anschein, dass mich die Bugs gerne haben und bei mir wohnen :( :(

Also

mache gerade das dll Tutorial in der dsdt und hänge, wenn ich die dll Datei mit einer Unit verbinden will.

wenn ich es in der VCL-Formularanwendung einfüge, dann sagt er mir:

[Fehler] Programm1.pas(5): E2070 Unbekannte Direktive: 'x'
[Fehler] Programm1.pas(11): E2003 Undefinierter Bezeichner: 'TForm'

x kann ich eigentlich nirgends definieren, damit er es erkennt.
er unterstreicht mir auch bei "TForm3 = class(TForm)" das (TForm).

"implementation" unterstreicht er mir auch, nur er nennt mir noch keinen Grund.

"I'm lost in Delphi!!"

DeddyH 11. Jan 2008 15:37

Re: dll Problem
 
Auf der verlinkten Seite kann ich kein TForm erkennen.

sirius 11. Jan 2008 15:38

Re: dll Problem
 
Was hast du denn wo gemacht. So kann ich schwer eine Aussage machen.

Wenn du natürlich in ein leeres Programm x:=addiere(4,5) ist mir klar, dass er x nicht kennt.

STS301 11. Jan 2008 15:41

Re: dll Problem
 
das ist mir ja auch klar, dass er kein x kennt, aber wo kann ich ihm sagen, was x ist ohne dass er mir es wieder als Fehler anrechnet.

hier der Code:
Delphi-Quellcode:
unit Programm1;

interface
function addiere(zahl1, zahl2: integer): integer; stdcall;
x:=addiere(12, 3);

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

type
  TForm3 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
implementation

function addiere(zahl1, zahl2: integer): integer; stdcall;
external 'rechnenpro.dll';

{$R *.dfm}

end.

sirius 11. Jan 2008 15:44

Re: dll Problem
 
Das x:=addiere kommt ha jauch nicht dahin, sondern dort, wo du es brauchst. z.B. in einer Methode Button1Click, wo du dann x ausgibst (und als lokale Variable definiert hast; nur so als Beispiel).

DeddyH 11. Jan 2008 15:46

Re: dll Problem
 
Delphi-Quellcode:
unit Programm1;

interface
function addiere(zahl1, zahl2: integer): integer; stdcall;
//x:=addiere(12, 3); Quatsch! Das war doch nur Beispielcode für die Verwendung

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

type
  TForm3 = class(TForm)
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;
implementation

function addiere(zahl1, zahl2: integer): integer; stdcall;
external 'rechnenpro.dll';

{$R *.dfm}

end.

STS301 11. Jan 2008 15:50

Re: dll Problem
 
na gut, jetzt schreibt er mir

[Fehler] Programm1.pas(6): E2029 Deklaration erwartet, aber 'USES' gefunden

und unterstreicht mir uses, und Button1.click

sirius 11. Jan 2008 16:12

Re: dll Problem
 
nimm mal die deklaration von function oberhalb von uses raus.

STS301 11. Jan 2008 16:19

Re: dll Problem
 
:thumb:
zwischen den einzellnen Delphis gibt es leider immer wieder so kleine Bugs, aber danke an euch

STS301 11. Jan 2008 16:35

Re: dll Problem
 
habe das tutorial jetzt abgeschlossen, nur weiß ich ncht wie man zb. das Ergebnis ausgibt, mit label.caption wie üblich funktioniert es nicht ...

dor557 11. Jan 2008 16:46

Re: dll Problem
 
wie sieht denn der Code aus ? so :

Delphi-Quellcode:
 
var x : Integer;

begin
  x := Addiere(12,31);
  Label1.Caption := inttostr(x);
end;
oder wie ???

STS301 11. Jan 2008 16:51

Re: dll Problem
 
zur Zeit so

Delphi-Quellcode:
unit Einbinden1;

interface

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

type
  TForm3 = class(TForm)
    Label1: TLabel;
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation
type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall;

function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion;
    Handle: THandle;
begin
Handle := LoadLibrary(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;
FreeLibrary(Handle);

{$R *.dfm}
  end;
end;
end.

DeddyH 11. Jan 2008 17:01

Re: dll Problem
 
Delphi-Quellcode:
unit Einbinden1;

interface

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

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

var
  Form3: TForm3;

implementation

{$R *.dfm}

type TSummenFunktion = function(zahl1, zahl2: integer): integer; stdcall;

function addieren(zahl1, zahl2: integer): integer;
var SummenFunktion: TSummenFunktion;
    Handle: THandle;
begin
  Result := 0;
  Handle := LoadLibrary(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;
    FreeLibrary(Handle);
  end;
end;

procedure TForm3.Button1Click(Sender: TObject);
begin
  Label1.Caption := inttostr(addieren(15,2));
end;

end.
Getippt und nicht getestet.

STS301 11. Jan 2008 17:04

Re: dll Problem
 
er zeigt mir 0 an??, aber sonst funktioniert es

sirius 11. Jan 2008 17:08

Re: dll Problem
 
Es funktioniert nicht. Wahrscheinlich, weil es keine DLL namens "rechnen.dll" gibt.

Edit: [etwas fachübergreifendes] hier wäre wahrscheinlich eine Exception ganz angebracht :mrgreen:

dor557 11. Jan 2008 17:09

Re: dll Problem
 
Du hast warscheinlich vergessen eine Funktion zu erstellen die das auch aufruft !!

mach mal Folgendes :

erstelle auf dem Formular einen Button und Klicke den doppelt an dann hast du normal folgenden Code :

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin

end;
und da fügst du dann folgendes ein :

Delphi-Quellcode:
  Label1.Caption := inttostr(addieren(1,2));
dann müsste das Ergebnis so aussehen :

Delphi-Quellcode:
procedure TForm3.Button1Click(Sender: TObject);
begin
   Label1.Caption := inttostr(addieren(1,2));
end;
dann starte das Programm und kliche auf den button und dann wirst du sehen das das Label eine 3 anzeigt.

Gruss Sascha

(Habe es bei mir getestet geht !)

Was du auch beachten solltest (Habe ich eben getestet) das die dll auch im gleichen verzeichnis ist, wie das Programm. und das der Name stimmt. wen ich die dll lösche bekomme ich auch eine 0 !

Gruss Sascha

DeddyH 11. Jan 2008 17:10

Re: dll Problem
 
Du musst auch auf Groß- und Kleinschreibung achten.

STS301 11. Jan 2008 17:14

Re: dll Problem
 
:wall: :wall: :wall: :wall: :wall: :wall: :wall:

ich habe vorhin den Code aus dem Tutorial kopiert, da hies die dll Datei natürlich nicht so wie meins

@sascha, danke für die ausführliche Erklährung ;)

:wall: :wall: :wall: :wall: :wall: :wall: :wall:

jetzt funktioniert es danke an alle :thumb:

//edit: ich sollte doch schon ins Bett gehen :)

wicht 11. Jan 2008 17:16

Re: dll Problem
 
Hi!

Zuersteinmal hierzu:
Zitat:

zwischen den einzellnen Delphis gibt es leider immer wieder so kleine Bugs, aber danke an euch
Sicher, dass das ein Delphi-Bug ist?

Zum Rest.. Dein Quelltext gibt doch gar keinen Aufschluss darüber, was wo mit dem Ergebnis gemacht wird. Wenn Form3 erzeugt wurde und ein Label hat, sollte die Ausgabe funktionieren. Schöner wäre es auch, wenn das Addieren eine Funktion der Klasse TForm3 wäre.. aber das nur nebenbei.

Nachtrag: Mieser roter Kasten.. ich poste trotzdem!
Nachtrag2: Beim roten Kasten war deine Antwort noch nicht drin... naja, ignoriert mich :) .. ich lasse mir wohl immer viel Zeit beim schreiben und bearbeiten...

STS301 11. Jan 2008 17:24

Re: dll Problem
 
naja, kommt darauf an wie schwerwiegend man einen Bug aufnimmt, es sind eher kleine Codeunterschiede zwischen den einzellnen delphiversionen.

ja, die roten Kasten, da muss man einfach schneller schreiben lernen :-D :-D :-D


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