Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Anwendung mit DLL, für Delphi und C. C++ [ gelöst ] (https://www.delphipraxis.net/135611-anwendung-mit-dll-fuer-delphi-und-c-c-%5B-geloest-%5D.html)

Corpsman 14. Jun 2009 19:03


Anwendung mit DLL, für Delphi und C. C++ [ gelöst ]
 
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.

SirThornberry 14. Jun 2009 19:09

Re: Anwendung mit DLL, für Delphi und C. C++
 
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.

Corpsman 14. Jun 2009 19:23

Re: Anwendung mit DLL, für Delphi und C. C++
 
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 ?

Apollonius 14. Jun 2009 20:44

Re: Anwendung mit DLL, für Delphi und C. C++
 
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.

Cyf 14. Jun 2009 22:46

Re: Anwendung mit DLL, für Delphi und C. C++
 
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

Corpsman 15. Jun 2009 06:01

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 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