Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Mit DLLs arbeiten (https://www.delphipraxis.net/106502-mit-dlls-arbeiten.html)

Christian18 11. Jan 2008 19:52


Mit DLLs arbeiten
 
Hallo,

ich habe eine Funktion programmiert, die mir einen bestimmten String zusammen baut. Diese Funktion möchte ich in eine DLL auslagern. Ich habe irgendwie gehört, dass es nicht funktionieren soll. Ich habe auch schon vor einiger zeit mal was probiert und das hat auch nicht funktioniert. Ist es überhaupt möglich mit Dlls String übergeben zu lassen?

so baue ich meine DLLs immer aus:

Delphi-Quellcode:
library Project1;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß die
  erste Unit im Uses-Anweisungsteil des Interface-Abschnitts Ihrer
  Unit sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die
  String-Parameter oder Funktionsergebnisse übergeben. Dies gilt für
  alle Strings die an und von Ihrer DLL übergeben werden --  selbst
  für diese, die in Records oder Klassen verschachtelt sind. ShareMem
  ist die Schnittstellen-Unit zur DELPHIMM.DLL, welche Sie mit Ihrer
  DLL weitergeben müssen. Um die Verwendung von DELPHIMM.DLL zu
  vermeiden, übergeben Sie String-Parameter unter Verwendung von
  PChar- oder ShortString-Parametern. } 

uses
  SysUtils,
  Classes;

function Rechne(a, b : Integer) : Integer;
begin
  Result:=a + b;
end;

exports
      Rechne name 'Rechne';

begin
end.
Importiert wird im Programm mit folgender Definition:
Delphi-Quellcode:
Rechne(a, b : Integer) : Integer; external 'Project1' name 'Rechne';

SirThornberry 11. Jan 2008 19:53

Re: Mit DLLs arbeiten
 
du hast die Lösung doch bereits selbst gepostet :wink: Lese dir mal den Text zwischen "library Project1;" und "uses" durch!!

[Edit]Es ist schicker hinter Externale den vollständigen Dateinamen zu schreiben ('Project1.dll' anstelle von 'Project1').
Und die explize Angabe von Name kannst du auch weglassen wenn die Funktion genau so heißt wie in der DLL.

Delphi-Quellcode:
Rechne(a, b : Integer) : Integer; external 'Project1.dll';
oder
Delphi-Quellcode:
Irgendwas(a, b : Integer) : Integer; external 'Project1.dll' name 'Rechne';

DeddyH 11. Jan 2008 19:56

Re: Mit DLLs arbeiten
 
Der Kommentar ist anscheinend nicht auffällig genug :D

Christian18 11. Jan 2008 20:07

Re: Mit DLLs arbeiten
 
Hallo,

ich glaube ich stehe gerade ein bisschen auf dem schlauch. Irgendwie verstehe ich den komentar nicht. kann mir das jemand nochmal verständlich erklären? Ich würde mich freuen.

MFg Christian18

DeddyH 11. Jan 2008 20:09

Re: Mit DLLs arbeiten
 
Delphi-Quellcode:
{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß die
  erste Unit im Uses-Anweisungsteil des Interface-Abschnitts Ihrer
  Unit sein, wenn Ihre DLL Prozeduren oder Funktionen exportiert, die
  String-Parameter oder Funktionsergebnisse übergeben. Dies gilt für
  alle Strings die an und von Ihrer DLL übergeben werden --  selbst
  für diese, die in Records oder Klassen verschachtelt sind. ShareMem
  ist die Schnittstellen-Unit zur DELPHIMM.DLL, welche Sie mit Ihrer
  DLL weitergeben müssen. Um die Verwendung von DELPHIMM.DLL zu
  vermeiden, übergeben Sie String-Parameter unter Verwendung von
  PChar- oder ShortString-Parametern. }
Der ist gemeint.

Christian18 11. Jan 2008 20:16

Re: Mit DLLs arbeiten
 
den kommentar meine ich jairgendwie verstehe ich den nicht.

DeddyH 11. Jan 2008 20:18

Re: Mit DLLs arbeiten
 
Wenn Du Strings an die DLL übergeben willst oder die DLL selbst Strings zurückgeben soll, musst Du ShareMem einbinden, und zwar als erste Unit (sowohl in der DLL als auch in der Anwendung). Der einfachere Weg ist allerdings, keine Strings zu übergeben, sondern PChars.

[edit] Nachtrag: wenn Du nicht auf Strings verzichten willst und den Weg über ShareMem gehst, musst Du zusätzlich zur Anwendung und der DLL noch die DELPHIMM.DLL an den Endkunden weitergeben, sonst nützt Dir ShareMem nichts. [/edit]

mkinzler 11. Jan 2008 20:26

Re: Mit DLLs arbeiten
 
Zitat:

wenn Du nicht auf Strings verzichten willst und den Weg über ShareMem gehst, musst Du zusätzlich zur Anwendung und der DLL noch die DELPHIMM.DLL an den Endkunden weitergeben, sonst nützt Dir ShareMem nichts.
Oder einen anderen Speichermanager wie z.B. FastMem verwenden, der das überflüssig macht

DeddyH 11. Jan 2008 20:29

Re: Mit DLLs arbeiten
 
Auf die Erwähnung alternativer Speichermanager hatte ich bewusst verzichtet, um die Verwirrung nicht noch größer zu machen ;)

dor557 11. Jan 2008 21:07

Re: Mit DLLs arbeiten
 
Ich verzichte auf Strings denn Pchar's sind nichts anderes und umwandeln ist einfach und die Speicherauslastung in der DLL und der anwendung ist auch gleiner.

Sollte man auf diese ShareMem dll nicht verzichten wird das Projekt unnötig in die Grösse gezogen.

Gruss Sascha


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:17 Uhr.
Seite 1 von 3  1 23      

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