AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi ActiveX in .NET benutzen - aber wie?
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi ActiveX in .NET benutzen - aber wie?

Ein Thema von sveni2211 · begonnen am 8. Jul 2009 · letzter Beitrag vom 8. Jul 2009
Antwort Antwort
sveni2211

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

Delphi ActiveX in .NET benutzen - aber wie?

  Alt 8. Jul 2009, 16: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
mjustin

Registriert seit: 14. Apr 2008
3.006 Beiträge
 
Delphi 2009 Professional
 
#2

Re: Delphi ActiveX in .NET benutzen - aber wie?

  Alt 8. Jul 2009, 16:31
Zitat von sveni2211:
Oder ein funktionierendes Beispiel wie man einen in Delphi erstellen Active-X Server in .NET zum laufen bekommt?
Was ich versuchen würde:

ein Beispielprojekt suchen, das ActiveX und DLL für Delphi berschreibt wie z.B. das unter http://entwickler-forum.de/archive/i...p/t-11687.html

Und dann versuchen, es wie beschrieben in VB.NET zu benutzen.

Bei dem problematischen ActiveX würde ich schrittweise debuggen, z.B. um zu sehen was CreateObject("DelphiComTest.DelphiComTest") liefert - eventuell ist da schon eine Nullreferenz (der zu der Fehlermeldung mit dem Objektverweis führt) entstanden.

Viele Grüße,
Michael Justin
habarisoft.com
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz