![]() |
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.
|
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] |
Re: Mit DLLs arbeiten
@Jens: wie bitte?
|
Re: Mit DLLs arbeiten
Zitat:
Delphi-Quellcode:
Die Zeiten von StrPas, StrCopy und Konsorten sind ja Gott sei Dank vorbei.
Bla := Funktion_aus_DLL(PChar(String_aus_Anwendung));
|
Re: Mit DLLs arbeiten
Zitat:
|
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 |
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); ![]() |
Re: Mit DLLs arbeiten
Zitat:
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... :? |
Re: Mit DLLs arbeiten
Zitat:
Delphi-Quellcode:
DLLUnit:
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.
Delphi-Quellcode:
Und die Hauptunit des aufrufenden Programms:
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.
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. |
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. |
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