Entwickler-Ecke
Dateizugriff - DLL funktioniert - trotzdem Fehlermeldung beim compilen
spoof - Mo 11.11.13 17:42
Titel: DLL funktioniert - trotzdem Fehlermeldung beim compilen
Hey, habe mich mal etwas mit Dll´s beschäftigt, erstmal um zu verstehen wie sie überhaupt funktionieren.
Ich denke das hab ich soweit verstanden, allerdings ist mir gerade was komisches passiert was ich nicht verstehe:
Ich hab ein Beispielcode für eine Verschlüsselung in MD5, welche aus der DLL abgerufen werden soll.
Dazu hab ich eine .pas erstellt mit dem verschlüsselungs Algorithmus, diese .pas habe ich in den Ordner meines DLL Projektes gemacht, die DLL sieht wie folgt aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| library dbtest;
uses md5 in 'md5.pas';
{$R *.res}
function MD5String(str: WideString): WideString; stdcall; begin Result := MD5.MD5Print(MD5.MD5String(str)); end;
exports MD5String;
begin
end. |
Wenn ich jetzt versuche die DLL zu compilen kommt diese Fehlermeldung:
Ohne Angabe einer Host-Anwendung kann das Projekt nicht ausgeführt werden. Verwenden Sie das Dialogfeld Start|Parameter...
Die DLL wird trotzdem im Projektordner erstell (nicht wie üblich im Win32 Ordner innerhalb des Projekt Ordners).
Wenn ich jetzt die DLL mit meiner exe:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55:
| unit Unit1;
interface
uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Edit1: TEdit; Edit2: TEdit; procedure Button1Click(Sender: TObject); procedure FormCreate(Sender: TObject); private public end;
var Form1: TForm1; PATH: string;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject); begin PATH := ExtractFilePath(ParamStr(0)); end;
procedure TForm1.Button1Click(Sender: TObject); type TPluginName = function (str: WideString): WideString; stdcall; var hDLL : tHandle; FPName: TPluginName; begin hDLL := LoadLibrary(pChar(PATH+'dbtest.dll')); if hDLL = 0 then begin showmessage('Die Datei dbtest.dll wurde nicht gefunden'); Exit; end; try FPName := GetProcAddress(hDLL, 'MD5String'); if Assigned(FPName) then Edit2.text := FPName(Edit1.Text); except ShowMessage('Funktion "MD5String" der DLL konnte nicht ausgeführt werden.'); end; end; end. |
Benutze funktioniert es.
Also, viel Text, kurze Frage, wie löse ich die Fehlermeldung :)
Mathematiker - Mo 11.11.13 17:47
Hallo,
spoof hat folgendes geschrieben : |
Wenn ich jetzt versuche die DLL zu compilen kommt diese Fehlermeldung:
Ohne Angabe einer Host-Anwendung kann das Projekt nicht ausgeführt werden. Verwenden Sie das Dialogfeld Start|Parameter...
... kurze Frage, wie löse ich die Fehlermeldung :) |
Genau so, wie Delphi es sagt.
Über den Menüpunkt Start|Parameter trägst Du unter Host-Anwendung den Namen Deiner Exe ein, am Besten in dem Du sie mit "Durchsuchen" auswählst.
Danach ist die Fehlermeldung weg.
Beste Grüße
Mathematiker
spoof - Mo 11.11.13 18:04
Danke :)
Eben noch ne andere Frage zum selben Thema, ich hab jetz eine Dll erstellt welche nichts anderes enthält als eine Function welche in eine .pas geht und dort den MD5 erstellt.
Theoretisch könnte ich doch den Code, welcher in der .pas steht, in die DLL schreiben. Oder geht das nicht?
Das Tutorial:
http://fluuux.de/2012/03/funktion-zur-md5-verschlusselung-aus-dll-aufrufen/
Wenn es nicht geht, wieso?
Wenn es geht, wieso wird dann der code aus einer .pas in die dll gelesen?
Mathematiker - Mo 11.11.13 18:16
Hallo,
spoof hat folgendes geschrieben : |
Theoretisch könnte ich doch den Code, welcher in der .pas steht, in die DLL schreiben. Oder geht das nicht? ... |
Geht schon, ich würde es trotzdem nicht tun.
Es ist besser, wenn die einzelnen von der DLL exportierten Funktionen/Prozeduren übersichtlich verwaltet werden.
Hast Du mehrere Funktionen, kann es schnell unübersichtlich werden. Besser ist es, für jede Funktion eine unterschiedliche Unit zu verwenden.
Beste Grüße
Mathematiker
spoof - Mo 11.11.13 18:27
Achso, daran hab ich noch ganich gedacht.
Ich dachte die ganze Zeit man nutz 1 DLL für 1 Situation.
Aber jetzt seh ichs auch, ich spreche ja mit meiner exe nicht nur die DLL sondern auch die function in der DLL an.
Das heißt ich könnte 10 functions in der DLL haben mit 10 .pas Dateien drin um zb. verschiedene Verschlüsselungwege mit meiner exe anzusprechen über diese eine DLL.
Quitzlinga - Mo 11.11.13 21:00
Hi,
library dbtest;
Das bedeutet, du erzeugst eine DLL. Dll´s aber lassen sich nicht ausführen. Wenn Du nun "F9" (Compilieren + Starten) drückst, dann versucht Delphi, die Unit zu kompilieren und
auszuführen. Mit "CTRL" + "F9" hingegen wird nur kompiliert.
Das zweite hingegen scheint ein eigenständiges Projekt zu sein, weswegen am Ende auch eine ausführbare Datei rauskommt, die Delphi dann natürlich auch starten kann.
MfG
Quitzlinga
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!