Delphi-PRAXiS
Seite 2 von 3     12 3      

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)

DeddyH 11. Jan 2008 21:12

Re: Mit DLLs arbeiten
 
Ich bin auch bereits vor Jahren dazu übergegangen, im Zusammenhang mit DLLs PChars zu verwenden. Ist ja nicht mehr so ein Akt mit dem Typecasting wie noch zu Win16-Zeiten.

SirThornberry 11. Jan 2008 21:20

Re: Mit DLLs arbeiten
 
Wenn man viel mit WinApi-Funktionen gearbeitet hat ist man die Arbeit mit PChars gewohnt so das man auch nicht casten muss sondern einfach nur mit Speicheradressen rum hantiert. Wenn man sich dran gewöhnt hat genießt man voller Freunden die Geschwindigkeitsvorteile.

[Edit]Editiert weil es den Text nicht angezeigt hat *grübel*grummel*[/Edit]

DeddyH 11. Jan 2008 21:21

Re: Mit DLLs arbeiten
 
@Jens: wie bitte?

DeddyH 11. Jan 2008 21:55

Re: Mit DLLs arbeiten
 
Zitat:

Zitat von SirThornberry
Wenn man viel mit WinApi-Funktionen gearbeitet hat...

Und auch wenn nicht, ist es ja kein Thema, so etwas zu schreiben:
Delphi-Quellcode:
Bla := Funktion_aus_DLL(PChar(String_aus_Anwendung));
Die Zeiten von StrPas, StrCopy und Konsorten sind ja Gott sei Dank vorbei.

DMW 11. Jan 2008 22:06

Re: Mit DLLs arbeiten
 
Zitat:

Zitat von mkinzler
Oder einen anderen Speichermanager wie z.B. FastMem verwenden, der das überflüssig macht

Sicher? IIRC ist der Grund dafür, daß Strings referenzgezählt sind und deshalb möglicherweise von der DLL alloziert, aber von der Anwendung freigegeben werden könnten (oder natürlich umgekehrt), weshalb beide denselben Speichermanager benutzen müssen - was aber eigentlich doch nur mit einer zusätzlichen DLL geht.

Christian18 12. Jan 2008 12:33

Re: Mit DLLs arbeiten
 
Hallo,

ihr redet die ganze zeit von Pchar und so, hat jemand vieleicht mal ein kleines beispiel, wie sowas aussieht?

MFG Christian18

STS301 12. Jan 2008 12:35

Re: Mit DLLs arbeiten
 
Delphi-Quellcode:
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))+'rechenpro.dll'));

if Handle <> 0 then begin
    @SummenFunktion := GetProcAddress(Handle, 'addiere');
    if @SummenFunktion <> nil then begin
      result:=SummenFunktion(zahl1, zahl2);
    end;
FreeLibrary(Handle);
vielleicht hilft dir da etwas

Elvis 12. Jan 2008 13:09

Re: Mit DLLs arbeiten
 
Zitat:

Zitat von DMW
Zitat:

Zitat von mkinzler
Oder einen anderen Speichermanager wie z.B. FastMem verwenden, der das überflüssig macht

Sicher? IIRC ist der Grund dafür, daß Strings referenzgezählt sind und deshalb möglicherweise von der DLL alloziert, aber von der Anwendung freigegeben werden könnten (oder natürlich umgekehrt), weshalb beide denselben Speichermanager benutzen müssen - was aber eigentlich doch nur mit einer zusätzlichen DLL geht.

Wenn du in DLL und Echse FastMM benutzt dann gates auch ohne extra DLL.

Außerdem mein üblicher Hinweis bei dem Thema: WideString lässt sich ohne Tricksereien zwischen Echse und DLL (und auch anderen Sprachen, weil normaler OleString aka BSTR)

PChar zu verwenden, ohne eine Kopie des Strings zu übergeben ist ein wenig heikel.
Da Stringinstanzen in Delphi auf mehrere Referenzen verteilt sein könnten, könnten so aus Versehen auch andere Variablen/Felder mit dem ehemals gleichen Wert mitgeändert werden.
Nicht zu vergessen, dass das schnell sehr, sehr hässlicher Code wird... :?

DeddyH 12. Jan 2008 13:20

Re: Mit DLLs arbeiten
 
Zitat:

Zitat von Christian18
Hallo,

ihr redet die ganze zeit von Pchar und so, hat jemand vieleicht mal ein kleines beispiel, wie sowas aussieht?

MFG Christian18

Jepp, biddeschön. Die DLL (HauptUnit):
Delphi-Quellcode:
library TestDLL;

{ Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muss sich in der
  ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt-
  Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die
  Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle
  Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die
  sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur
  Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL.
  Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String-
  Informationen als PChar- oder ShortString-Parameter übergeben. }
 
uses
  DLLUnit in 'DLLUnit.pas';

exports Meldung;

begin
end.
DLLUnit:
Delphi-Quellcode:
unit DLLUnit;

interface

uses Windows;

function Meldung(sMeldung: PChar): DWORD;stdcall;

implementation

function Meldung(sMeldung: PChar): DWORD;stdcall;
begin
  Result := MessageBox(0,sMeldung,nil,0);
end;

end.
Und die Hauptunit des aufrufenden Programms:
Delphi-Quellcode:
unit AppUnit;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function Meldung(sMeldung: PChar): DWORD;stdcall;external 'TestDLL.dll';


procedure TForm1.FormCreate(Sender: TObject);
begin
  Meldung('Huhu');
end;

end.

Henry 7. Mär 2008 16:40

Re: Mit DLLs arbeiten
 
Hallo,

ich habe auch noch einmal eine Frage zu Strings und DLLs.

Kann ich innerhalb der DLL mit Strings arbeiten ohne das ich einen Speichermanager verwenden zu müssen?
Also zumindest wenn ich bei den exportierten Funktionen und Proceduren keinen String übergebe, sondern einen PChar.

Danke schon einmal für die Antwort.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:49 Uhr.
Seite 2 von 3     12 3      

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