Entwickler-Ecke

Dateizugriff - Klassenfunktion exportieren


Xeron - So 02.05.10 18:30
Titel: Klassenfunktion exportieren
Hallo, ich habe meine DLL nun soweit fertig.
Jetzt will ich die einzelnen Funktionen exportieren, aber da passiert gar nix.

Code


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.


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


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


und dann in der DLL:


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:


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


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