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...