Autor Beitrag
Xeron
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

WinXP Home, Vista Home Premium 64Bit, Win7 Home Premium
Delphi 3 Prof, Delphi 7 Personal, Delphi 2010 Prof., AutoIt
BeitragVerfasst: So 02.05.10 18:30 
Hallo, ich habe meine DLL nun soweit fertig.
Jetzt will ich die einzelnen Funktionen exportieren, aber da passiert gar nix.

Code

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
type TUser = class
  Function GetHandle(Titel: PChar): HWnd; stdcall;

...

Function TUser.GetHandle(Titel: PChar): HWnd; stdcall;
begin
  Result := FindWindow(nil, Titel);
end;

...

exports
  TUser.GetHandle; //geht nicht
  GetHandle; //Geht nicht


Einmal kommt:

TUser kann nicht exportiert werden.

und einmal

Undefinierter Bezeichner: GetHandle

Wie mach ich das nun?

Danke ;)

Moderiert von user profile iconNarses: Titel geändert: ein DLL entfernt.
j.klugmann
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 02.05.10 18:33 
Man kann Klassen in Delphi aus einer DLL nicht exportieren und folglich auch nicht ihre Member.Einzige Möglichkeit ist:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
   IFoo = class
     public
       procedure DoSomethingStupid; virtual;abstract;
end;


und dann in der DLL:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TFoo = class(IFoo)
     public
       procedure DoSomethingStupid;override
end;


dann kannst du einfach eine Funktion aus der DLL exportieren , die das macht:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
function ExportFoo : IFoo;stdcall;
var foo : TFoo; //Klasse , die in der DLL implementiert worden ist
begin
  foo := TFoo.Create;
  result := foo;
end;


Der Nachteil bei der ganzen Sache ist , das man immer Interfaces deklarieren muss. ;)

MfG
Xeron Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

WinXP Home, Vista Home Premium 64Bit, Win7 Home Premium
Delphi 3 Prof, Delphi 7 Personal, Delphi 2010 Prof., AutoIt
BeitragVerfasst: So 02.05.10 18:41 
Das ist aber gar nicht gut.
Warum geht das nicht?

Naja, ich werd mich wohl damit abfinden müssen ;)
Trotzdem Danke :)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 02.05.10 20:34 
user profile iconXeron hat folgendes geschrieben Zum zitierten Posting springen:
Das ist aber gar nicht gut.
Warum geht das nicht?
Weil DLLs programmiersprachenunabhängig sind und daher solche Funktionen nicht darin vorgesehen sind.

Machen kannst du sowas theoretisch mit Delphi Packages statt DLLs, diese sind aber leider langsamer und können eben nur mit Delphi benutzt werden. Und so weiter, gibt noch mehr Probleme je nach Verwendung.
Gewuerzgurke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 152

Win XP
Lazarus
BeitragVerfasst: Sa 08.05.10 11:32 
Eigentlich müsste man doch eine Funktion exportieren können, die eine Liste von TMethods ausgibt. Mann kann doch Klassenmethoden z.B. so aufrufen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var DieKlasse : TDieKlasse;

procedure TDieKlasse.Klassenmethode(Parameter : cardinal);
begin
...
end;

(... Außerhalb der Klasse)

type TDieMethode = procedure(Parameter : cardinal) of object;

var Methodenzeiger : TMethod;

(...)

Methodenzeiger.Code := @TDieKlasse.Klassenmethode;
Methodenzeiger.Data := DieKlasse;
TDieMethode(Methodenzeiger)(6935);


Zugegeben: Praktisch ist das nicht, aber es sollte auch aus einer DLL heraus funktionieren...
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 08.05.10 11:38 
Theoretisch ja, praktisch nein. Der Grund ist der Speichermanager. Der ist in der DLL ein anderer, so dass du an die Objekte, auf die du dich in den Methodenzeigern beziehst, gar nicht herankommst.

Das lässt sich zwar theoretisch auch in den Griff bekommen, macht aber so keinen Sinn. Wenn man das will, kann man Packages benutzen, denn ein solches Vorgehen ließe sich ohnehin nicht anders als mit Delphi nutzen. Das ist also das gleiche wie bei Packages, insofern kann man dann gleich die nutzen.

Viel sinnvoller ist aber die Architektur gleich auf Basis der vorhandenen Möglichkeiten zu planen, damit hat man dann deutlich weniger Probleme...