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