![]() |
Frage zu OleVariant
Kurze Frage, weil ich nicht wirklich Ahnung von diesem ganzen Interface-Kram habe.
Ich arbeite gerade mit einem komplett undokumentierten API. Ich weiß, dass ich bestimmte Eigenschaften auslesen kann, allerdings liefert die Funktion laut Typbibliothek einen OleVariant zurück:
Delphi-Quellcode:
Um diese Funktion nutzen zu können zu können, habe ich also "propId" entsprechend als OleVariant deklariert und dann aufgerufen. Der Konstante in Klammern bezeichnet das eigentliche Objekt, auf das ich es abgesehen habe:
function GetProperty(propid: HxRegNamespacePropId): OleVariant; safecall;
Delphi-Quellcode:
Dieses Objekt ist allerdings vom Typ "IHxRegPlugInList". Wie komme ich jetzt von meinem OleVariant an dieses Ding heran?
propId := namespace.GetProperty(HxRegNamespacePlugInList);
Gibt´s so was wie Type-casting? Danke. PS: Der Sinn ist, dass ich versuche, mir einen Viewer zu schreiben, der mir die im System bekannten Help 2.0-Namespaces anzeigt. Das ist nicht das Problem. Mein Tree-View listet die schon auf und zeigt auch die bekannten Filter an. Per Klick auf auf das Root-Item (= der Namespace) startet auch die entsprechende Hilfe (das PSDK bspw.). Jetzt versuche ich eben noch die Plugins und die zugeordneten Hilfedateien auszulesen. Und das geht nur mit der o.g. Methode. Und da hänge ich an dem OleVariant. :oops: |
Re: Frage zu OleVariant
Hallo Matthias,
wenn ich ich recht entsinne kannst Du direkt mit propID weitermachen. Wenn z.B. das Interface eine Methode mit dem Namen 'Open' anbietet kannst Du
Code:
in Deinen Source schreiben. Delphi "schaltet" hier völlig transparent zum Late Binding um.
prodID.Open
Natürlich werden Dir die möglichen Methoden usw nicht angezeigt. Der Compiler kann auch keine Typprüfung vornehmen. D.h. Fehler fallen erst zur Laufzeit auf. Meistens kommt dann der Fehler: Schnittstelle nicht unterstüzt. Hinweis: Wenn man mit den Office-Serverkomponenten arbeitet wird die Frühe Bindung verwendet. D.h. man muss alle Parameter der Methode angeben. Das muss bei der Späten Bindung nicht unbedingt sein. MS hat eigentlich immer für die Parameter einen Defaultwert vorgesehen. D.h. wenn man keinen Bock hat die 12 oder mehr Parameter der WordApplication.Open Methode einzugeben könnte man auch
Code:
auch hier wird temporär die Späte Bindung verwendet.
OleVariant(WordApplication).Open(Filename)
Ich hoffe meine Erinnerung hat mir keinen Streich gespielt |
Re: Frage zu OleVariant
Das mit dem "direkten Weitermachen" hatte ich schon versucht, Jens. Aber da beschwert sich der Compiler
Delphi-Quellcode:
Und die Variablen:
// [Fehler] Unit1.pas(120): Inkompatible Typen: 'Variant' und 'IEnumHxRegPlugIn'
pluginEnum := propId.EnumRegPlugIn(0,0);
Delphi-Quellcode:
Seltsam ist, dass bspw.
var
propId : OleVariant; pluginEnum : IEnumHxRegPlugIn;
Delphi-Quellcode:
funktioniert, denn "Count" ist auch eine Methode von "IHxRegPlugInList", genau wie "EnumRegPlugIn". :(
ShowMessage(inttostr(propId.Count));
|
Re: Frage zu OleVariant
Hab nen ähnlichen Fall und da funktioniert das so:
Delphi-Quellcode:
var
propId : OleVariant; pluginEnum : IEnumHxRegPlugIn; pluginEnum := IUnknown(propID) as IEnumHxRegPlugIn; |
Re: Frage zu OleVariant
Motzi, der Tipp war Gold wert. :thuimb:
Jetzt sehe ich alles: Namespaces, zugeordnete Hilfedateien, Filter und Plugins. Dann werde ich mich mal dran setzen, die Eigenschaften entsprechend auszulesen. Mal eine Frage nebenbei, die aber mit dem Thema zu tun hat: Es sind ja einige professionelle Entwickler hier, die in regem Kontakt zu Microsoft stehen. Wie beurteilt ihr meine Chance, wenn ich mich an Microsoft wende und dort mal nachfrage ob man mir ein paar Infos zukommen lässt? Ich weiß, dass Microsoft die Infos zum Help 2.0-API rausgibt. Aber ich weiß auch, dass in der Regel damit ein Stillschweigeabkommen (oder wie immer man das nennen will) verbunden ist. Ich weiß das deshalb, weil ich mich bereits an einen Entwickler gewandt habe. Der schrieb mir zurück, er würde mir gern helfen, er dürfe aber nicht ... Speziell ginge es mir noch um den Prozess zum Registrieren/De-Registrieren von Namespaces, Hilfedateien, usw. Ich habe mittlerweile die dazu notwendigen Befehle gefunden. Und ich habe auch gewisse Vorstellungen davon wie man sie verwenden muss. Aber das Prinzip ähnelt grob gesagt einer Datenbank. Bevor man loslegen kann, muss man erst mal "Verbindung aufnehmen". An sich auch nicht schwer, da ich (wie gesagt) die Befehle kenne. Aber einer von denen erwartet einen String als Parameter. Und woher soll ich ohne Doku wissen was ich da reinschreiben muss? Ich hab´s schon mal versucht, bekam aber immer nur Ole-Fehler. :stupid: Und darum würde ich einfach mal eine freundliche Mail an Microsoft schreiben und dort nachfragen wollen. Glaubt ihr, dass das was bringt? |
Re: Frage zu OleVariant
Zitat:
Wenn Du Glück hast, dann bekommt es der richtige. Ich würde die Frage eher in einer Newsgroup stellen, in der sich die MS-Entwickler des entsprechenden Teams rumtreiben. Sicher bist Du nicht der erste der versucht dieses Problem zu lösen (und vielleicht gibt es bereits irgendwo eine Lösung, da es ja bereits Tools in der Richtung gibt). NDAs (Non Disclosure Agreements) werden üblichwerweise nur mit Firmen abgeschlossen, da es relativ sinnlos/ineffektiv ist, eine Privatperson zu belangen... |
Re: Frage zu OleVariant
Liste der Anhänge anzeigen (Anzahl: 1)
Da werde ich mal nach passenden Newsgroups Ausschau halten. Wie gesagt, ich hatte Rob Chandler gefragt ob er mir einen Tipp geben kann. Aber er durfte eben nicht. Kann ich auch irgendwo verstehen. Sein Tool H2Reg ist ja auch gar nicht schlecht, aber es ist ´ne komprimierte VCL-Exe. Ich bin sicher, dass man die Größe noch drücken kann. Das wäre für kleinere Hilfedateien/Setups idealer.
Na, hoffen wir, dass ich einen Entwickler finde, der auch mit sich reden lässt. :) Anbei mal der Viewer, den ich mir zusammengeschraubt habe. Ist vom Design her nichts Besonders. Im Gegenteil, die Icons habe ich noch schnell ergänzt, sonst hätte es nach gar nichts ausgesehen. Auf Wunsch stelle ich den Quellcode auch rein. Die Typbibliothek (Microsoft Help Data Services) könnt ihr dann ja selbst importieren. ;) btw: Zitat:
|
Re: Frage zu OleVariant
Zitat:
Man sollte besser nach IDispatch casten, denn das OleVariant enthält einen Interfacezeiger auf eine Dispatchschnittstelle:
Delphi-Quellcode:
</Klugscheisermode>
pluginEnum := IDispatch(propID) as IEnumHxRegPlugIn;
|
Re: Frage zu OleVariant
Zitat:
(einen 'richtigeren' als Rob wirste zu dem Thema schwer finden... und wenn er nicht darf/will, dann ist das leider so. Wie gesagt, in Newsgroups findet man schneller Antworten (zumindest wenn die 'wissenden' merken, dass sich da jemand Arbeit macht und mehr vorzuweisen hat als die Frage selbst :) - und wenn es nur kleine Hinweise sind...) ps: schönes Tool, seh gerade, dass mein PSDK namespace doppelt ist, upz |
Re: Frage zu OleVariant
Liste der Anhänge anzeigen (Anzahl: 1)
@shmia: Hab´s geändert, wusste ich nicht. Dennoch Danke an Motzi, und an dich!
@Nico: Ich werde trotzdem mal mein Glück versuchen. Wer nicht wagt, ... btw: Ich frage ja sowas nicht ohne Grund: Link auf Wunsch entfernt. (Testversion) ;) [edit=Luckie]Link entfernt. Mfg, Luckie[/edit] |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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 by Thomas Breitkreuz