AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Anwendung mit DLL, für Delphi und C. C++ [ gelöst ]
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendung mit DLL, für Delphi und C. C++ [ gelöst ]

Ein Thema von Corpsman · begonnen am 14. Jun 2009 · letzter Beitrag vom 15. Jun 2009
Antwort Antwort
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#1

Anwendung mit DLL, für Delphi und C. C++ [ gelöst ]

  Alt 14. Jun 2009, 19:03
Guten Abend,

Ich bastle mir gerade eine Anwendung die in der Lage sein soll, DLL's dynamisch und auch Statisch mit ein zu binden.

Das alles ist dank der vielen Tutorials hier kein Problem gewesen. Ich habe mir dazu eine Demo Applikation gebastelt die ungefähr wie folgt aussieht :

HOST:
Delphi-Quellcode:

  (*
  Statisch eingebundene Procedure
  *)

Procedure ShowSomething(Value: Pchar); stdcall; external 'fst.dll';

  (*
  Dynamisch
  *)

Type
  TDLLProcedure = Procedure(Value: Pchar); stdcall;

Var
  DLLProcedure: TDLLProcedure;
  hDLL: THandle = 0;

Procedure LoadDLL_(DLLName: String);
Var
  buf: Array[0..144] Of char;
Begin
  If hdLl <> 0 Then unloadDLL_;
  hDLL := LoadLibrary(StrPCopy(buf, dllname));
  If hDLL <> 0 Then Begin
    Try
      @DLLProcedure := GetProcAddress(hdll, StrPCopy(buf, 'ShowSomething2'));
      (*
      warum wird hier auf @DLLProcedure geprüft und nicht auf
      DLLProcedure ??
      *)

      If @DLLProcedure = Nil Then
        Raise Exception.create('Error could not find Routine.');
    Except
      FreeLibrary(hDLL);
      hdll := 0;
      Raise;
    End;
  End
  Else
    Raise Exception.Create('Unable to load DLL.');
End;

Procedure UnloadDLL_;
Begin
  If hDLL <> 0 Then Begin
    FreeLibrary(hDLL);
    hdll := 0;
    DLLProcedure := Nil;
  End;
End;
So weit so gut, und das gezeigt funktioniert auch wunderbar.

Ich weis jetzt allerdings schon das später, in Ferner Zukunft meine DLL's durch DLL's ausgetauscht werden, welche in C, oder C++ geschrieben werden.

Und laut Delphi hilfe mus ich die Deklarationen dann anders schreiben, da ist die Rede von dem wörtchen "cdecl"

Nun die Frage , wie mus ich den Source in der Host Anwendung anpassen, bzw was mus ich meinen Bisherigen DLL's ändern damit das dann alles geht wie ichs mir vorstelle ?

Also sowohl der Statische Teil, wie auch das Dynamische Laden wird später mit den C DLL's sein.

Eigentlich klar, aber hier noch mal gezeigt, mein source aus den DLL's
Delphi-Quellcode:
Procedure ShowSomething(Value: Pchar); stdcall;
Var
  s: String;
Begin
  s := String(Value);
  showmessage('snd.dll:' + #13#10 + s);
End;

Procedure ShowSomething2(Value: Pchar); stdcall;
Var
  s: String;
Begin
  s := String(Value);
  showmessage('snd.dll:' + #13#10 + s);
End;

Exports

  ShowSomething,
  ShowSomething2;

Begin
End.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Anwendung mit DLL, für Delphi und C. C++

  Alt 14. Jun 2009, 19:09
cdel, stdcall, register etc. sind einfach nur Aufrufconventionen die festlegen wie die Parameter etc. in die Funktion kommen, wer das ganze abräumt etc. Entsprechend musst du einfach dort wo du jetzt stdcall geschrieben hast später cdecl schreiben. Und das natürlich auch nur wenn wirklich cdecl verwendet wird. In vielen Fällen wird, so wie du es jetzt in Delphi gemacht hast, explizit stdcall verwendet.

Wenn du deine jetzigen DLLs ausschließlich mit Delphi verwendest kannst du entsprechend das stdcall weg lassen so das die Delphi Standardaufrufart verwendet wird.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Anwendung mit DLL, für Delphi und C. C++

  Alt 14. Jun 2009, 19:23
Mein Delphi Programm bleibt ja gleich, nur die DLL's ändern sich.

Aber wenn ich dich richtig verstanden habe schreibe ich anstatt

StdCall einfach nur cdel in meinen DLL's und in der Host Anwendung. Un bin damit gerüstet auf spätere austauschaktionen der DLL's ?
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#4

Re: Anwendung mit DLL, für Delphi und C. C++

  Alt 14. Jun 2009, 20:44
Praktisch alle Compiler unterstützen die Aufrufkonvention stdcall. Problematisch wäre nur das Weglassen einer Angabe, weil dann automatisch Register verwendet würde - diese Aufrufkonvention wird nur von Delphi und dem C++-Builder unterstützt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#5

Re: Anwendung mit DLL, für Delphi und C. C++

  Alt 14. Jun 2009, 22:46
Kurzum, am besten (am einfachsten und üblichsten) du lässt deine Delphi-Anwendung, wie sie jetzt ist und benutzt auch bei den DLLs, die du in C schreibst, stdcall als Aufrufkonvention.

[Edit]Zu Aufrufkonventionen siehe auch deutsche Wikipedia Aufrufkonvention
Man kann einen Barbier definieren als einen, der alle diejenigen rasiert, und nur diejenigen, die sich nicht selbst rasieren.
Rasiert sich der Barbier?
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Anwendung mit DLL, für Delphi und C. C++ [ gelöst ]

  Alt 15. Jun 2009, 06:01
Super Danke für eure Hilfe...
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:29 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