Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion in DLL auslagern (https://www.delphipraxis.net/71353-funktion-dll-auslagern.html)

Christian18 13. Jun 2006 18:02


Funktion in DLL auslagern
 
Hallo,

wunsch eines Bekannten ist es eine Function in eine DLL auszulagern. Da ich dies noch nie gemacht habe, habe ich dazu ein paar Fragen. Mit hilfer der Delphi Hilfe habe ich mir folgende DLL zusammengebastelt.

Hier meine DLL:

Delphi-Quellcode:
library Project1;

uses
  SysUtils, Classes, Controls;

{$R *.res}

function Datum(datum : TDate) : String;
  var y : Word;   // Jahr
      m : Word;   // Monat
      d : Word;   // Tag
      r : String; // Rückgabe Wert
begin
  // Wochentag ermitteln
  case DayOfWeek(datum) of
    1 : r:='Sonntag, ';
    2 : r:='Montag, ';
    3 : r:='Dienstag, ';
    4 : r:='Mittwoch, ';
    5 : r:='Donnerstag, ';
    6 : r:='Freitag, ';
    7 : r:='Samstag, ';
  end;

  // Tag ermitteln
  DecodeDate(datum, y, m, d);
  r:=r + IntToStr(d) + '. ';

  // Monat ermitteln
  case m of
    1  : r:=r + 'Januar ';
    2  : r:=r + 'Februar ';
    3  : r:=r + 'März ';
    4  : r:=r + 'April ';
    5  : r:=r + 'Mai ';
    6  : r:=r + 'Juni ';
    7  : r:=r + 'Juli ';
    8  : r:=r + 'August ';
    9  : r:=r + 'September ';
    10 : r:=r + 'Obtober ';
    11 : r:=r + 'November ';
    12 : r:=r + 'Dezember ';
  end;

  // Jahr ermitteln
  r:=r + IntToStr(y);

  // Wert zurückgeben
  Result:=r;
end;

begin

end.
Wie kann ich die DLL jetzt in mein bestehendes Projekt einbinden und die Funktion aufrufen. Achso ein Parameter muß an die Funktion auch noch übergeben werden.

MFG Christian

DGL-luke 13. Jun 2006 18:06

Re: Funktion in DLL auslagern
 
du musst noch ein

Delphi-Quellcode:
exports
  Datum;
hinzufügen. Außerdem würde ich einen PChar zurückgeben, wenn das ganze auch über programmsprachengrenzen funktionieren soll, bzw. ShareMem einbinden, wenns nur Delphi<->Delphi funktionieren muss.

EDIT: aufrufen kannst du da über MSDN-Library durchsuchenloadmodule und MSDN-Library durchsuchengetprocaddress oder über Delphi-Referenz durchsuchenstatische linkung

SirThornberry 13. Jun 2006 18:17

Re: Funktion in DLL auslagern
 
vergiss loadmodule bitte ganz schnell und verwende lieber MSDN-Library durchsuchenLoadLibrary denn:
Zitat:

Note This function is provided only for compatibility with 16-bit versions of Windows. Applications should use the CreateProcess function.
die Funktion LoadModule wurde also durch CreateProcess ersetzt was etwas anderes macht als LoadLibrary

Christian18 13. Jun 2006 18:27

Re: Funktion in DLL auslagern
 
Erst einmal vielen dank für die schnelle hilfe.

ich habe es jetzt so gemacht.

hier mein DLL aufruf.

Delphi-Quellcode:
unit Unit1;

interface

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

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

var
  Form1: TForm1;

implementation

function Datum(date : TDate): String; stdcall;
external 'C:\DLLs\DLL1.dll';

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption:=Datum(now);
end;

end.
Es funktiojniert ja soweit. Aber wenn ich das zweite mal auf den Button klicke, dann kommt eine fehlermeldung.

Fehler: Ungültige Zeigeroperation.

NicoDE 13. Jun 2006 18:31

Re: Funktion in DLL auslagern
 
Die Unit ShareMem fehlt.
Delphi-Quellcode:
{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

Chewie 13. Jun 2006 18:34

Re: Funktion in DLL auslagern
 
In deiner DLL verwendest du die Aufrufkonvention register (da keine explizit angegeben), in der Host-Anwendung aber stdcall. Das kann nicht klappen. Entweder bei beiden register oder bei beiden stdcall. Wobei letzteres vorzuziehen ist, da andere Sprachen die Aufrufkonvention register u.U. nicht verstehen.

Hawkeye219 13. Jun 2006 18:46

Re: Funktion in DLL auslagern
 
Hallo Christian,

die Unit SysUtils stellt übrigens auch noch andere nützliche Funktionen zur Verfügung:

Delphi-Quellcode:
function Datum (aDatum: TDate): string;
begin
  Result := FormatDateTime('dddd, d. mmmm yyyy', aDatum);
end;
Gruß Hawkeye

Hobby-Programmierer 13. Jun 2006 21:14

Re: Funktion in DLL auslagern
 
Nabend ..., :-D
Zitat:

Zitat von Christian18
Delphi-Quellcode:
  // Wochentag ermitteln
  case DayOfWeek(datum) of
    1 : r:='Sonntag, ';
    2 : r:='Montag, ';
    3 : r:='Dienstag, ';
    4 : r:='Mittwoch, ';
    5 : r:='Donnerstag, ';
    6 : r:='Freitag, ';
    7 : r:='Samstag, ';
  end;

  // Monat ermitteln
  case m of
    1  : r:=r + 'Januar ';
    2  : r:=r + 'Februar ';
    3  : r:=r + 'März ';
    4  : r:=r + 'April ';
    5  : r:=r + 'Mai ';
    6  : r:=r + 'Juni ';
    7  : r:=r + 'Juli ';
    8  : r:=r + 'August ';
    9  : r:=r + 'September ';
    10 : r:=r + 'Obtober ';
    11 : r:=r + 'November ';
    12 : r:=r + 'Dezember ';
  end;

Zumindest würde ich obiges ersetzen ->
Delphi-Quellcode:
var LongDayNames: array[1..7] of string;
var LongMonthNames: array[1..12] of string;
LG Mario


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