Thema: Prism Delphi-Objekte in .NET

Einzelnen Beitrag anzeigen

Benutzerbild von Motzi
Motzi

Registriert seit: 6. Aug 2002
Ort: Wien
598 Beiträge
 
Delphi XE2 Professional
 
#1

Delphi-Objekte in .NET

  Alt 4. Apr 2007, 18:03
Hi,

ich hab einen in Delphi geschriebenen Parser, der einen String erhält, diesen zerlegt und dann ein Objekt zurückgibt. Dieser Parser soll jetzt auch für .NET zur Verfügung stehen, allerdings liefert der Parser ein Delphi-Objekt zurück. Da .NET aber schließlich mit COM-Interfaces arbeiten kann, hab ich mir gedacht ich könnte einfach Interfaces verwenden. Die Delphi-Klassen implementieren diese Interfaces, und über die Interfaces kann ich auch aus .NET auf die Objekte zugreifen.
Ich hab dazu mal ein kleines Test-Programm geschrieben, allerdings funktioniert das nicht so wie geplant. Hier die Interface-Deklarationen:
Delphi-Quellcode:
type
{$IFDEF CLR}
  [ComImport,
   GuidAttribute('257A2C12-24C4-4A2E-8E34-376D5D185904'),
   InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
{$ENDIF}
  IParsedObject = interface
{$IFDEF WIN32}
  ['{257A2C12-24C4-4A2E-8E34-376D5D185904}']
{$ENDIF}
    function foo: String; stdcall;
  end;

{$IFDEF CLR}
  [ComImport,
   GuidAttribute('19845562-721E-483D-BB56-55C0B0EDBDCC'),
   InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)]
{$ENDIF}
  IParser = interface
{$IFDEF WIN32}
  ['{19845562-721E-483D-BB56-55C0B0EDBDCC}']
{$ENDIF}
{$IFDEF CLR}
    [return: MarshalAs(UnmanagedType.Interface)]
{$ENDIF}
    function Parse(const s: string): IParsedObject; stdcall;
  end;
Dann hab ich eine DLL die im großen und Ganzen so ausschaut:
Delphi-Quellcode:
procedure GetParser(out parser: IParser); stdcall;
begin
  parser := TParser.Create();
end;

exports
  GetParser;
Und in meinem .NET Programm versuche ich mit diesen Code eine IParser-Instanz zu bekommen:
Delphi-Quellcode:
[DllImport('..\win32\parser.dll')]
procedure GetParser([MarshalAs(UnmanagedType.Interface)] out parser: IParser); external;

procedure TForm1.Button1Click(Sender: TObject);
var
  parser: IParser;
begin
  GetParser(parser);
end;
Allerdings erhalte ich dabei eine System.ExecutionEngineException. Mach ich irgendwo was falsch, oder ist mein Ansatz sowieso komplett zum vergessen? Hat irgendwer eine Idee?

LG, Manuel
Manuel Pöter
  Mit Zitat antworten Zitat