Ich bin nicht vertraut mit dieser Bibliothek, aber ich kann einige Vorschläge machen.Wenn Sie das Problem aus der Sicht von COM betrachten, werden Sie feststellen, dass es keine einfache Antwort gibt.
(Denken Sie daran, dass in COM alle Objekte nur Objekte sind, und dass die einzige Voraussetzung ist, dass sie IUNKNOWN (und möglicherweise andere Schnittstellen) unterstützen muss. Also die Antwort auf die Frage, um was für ein Objekt es sich handelt "kann oft mehr als eine Antwort haben."
Die wichtige Sache zu erinnern ist, dass in COM die Liste der Schnittstellen für ein Objekt in keiner Art von Metadaten wie in .NET definiert ist (außer dass eine Bibliothek in der Regel bietet eine optionale Typ Bibliothek als eine Form der Dokumentation für Entwicklungswerkzeuge - mehr dazu in einer Minute).
Die Liste der Schnittstellen wird offiziell nur durch die Ergebnisse der Aufruf von IUNKNOWN's QueryInterface() - Methode definiert - das heißt, sie wird ausschließlich durch das Ergebnis der Codeausführung definiert.
Manchmal ist die Liste möglicherweise hart codiert. Häufig ist die Liste möglicherweise erst zur Laufzeit bekannt, und es ist möglicherweise nicht einmal bekannt, bis jemand fragt. Die einzige Regel ist, dass die Liste der Schnittstellen stabil sein muss und was ich vernünftige aufrufen: die Liste kann nicht im Laufe der Zeit für eine bestimmte Objektinstanz ändern; Es muss IUNKNOWN unterstützen, was manchmal vergessen wird; Wenn es eine abgeleitete Schnittstelle unterstützt, muss es seine Basis unterstützen; und ein paar andere bin ich sicher, dass ich es vergesse.
Dieser letzte Punkt ist entscheidend für Ihr Problem: COM weiß nicht a priori welche Schnittstellen von jedem Objekt unterstützt werden. Die .NET-Runtime kennt das auch nicht - jedenfalls nicht von COM. Die einzige Möglichkeit, die .NET kennt, wäre, wenn die Typbibliothek für das Objekt angibt, dass das zurückgegebene Objekt von einer bestimmten Schnittstelle stammt. Es fehlt Ihnen nur ein IUNKNOWN-Pointer und Sie müssen über Code nach bestimmten Schnittstellen fragen, ob Sie eine andere Antwort als NULL erhalten.
Da der Typ des SelectedItem
propery Objekt ist, bedeutet dies, dass die Typenbibliothek einfach sagt „der Rückgabetyp eine Schnittstelle Zeiger vom Typ IUnknown ist“ (es IDispatch sein könnte, aber das Prinzip steht). Der genaue Typ hängt natürlich von den Laufzeitbedingungen ab - "was gerade ausgewählt wird".
(In .NET ist der Rückgabetyp tatsächlich System.__ComObject
, weil Sie nicht einen nackten Interface-Zeiger aber einen COM Callable Wrapper, der ein .NET-basierter Proxy für das Objekt erhalten haben) von
Sie sind auf Gedeih und Verderb die (schlechte?) Dokumentation der Bibliothek, um einen Hinweis darauf zu erhalten, welche Arten von Schnittstellen das zurückgegebene Objekt unterstützen könnte. Wenn Sie das nicht tun, könnte Code wie Chibacity Ihnen auch eine unvollständige Liste bringen (ich habe diesen Code nicht überprüft). Letztendlich möchten Sie diesen Code wahrscheinlich verwenden, um beim Debuggen eine Liste der Kandidatenschnittstellen zu erhalten.
Sobald Sie ein paar Möglichkeiten kennen, die Sie interessieren, können Sie sich Tippfehler ersparen, indem Sie einfach den C# as
-Operator verwenden (wodurch der COM-Callable-Wrapper die entsprechenden COM-Spells für das native Objekt ausgibt).
Ich glaube nicht, dass 'IsAssignableFrom' in diesem Fall funktioniert. –
@Nicolas Sind Sie sicher? –
In Ihrem Code wird 'unknown.GetType() 'immer' System .__ ComObject 'zurückliefern, da es sich um den .net verwalteten Wrapper um' IUnknown' handelt. Also, von einem '.net type System' Punkt der vue, implementiert System .__ ComObject wirklich keine der com Schnittstellen, an denen wir interessiert sind. –