Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Portierung VB --> Delphi, GetObject (https://www.delphipraxis.net/121162-portierung-vbulletin-delphi-getobject.html)

franky.f 23. Sep 2008 11:27


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:
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
Diesen Code hab ich im VB6 getestet, er funktioniert problemlos.

Ich hab nun schon viel im Internet gefunden, aber leider klappt schon
Delphi-Quellcode:
GetActiveOleObject('APPFX');
nicht.
An der Stelle kommt dann der Fehler "Ungültige Klassenzeichenfolge".
Ich habs auch schon mit
Delphi-Quellcode:
GetActiveOleObject('APPFX.Application');
probiert, da kommt dann "Vorgang nicht verfügbar".

Delphi-Quellcode:
GetActiveOleObject('APPFX');
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.
Das VB6
Code:
GetObject
hat ja den Dateinamen als Argument.
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:
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;
Hat vielleicht jemand eine Idee, was ich noch anstellen muss, damit das unter Delphi genau so schön funktioniert wie mit VB6?

Danke im Voraus
Frank

sirius 23. Sep 2008 11:38

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.

EWeiss 23. Sep 2008 11:57

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

jbg 23. Sep 2008 17:00

Re: Portierung VB --> Delphi, GetObject
 
Delphi-Quellcode:
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;
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.

sirius 23. Sep 2008 19:10

Re: Portierung VB --> Delphi, GetObject
 
Zitat:

Zitat von EWeiss
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.

Ich habe jetzt wieder eine COM-DLL eingebunden, wo das SDK netterweise für VB geschrieben war.

franky.f 24. Sep 2008 09:31

Re: Portierung VB --> Delphi, GetObject
 
Zitat:

Zitat von jbg
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.

Hallo,
Danke für die Antwort, leider funktioniert das noch nicht.

Delphi-Quellcode:
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;
Ich habe String und PChar jeweils durch die Wide-Variante ersetzt, dann meckerte Delphi nicht mehr.
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