Autor Beitrag
MrCoder
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

WinXP, SuSE Linux
D7 Ent
BeitragVerfasst: Sa 14.04.07 19:26 
Hi,
hab lange nichts mehr zu diesem Forum beigesteuert und darum direkt mal eine kompliziertere Frage:

Problem: Ich versuche in Delphi folgende DLL zu schreiben:

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:
library dlltest;

type
  IMyClass = interface
    procedure A; stdcall;
    procedure B; stdcall;
  end;

  TMyClass = class(TInterfacedObject, IMyClass)
  public
    procedure A; stdcall;
    procedure B; stdcall;
  end;

procedure TMyClass.A;
begin
  WriteLn('A aufgerufen');
end;

procedure TMyClass.B;
begin
  WriteLn('B aufgerufen');
end;

function GetMyClass: IMyClass; stdcall;
begin
  Result := TMyClass.Create;
end;

exports GetMyClass;

begin
end;


Die Funktion GetMyClass wird exportiert und kann aus einer EXE heraus aufgerufen werden, um
den Zeiger auf das Interface IMyClass zu bekommen.

Diese DLL möchte ich gerne aus eine C++ Programm einbinden (GNU-C, nicht VC++).
Wie sieht die Headerdatei dafür aus? Was ist das C++ äquivalent zu "type IMyClass = interface ... end"?

Danke schonmal ;D
Bernhard Geyer
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 721
Erhaltene Danke: 3



BeitragVerfasst: So 15.04.07 10:11 
So geht das gar nicht. Delphi Interfaces können nicht von C++ aufgerufen werden.
Du hast 2 Möglichkeiten:

1, Verpacke deine Funktionaltität in eine Automatisierungsklasse so das per COM Kompoatiblität hergestellt wird
(Nachteil: Delphi-COM-DLL muß mit Adminrechten installiert werden

2, Du definierst eine C-Like-Schnittstelle indem du mit Handels arbeitest (Am einfachsten indem du deine Instanz-Referenzen (Nicht die Interfaces) als Integer castest und dies als Funktionen zurückgibst. Brauchst damit für jede Methode der Klasse eine eigene Funktion
tommie-lie
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: So 15.04.07 10:45 
3. Du benutzt das C-Interface zu Interfaces, Dokumentation dazu findet sich bei Google und im MSDN.

4. Du benutzt einen anderen C++-Compiler, der mit COM-Interfaces (nichts anderes sind die Interfaces aus Delphi) zurechtkommt. MSVC++ und der BCB sind die beiden mir bekannten Compiler, die das drauf haben. Die Syntax dabei ist implementationsabhängig, da Implementationserweiterung zum C++-Standard, ähnlich wie __property aus dem BCB. Ich glaube im MSVC++ ist es einfach nur eine abstrakte Klasse, aber das sollte alles in der Dokumentation des Compilers stehen.

_________________
Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
MrCoder Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 65

WinXP, SuSE Linux
D7 Ent
BeitragVerfasst: So 15.04.07 13:36 
Danke für eure Antworten,
mir scheint unterdessen mein erster Plan, das Problem zu lösen um einiges einfacher als
verzweifelt an Interfaces fest zu halten. Auch wenn das also klappen würde, dann kämen
nur bestimmte Compiler in Frage - ich will jedoch die Kompatibelität maximal halten.
Plan war es auch das ganze auf Linux laufen zu lassen...

Also werde ich mal beim klassischen Weg mit Handles bleiben.

Danke nochmals :D