AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Meine erste Butterfahrt - Eine dll mit dem BCB erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

Ein Thema von messie · begonnen am 8. Feb 2010 · letzter Beitrag vom 10. Mär 2010
Antwort Antwort
Seite 1 von 3  1 23      
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#1

Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 8. Feb 2010, 18:19
Moin,

mit dlls habe ich mich bisher wenig beschäftigt, ich möchte aber Anzahl Berechnungen in eine dll kapseln. Die liegen im BCB vor, also wollte ich die dll auch dort erstellen und später aus dem BCB und Delphi darauf zugreifen.

Dabei bin ich schon beim Assistenten zum Erstellen gestolpert: Quelltyp C++ ist mir klar, VCL verwenden ist für Berechnungen nicht erforderlich, ebensowenig Multi-Threading. Aber "dll im VC++-Stil"?? Was ist denn dann anders?

Gibt es irgendwo ein Tutorial, wo man sich das mal reinziehen kann? Was ist einfacher? Die dll in Delphi zu erstellen und eine C-Headerdatei zu bauen oder wie geplant eine C++-dll in Delphi nutzen?

Grüße, Messie
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 8. Feb 2010, 18:26
Solange du nichts delphispezifisches in der DLL nutzt (also alles was die Unit ShareMem voraussetzt, z.B. Delphi-Strings oder dynamische arrays im Delphi-Stil), und für jede Funktion/Prozedur stdcall als Aufrufkonvention nutzt, ist eine Delphi-DLL aus Interface-Sicht nicht von einer C++ DLL zu unterscheiden. (Name-Mangling mal aussen vor, falls das hier überhaupt mit reinspielt.)
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 11. Feb 2010, 16:26
So,

das waren ja Krämpfe, aber mit dem Builder geht es jetzt. Lustig ist, dass sich das dll-Projekt nach dem Erstellen der dll selbst zerstört
Ich habe jetzt zum Probieren eine dll gebaut:
Code:
extern "C" __declspec(dllexport) double Multi(double Zahl1, double Zahl2);

double Multi(double Zahl1, double Zahl2)
{
  double result;
  result = Zahl1 * Zahl2;
  return result;
}
Wozu das alles entscheidende extern "C" reinmuss, ist mir nicht ganz klar geworden.

Nun wollte ich die Funktion mal in einem Delphi-Projekt testen. Dazu erstmal statisch geladen:
Delphi-Quellcode:
var
  Form1: TForm1;
  function Multi(Zahl1 : double;Zahl2:double) : double; external 'Project9.DLL';


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  test : double;
begin
  test := Multi(9,6);
  ShowMessage(FloatToStr(test));
end;
Da wird der Prozedureinsprungpunkt "Multi" nicht gefunden. Was habe ich da falsch gemacht?
Beim Builder kann man das statische Laden durch Einbinden der lib in das Projekt erledigen. Gibt es etwas Vergleichbares in Delphi?

Danke, Messie

Edit: Ich habe mich gerade mal kurz in den Dependency Walker eingelesen und damit herausgefunden, wie die Prozedur tatsächlich heißt ("_Multi").
Ist denn das eine Festlegung, dass der Unterstrich immer da ist, wenn ich extern "C" benutze?
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 11. Feb 2010, 16:43
Zitat von messie:
Beim Builder kann man das statische Laden durch Einbinden der lib in das Projekt erledigen. Gibt es etwas Vergleichbares in Delphi?
Wirst wohl
Delphi-Quellcode:
 
LoadLibrary (PChar (FN));
...
@Proc := GetProcAddress (HW, 'Xyz');
...
Proc (...);
...
FreeLibrary (HW);
verwenden müssen, für einzelne Calls auch kein Problem;
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 13:04
Moin,

nochmal eine andere Frage zum Thema: der Linker meckert die Exceptions an. Ist in dlls ein try...catch - Block zulässig?

Grüße, Messie
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 13:43
Hallo,

Zitat:
_Multi
Ist denn das eine Festlegung, dass der Unterstrich immer da ist, wenn ich extern "C" benutze
Jepp.
Damit können mit verschiedenen C-Compilern erstellte Objekt-Dateien
verwendet werden, quasi kleinster gemeinsamer Nenner für Methoden-Beschreibung.

Ohne das extern "C" wird der Name durch Name-Mangling erzeugt,
der die Anzahl und Art der Parameter beinhaltet,
z.B. _Multi@36
Damit können überladene Methoden unterschieden werden.
Jeder Compiler macht das aber anders.

Zitat:
Beim Builder kann man das statische Laden durch Einbinden der lib in das Projekt erledigen. Gibt es etwas Vergleichbares in Delphi?
Das hast du mit dem external ja in etwa schon gemacht.

function Multi(Zahl1 : double;Zahl2:double) : double; external 'Project9.DLLname '_Multi';
Heiko
Heiko
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 14:41
Nochmal eine Frage: ich muss jetzt eine ganze Menge Parameter übergeben. Das wird nicht wirklich übersichtlich. Ein record oder ein struct wäre sinnvoll. Das werde ich ja nicht direkt als Parameter übergeben können, oder vielleicht doch?
Oder muss ich die Struct im Programm ebenso wie in der dll definieren und dann vom Programm aus einen Pointer draufsetzen? Wie gebe ich den Pointer nach der Berechnung wieder ans Programm zurück?

Danke, Messie
  Mit Zitat antworten Zitat
Benutzerbild von Jaynder
Jaynder

Registriert seit: 2. Dez 2004
Ort: Süderelbe
134 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 15:48
definiere den Record-Typen und übergebe ihn als const- oder var-Parameter, dann kommt auf jeden fall in der dll der Pointer an. Kannst du dann dort direkt ändern. Du muss natürlich darauf achten, das das C-struc exakt übereinstimmt, z.b. der align-Parameter muss passen. Schreibe am besten eine Assertion mit der konkreten "sizeof" der Delphi- und C-Typen, dann wird es schon passen. Oder schreibe einen call, der den ersten und letzen Parameter gezielt verändert (z.B. Inc oder *2) und prüfe nach dem Aufruf, ob der Wert sich wie gewollt verändert hat. Dann kannst du sicher sein, das die beiden Typen zueinander passen.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.276 Beiträge
 
Delphi 10.4 Sydney
 
#9

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 18:01
Hallo,

in Delphi nimmst du einen var-Parameter,
das ist dann automatisch ein Pointer.

Den Record musst du natürlich in Delphi und in BCB je einmal definieren,
packed record wäre mal ein Stichwort.

In der C-DLL ist der var-Parameter dann ein Pointer-Parameter.


BTW:
Kleiner Hinweis: BCB kann auch Pas-Dateien kompilieren ...


Heiko
Heiko
  Mit Zitat antworten Zitat
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Meine erste Butterfahrt - Eine dll mit dem BCB erstellen

  Alt 12. Feb 2010, 18:14
Zitat von hoika:
Hallo,

in Delphi nimmst du einen var-Parameter,
das ist dann automatisch ein Pointer.

Den Record musst du natürlich in Delphi und in BCB je einmal definieren,
packed record wäre mal ein Stichwort.

In der C-DLL ist der var-Parameter dann ein Pointer-Parameter.


BTW:
Kleiner Hinweis: BCB kann auch Pas-Dateien kompilieren ...


Heiko
Danke, ich werde mich da mal reinwurschteln.

Die Routinen liegen bereits als BCB-Code vor und ich möchte sie nicht erst in Delphi umbasteln.

Grüße, Messie
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07:20 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