Autor Beitrag
spoof
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: Mo 11.11.13 17:42 
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:

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

ausblenden volle Höhe 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
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 11.11.13 17:47 
Hallo,
user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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: fluuux.de/2012/03/fu...ng-aus-dll-aufrufen/
Wenn es nicht geht, wieso?
Wenn es geht, wieso wird dann der code aus einer .pas in die dll gelesen?
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1447

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Mo 11.11.13 18:16 
Hallo,
user profile iconspoof hat folgendes geschrieben Zum zitierten Posting springen:
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

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: spoof
spoof Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 48



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 60
Erhaltene Danke: 2

Win XP
Delphi 2007 Prof. Codegear Win32
BeitragVerfasst: 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