![]() |
Portierung VB --> Delphi, GetObject
Hallo,
ich portiere gerade ein altes VB6 Programm nach Delphi 7. Das Programm soll sich über OLE mit einem laufenden anderen Programm verbinden und dort quasi "horchen". In VB6 steht folgender Code:
Code:
Diesen Code hab ich im VB6 getestet, er funktioniert problemlos.
Dim WithEvents App1_Sub As DefTypeLib.ApplType
Dim App1 As Object Set App1 = GetObject("APPFX") If App1 Is Nothing Then MsgBox "Konnte keine Verbindung zur Anwendung aufbauen. Wurde sie gestartet?", vbOKOnly Or vbCritical End End If Set App1_Sub = App1.GetSub Set App1 = Nothing Ich hab nun schon viel im Internet gefunden, aber leider klappt schon
Delphi-Quellcode:
nicht.
GetActiveOleObject('APPFX');
An der Stelle kommt dann der Fehler "Ungültige Klassenzeichenfolge". Ich habs auch schon mit
Delphi-Quellcode:
probiert, da kommt dann "Vorgang nicht verfügbar".
GetActiveOleObject('APPFX.Application');
Delphi-Quellcode:
will ja eigentlich den Klassennamen eines registrierten COM-Objects, ich denke, da liegt auch der Fehler, aber ich habe keine treffendere Funktion gefunden, die das GetObject von VB6 in Delphi ersetzt.
GetActiveOleObject('APPFX');
Das VB6
Code:
hat ja den Dateinamen als Argument.
GetObject
Wie stelle ich das in Delphi an? Hier erstmal mein Code-Fragment. Ich stelle sicher, dass die Anwendung APPFX, das ist eine Exe, die genauso, also APPFX.exe heisst, läuft. Daher rührt der Fehler also nicht. Die TLB habe ich von Delphi erzeugen lassen, notfalls kann ich den Typ für App1_Sub aus dieser beziehen. In vielen Beispielen aus dem Netz wurde da aber rigoros OleVariant genommen.
Delphi-Quellcode:
Hat vielleicht jemand eine Idee, was ich noch anstellen muss, damit das unter Delphi genau so schön funktioniert wie mit VB6?
var
App1, App1_Sub: OleVariant; begin App1 := GetActiveOleObject('APPFX'); if VarIsEmpty(App1) then ShowMessage('Konnte keine Verbindung zur Anwendung aufbauen. Wurde sie gestartet?'); App1_Sub := App1.GetScriptingEngine; App1 := unassigned; end; Danke im Voraus Frank |
Re: Portierung VB --> Delphi, GetObject
Was stehen denn in der TLB so für Deklartaionen drin.
Edit: Interface und CoClass (mit dem Namen der Anwendung) wäre spannend. |
Re: Portierung VB --> Delphi, GetObject
Will dir nicht den Mut nehmen aber vergess es einfach
Habe schon versucht einige Projekte von VB nach Delphi zu übersetzen bin aber kläglich gescheitert. Besonders dann wenn man versucht es 1 zu 1 umzusetzen. Kann sein das ich aber auch zu blöd ;) dafür bin. gruss Emil |
Re: Portierung VB --> Delphi, GetObject
Delphi-Quellcode:
Das wäre die Implementierung der VB GetObject Funktion. Das "APPFX" ist der Dateiname und nicht der Klassenname, da die VB Funktion zwei Parameter hat und der erste den Dateinamen angibt.
function VBGetObject(const Filename: string; const ClassName: string = ''): IDispatch;
var ClassID: TCLSID; Unknown: IUnknown; begin if ClassName <> '' then Result := GetActiveOleObject(ClassName) else begin OleCheck(GetClassFile(PChar(Filename), ClassID)); OleCheck(GetActiveObject(ClassID, nil, Unknown)); OleCheck(Unknown.QueryInterface(IDispatch, Result)); end; end; |
Re: Portierung VB --> Delphi, GetObject
Zitat:
|
Re: Portierung VB --> Delphi, GetObject
Zitat:
Danke für die Antwort, leider funktioniert das noch nicht.
Delphi-Quellcode:
Ich habe String und PChar jeweils durch die Wide-Variante ersetzt, dann meckerte Delphi nicht mehr.
function VBGetObject(const Filename: Widestring; const ClassName: string = ''): IDispatch;
var ClassID: TCLSID; Unknown: IUnknown; begin if ClassName <> '' then Result := GetActiveOleObject(ClassName) else begin OleCheck(GetClassFile(PWideChar(Filename), ClassID)); OleCheck(GetActiveObject(ClassID, nil, Unknown)); OleCheck(Unknown.QueryInterface(IDispatch, Result)); end; end; Bei GetClassFile steigt er dann aus mit der Meldung "Datei konnte durch Moniker nicht geöffnet werden." APPFX ist eine exe, vielleicht liegt es daran? Wenn ich ihm den ganzen Pfad, also "C:\Programme\AppFX\APPFX.exe" serviere, dann kommt die Fehlermeldung "Ungültige Dateierweiterung". APPFX lief bei meinen Versuchen. Wie macht VB6 das nur, da funktioniert es ja? Gruß Frank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:48 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