Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Frage zu OleVariant (https://www.delphipraxis.net/21628-frage-zu-olevariant.html)

MathiasSimmack 5. Mai 2004 20:47


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:
function GetProperty(propid: HxRegNamespacePropId): OleVariant; safecall;
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:
Delphi-Quellcode:
propId := namespace.GetProperty(HxRegNamespacePlugInList);
Dieses Objekt ist allerdings vom Typ "IHxRegPlugInList". Wie komme ich jetzt von meinem OleVariant an dieses Ding heran?
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:

Jens Schumann 5. Mai 2004 20:58

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:
prodID.Open
in Deinen Source schreiben. Delphi "schaltet" hier völlig transparent zum Late Binding um.

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:
OleVariant(WordApplication).Open(Filename)
auch hier wird temporär die Späte Bindung verwendet.

Ich hoffe meine Erinnerung hat mir keinen Streich gespielt

MathiasSimmack 5. Mai 2004 22:29

Re: Frage zu OleVariant
 
Das mit dem "direkten Weitermachen" hatte ich schon versucht, Jens. Aber da beschwert sich der Compiler
Delphi-Quellcode:
// [Fehler] Unit1.pas(120): Inkompatible Typen: 'Variant' und 'IEnumHxRegPlugIn'
pluginEnum := propId.EnumRegPlugIn(0,0);
Und die Variablen:
Delphi-Quellcode:
var
  propId    : OleVariant;
  pluginEnum : IEnumHxRegPlugIn;
Seltsam ist, dass bspw.
Delphi-Quellcode:
ShowMessage(inttostr(propId.Count));
funktioniert, denn "Count" ist auch eine Methode von "IHxRegPlugInList", genau wie "EnumRegPlugIn". :(

Motzi 6. Mai 2004 00:14

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;

MathiasSimmack 6. Mai 2004 08:49

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?

NicoDE 6. Mai 2004 09:26

Re: Frage zu OleVariant
 
Zitat:

Zitat von MathiasSimmack
Glaubt ihr, dass das was bringt?

Versuchen kannst Du es immer :)
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...

MathiasSimmack 6. Mai 2004 10:06

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:

Wenn Du Glück hast, dann bekommt es der richtige.
Wie meinst´n du das eigentlich, Nico? :stupid:

shmia 6. Mai 2004 10:19

Re: Frage zu OleVariant
 
Zitat:

Zitat von Motzi
Hab nen ähnlichen Fall und da funktioniert das so:
Delphi-Quellcode:
var
  propId    : OleVariant;
  pluginEnum : IEnumHxRegPlugIn;

pluginEnum := IUnknown(propID) as IEnumHxRegPlugIn;

<Klugscheisermode>
Man sollte besser nach IDispatch casten, denn das OleVariant enthält einen Interfacezeiger
auf eine Dispatchschnittstelle:
Delphi-Quellcode:
pluginEnum := IDispatch(propID) as IEnumHxRegPlugIn;
</Klugscheisermode>

NicoDE 6. Mai 2004 11:00

Re: Frage zu OleVariant
 
Zitat:

Zitat von MathiasSimmack
Wie meinst´n du das eigentlich, Nico? :stupid:

So wie's da steht :mrgreen:
(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

MathiasSimmack 6. Mai 2004 11:27

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.
Seite 1 von 2  1 2      

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