AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion in DLL auslagern

Ein Thema von Christian18 · begonnen am 13. Jun 2006 · letzter Beitrag vom 13. Jun 2006
Antwort Antwort
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:02
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
  Mit Zitat antworten Zitat
Benutzerbild von DGL-luke
DGL-luke

Registriert seit: 1. Apr 2005
Ort: Bad Tölz
4.149 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:06
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
Lukas Erlacher
Suche Grafiktablett. Spenden/Gebrauchtangebote willkommen.
Gotteskrieger gesucht!
For it is the chief characteristic of the religion of science that it works. - Isaac Asimov, Foundation I, Buch 1
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:17
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#4

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:27
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.
  Mit Zitat antworten Zitat
NicoDE
(Gast)

n/a Beiträge
 
#5

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:31
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. }
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:34
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Hawkeye219

Registriert seit: 18. Feb 2006
Ort: Stolberg
2.227 Beiträge
 
Delphi 2010 Professional
 
#7

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 19:46
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
  Mit Zitat antworten Zitat
Hobby-Programmierer

Registriert seit: 19. Jan 2006
Ort: München
392 Beiträge
 
Delphi XE Starter
 
#8

Re: Funktion in DLL auslagern

  Alt 13. Jun 2006, 22:14
Nabend ...,
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
Mario
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:00 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