Einzelnen Beitrag anzeigen

sveni2211

Registriert seit: 22. Dez 2006
Ort: Friedrichroda
38 Beiträge
 
#1

Delphi ActiveX in .NET benutzen - aber wie?

  Alt 8. Jul 2009, 15:03
Hi.

Ich stehe gerade vor nem ziemlichen Problem. Es gibt einige (so an die 400) DLL's, welche in Delphi geschrieben wurden (es handelt sich um eine Art Treiber-DLL, also zum ansprechen von Geräten via TCP und Serielle Schnittstelle). Diese sind von einem Zulieferer.
Bisher gab es eine Delphi-Anwendung, welche diese DLL's eingebunden hat und diese angesprochen hat. Diese Anwendung wird aber nicht mehr gepflegt und so soll die Ansteuerung in unser eigenes Projekt (in VB.NET) direkt integriert werden.
Vom Zulieferer haben wir nun einige Quellcode-Ausschnitte bekommen, mit denen wir die DLL's ansprechen sollen.
Das ganze ist in Delphi mittels einiger Interfaces realisiert, die Klassen für die Ansteuerung sind Nachfahren von TComObject.
Ich bekomme das ganze aber einfach nicht hin und weiß langsam nicht mehr weiter. Weitere Hilfe vom Hersteller der DLL's ist nicht zu erwarten und für alle diese Geräte die Ansteuerung neu schreiben ist praktisch unmöglich.

Ich habe, um diese Ansteuerung erst einmal auszuprobieren, ein kleines Testprojekt gemacht, was exakt die Technik verwendet, die aus den DLL-Quell-Fragmenten ersichtlich ist.

Der Delphi-Part ist so gestaltet (Beispielhaft):
Delphi-Quellcode:
library DelphiComTest;
uses
  SysUtils,
  Classes,
  ComServ,
  ComObj,
  Dialogs,
  DelphiComTest_TLB in 'DelphiComTest_TLB.pas';

{$R *.TLB}

{$R *.res}

exports
  DllGetClassObject,
  DllCanUnloadNow,
  DllRegisterServer,
  DllUnregisterServer;

const
  Class_DelphiComTest: TGUID = '{3DCA314D-F999-4274-B5CC-7D6E0ECD48F7}';

type

  TTestKlasse = class(TComObject)
    private
      FWert : integer;
    protected

    public
      constructor Create;
      destructor Destroy;override;
      function TestCall:integer;
      procedure Initialize;override;
    published
    property
      Value : integer read FWert write FWert;
  end;


{ TTestKlasse }

constructor TTestKlasse.Create;
begin
  ShowMessage('Klasse erstellt');
  inherited;
end;

destructor TTestKlasse.Destroy;
begin
  inherited;
  ShowMessage('Klasse zerstört');
end;

procedure TTestKlasse.Initialize;
begin
  inherited;
  ShowMessage('Klasse initialisiert');
  TestCall;
  FWert:=33;
end;

function TTestKlasse.TestCall: integer;
begin
  ShowMessage('Aufruf ist erfolgt!');
  Result:=4711;
end;

begin
  TComObjectFactory.Create(ComServer,TTestKlasse,Class_DelphiComTest,'DelphiComTest','COM Test mit Delphi',ciMultiInstance,tmFree);
  ShowMessage('DLL ist geladen');
end.
Nicht durch den Namen verunsichern lassen. Anfangs hieß es "das sind so Delphi-COM-Dll-Dinger". Der Versuch die dann im Visual Studio ist aber gescheitert, weil sie eben keine vom Visual Studio verwertbaren COM-Klassen sind. Die Testprojekte habe ich aber nicht umbenannt.

Wenn ich das obige Projekt erstelle und "ActiveX-Server eintragen" wähle, finde ich auch die GUID in der Registry mit dem Verweis auf die richtige DLL.

Nun habe ich in VB-NET (Strict Off) versucht das ganze anzusprechen. Folgendes Code-Stück dazu:

Delphi-Quellcode:

    Dim oTest As Object
    Dim i As Integer = 0
    Try
      'oTest = CreateObject("DelphiComTest.DelphiComTest")
Dim T As System.Type
T = System.Type.GetTypeFromProgID("DelphiComTest.DelphiComTest")
oTest = Activator.CreateInstance(T)
If Not oTest Is Nothing Then
'Dim oTestInstance As Object = oTest.createInstance()
        'i = oTest.Value
i = oTest.TestCall()
End If
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
Weder die Variante über das Property noch Funktionsaufruf klappen. Ich bekomme immer die Exception Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt..
Die DLL wird aber geladen und auch die Klasse wird initialisiert (beide Meldungen die ich mittels Show-Message eingebaut habe, werden angezeigt).
Hat jemand eine Idee woran das liegen kann? Oder ein funktionierendes Beispiel wie man einen in Delphi erstellen Active-X Server in .NET zum laufen bekommt? Ich bin da grad an einem (mause-) toten Punkt angekommen...
  Mit Zitat antworten Zitat