AGB  ·  Datenschutz  ·  Impressum  







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

Mit DLLs arbeiten

Ein Thema von Christian18 · begonnen am 11. Jan 2008 · letzter Beitrag vom 8. Mär 2008
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#11

Re: Mit DLLs arbeiten

  Alt 11. Jan 2008, 21:12
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Mit DLLs arbeiten

  Alt 11. Jan 2008, 21:20
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]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#13

Re: Mit DLLs arbeiten

  Alt 11. Jan 2008, 21:21
@Jens: wie bitte?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Mit DLLs arbeiten

  Alt 11. Jan 2008, 21:55
Zitat von SirThornberry:
Wenn man viel mit WinApi-Funktionen gearbeitet hat...
Und auch wenn nicht, ist es ja kein Thema, so etwas zu schreiben:Bla := Funktion_aus_DLL(PChar(String_aus_Anwendung)); Die Zeiten von StrPas, StrCopy und Konsorten sind ja Gott sei Dank vorbei.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DMW

Registriert seit: 6. Sep 2006
Ort: Münster
269 Beiträge
 
Delphi XE Professional
 
#15

Re: Mit DLLs arbeiten

  Alt 11. Jan 2008, 22:06
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.
Moritz
  Mit Zitat antworten Zitat
Christian18

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

Re: Mit DLLs arbeiten

  Alt 12. Jan 2008, 12:33
Hallo,

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

MFG Christian18
  Mit Zitat antworten Zitat
Benutzerbild von STS301
STS301

Registriert seit: 6. Nov 2007
668 Beiträge
 
Delphi 7 Personal
 
#17

Re: Mit DLLs arbeiten

  Alt 12. Jan 2008, 12:35
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
Sebastian

ölpölp

Linux will rule the universe!!
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#18

Re: Mit DLLs arbeiten

  Alt 12. Jan 2008, 13:09
Zitat von DMW:
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...
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#19

Re: Mit DLLs arbeiten

  Alt 12. Jan 2008, 13:20
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Henry
Henry

Registriert seit: 7. Okt 2003
Ort: Berlin
120 Beiträge
 
Delphi 6 Professional
 
#20

Re: Mit DLLs arbeiten

  Alt 7. Mär 2008, 16:40
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.
mfG Henry
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 22:03 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