Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi OLE -> GetActiveOleObject / bzw. Nutzen in anderer Unit (https://www.delphipraxis.net/114268-ole-getactiveoleobject-bzw-nutzen-anderer-unit.html)

Andy386 22. Mai 2008 15:21


OLE -> GetActiveOleObject / bzw. Nutzen in anderer Unit
 
ich bin's schon wieder.
Hab immernoch keine Ahnung von Delphi und wieder ein neues Problem:
Ich habe eine Komponente, auf die ich mittels OLE zugreifen muss (es handelt sich um ein Messprogramm)
Der Aufruf von GetActiveOleObject('ole-Name') bringt die Exeption "Vorgang nicht verfügbar", der nur in der IDE auftritt.
Ich hab ein bisschen gegoogelt, aber nicht wirklich was passendes zu gefunden. Wie kann man denn die Abfrage machen, ob ein OLE-Objekt schon offen ist und in dem Falle gleich den Pointer/Variant auf das offene Object setzen ?

Darauf zielt auch schon meine nächste Frage: Wie kann ich ein offenes OLE-Object (also die Anwendung an sich) mit einer anderen Unit nutzen ?
Mein Code zurzeit zu dem OLE:
Hauptunit:
Delphi-Quellcode:
OLE        : Variant;
....
OLE := GetActiveOleObject('ole-name');
     except
        OLE := CreateOleObject('ole-name');
        OLE.Show;
     end;
Und in der neuen Unit steht dasselbe :drunken:
PS: ich nutze Delphi7

Ralf Kaiser 22. Mai 2008 15:47

Re: OLE -> GetActiveOleObject / bzw. Nutzen in anderer Un
 
Gibt es für dieses OLE Objekt eine Typenbibliothek? Such mal im Programmverzeichnis der betreffenden Anwendung nach Dateien mit der Endung *.TLB.

Wenn ja, dann kannst du diese einfach nach Delphi importieren. Delphi generiert dann Wrapper-Komponenten über die du auf den OLE Server zugreifen kannst. Diese kannst du so einstellen, dass sie entweder auf eine laufende Instanz des Servers zugreifen oder immer eine neue Instanz erzeugen (z.B. indem du ConnectKind auf ckRunningOrNew setzt um eine neue Instanz zu erzeugen wenn der Server noch nicht läuft oder die laufende zu verwenden wenn er schon läuft).

Delphi liefert schon einige fertig importierte Wrapper-Komponenten für die MS-Office Programm mit. (z.B. TWordDocument und TWordApplication). Dort kannst du dir ansehen, wie man mit solchen Wrappern arbeitet.

Beim Import der Typenbibliothek kannst du angeben, ob die Wrapper-Komponenten erzeugt und in der IDE installiert werden sollen. Unter D7 war der Import (WMMGNT *) unter "Projekt/Typenbibliothek importieren" zu finden.

Ciao,
Ralf

* WMMGNT = Wenn mich mein Gedächtnichs nicht trügt :wink:

Andy386 22. Mai 2008 16:03

Re: OLE -> GetActiveOleObject / bzw. Nutzen in anderer Un
 
Da ist leider keine tdl-datei.
Kann man die nachträglich erzeugen ?

Ralf Kaiser 22. Mai 2008 16:09

Re: OLE -> GetActiveOleObject / bzw. Nutzen in anderer Un
 
Zitat:

Zitat von Andy386
Da ist leider keine tdl-datei.
Kann man die nachträglich erzeugen ?

Leider nein. Die TLB wird vom Hersteller eines OLE Servers mitgeliefert (muss aber nicht...)

Du könntes aber mal versuchen, ob sich eine der DLLs im Verzeichnis der Anwendung als COM Server importieren lässt! Delphi benötigt dazu nämlich nicht zwingend eine TLB-Datei. Ich habe bei verschiedenen Servern schon einen Import gemacht indem ich einfach der Reihe nach alle vorhandenen DLLs versucht habe zu importieren. Ist eine DLL kein COM-Server so gibt Delphi eine Fehlermeldung aus. Ansonsten wird der Server importiert wie bei eine TLB-Datei.

Um welchen Server handelt es sich denn (aus deiner Beschreibung "ein Messprogramm" schliesse ich, dass es nicht unbedingt etwas bekanntes ist)

Andy386 23. Mai 2008 09:33

Re: OLE -> GetActiveOleObject / bzw. Nutzen in anderer Un
 
Es handelt sich um Scout.
Also eher was kleines :)
[edit]Das Problem mit GetActiveOleObject erübrigt sich, da ich das zweite anders gelöst habe[/edit]

zum zweiten:
Ich hab jetzt einfach meine main-Unit in der Mess-unit im uses (nach Implementation) hinzugefügt. Ist aber gar nicht schön, weil die Mess-Unit auch für andere Projekte da ist. [edit] Aber Delphi unterstützt ja Präprozessorbefehle...[edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:45 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