![]() |
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:
So weit so gut, und das gezeigt funktioniert auch wunderbar.(* 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; 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. |
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. |
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 ? |
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.
|
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 ![]() |
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 10:55 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 by Thomas Breitkreuz