Entwickler-Ecke

Windows API - Delphi/C++ DLL-Problem


MrCoder - Sa 14.04.07 19:26
Titel: Delphi/C++ DLL-Problem
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:


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


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