Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   Delphi Zugriff auf C# COM-Objekt von Delphi aus (https://www.delphipraxis.net/159795-zugriff-auf-c-com-objekt-von-delphi-aus.html)

Dawn87 13. Apr 2011 08:41

Zugriff auf C# COM-Objekt von Delphi aus
 
Hallo,

ich habe eine DLL in C# erstellt, die ein COM-Objekt mit diversen Funktionen enthält:

Code:
namespace MeinComObjekt
{
    [Guid("258FDBD3-7778-400f-B161-BA63CBAC2A03")]
    [ComVisible(true)]
    [InterfaceType(ComInterfaceType.InterfaceIsDual)]
    public interface IEnvironment
    {
        /* Öffentliche Methoden: */
        bool Initialize_bool(uint Reserved_u32);
        string GetActiveProjectGUID_str();

      // usw.
    }
}
Zu diesem COM-Interface gibt es noch eine Klasse, welche die Funktionen implementiert.

Der Aufruf der Funktionen über Eary-Binding klappt, d.h. wenn ich mir von Delphi eine TLB-Datei generieren lassen, kann ich die Funktionen aufrufen.

Wenn ich versuche das Ganze mit Delphi 2007 über Late-Binding anzusprechen, und so soll es später im Programm auch erfolgen, funktioniert der Aufruf sämtlicher Funktionen mit Ausnahme derjenigen Funktionen, die keine Parameter erwarten, wie z. B. GetActiveProjectGUID_str();.

Delphi-Quellcode:
var
  Obj: Variant;
begin
  Obj := CreateOleObject('MeinComObjekt.Environment');

  if Obj.aftInitialize_bool(0) then
  begin
    ShowMessage(Obj.aftGetDLLVersion_str());
  end
  else
  begin
    ShowMessage('Initialisierung fehlgeschlagen!');
  end;
Die Fehlermeldung die ich beim Aufruf bekomme ist vom Typ EOleSysError und lautet:
"Unzulässige Parameteranzahl"

Aufrufe aus einem VBS-Skript klappen dagegen hervorragend, d. h. die Implementierung im Com-Objekt selber scheint zu stimmen.

Hat jemand eine Idee, weshalb der Aufruf aus Delphi scheitert?

Grüße
Dawn

Elvis 13. Apr 2011 21:28

AW: Zugriff auf C# COM-Objekt von Delphi aus
 
Zitat:

Zitat von Dawn87 (Beitrag 1094771)
Delphi-Quellcode:
var
  Obj: Variant;

Müsste der Typ nicht OleVariant heißen? Also wenn du Delphis Art von IDispatch nutzen willst.

Du musst aber nicht den Weg über COM gehen, wenn du nicht willst.
Du kannst zum Beispiel die JCL nutzen, um die CLR zu hosten und dann einfach Instanzen deiner Klassen erzeugen. Mehr dazu hier. Aber immer daran denken, dass deine .Net Typen weiterhin ComVisible(true) sein müssen.

Delphi-Quellcode:
var
  Host: TJclClrHost;
  Obj: OleVariant;
begin
  try
    Host := TJclClrHost.Create();
    Host.Start();
 
    Obj := Host.DefaultAppDomain
               .CreateInstance('DeineAssembly',
                               'MeinComObjekt.Environment')
               .UnWrap();
    WriteLn('Test: ', Obj. aftGetDLLVersion_str());

    Host.Stop();
  except
    on E: Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz