![]() |
Delphi ActiveX in .NET benutzen - aber wie?
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:
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.
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. 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:
Weder die Variante über das Property noch Funktionsaufruf klappen. Ich bekomme immer die Exception Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt..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 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... |
Re: Delphi ActiveX in .NET benutzen - aber wie?
Zitat:
ein Beispielprojekt suchen, das ActiveX und DLL für Delphi berschreibt wie z.B. das unter ![]() 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, |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:58 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