2011-05-17 3 views
2

J'espérais que quelqu'un ici avait un aperçu de ce qui pourrait être à l'origine de ce problème. J'ai implémenté plusieurs extensions COM pour Explorer qui fournissent ShellIconOverlays et un ContextMenu, et les superpositions fonctionnent parfaitement. Le menu contextuel fonctionne bien quand je clique sur le bureau mais quand je clique avec le bouton droit dans une instance d'explorateur, je peux voir l'interface interrogée dans le débogueur et une instance de IShellExtInit générée mais la fonction initialize n'est pas appelée dans l'explorateur instances, mais il est appelé bien à partir du bureau et un élément ContextMenu est interrogé immédiatement après.Windows Shell Extension ne pas initialiser

Quelqu'un a déjà vu quelque chose comme ça avant?

Répondre

2

Si vous déboguez une extension shell, il est probable que vous ayez eu l'occasion de terminer le processus en cours d'exécution explorer.exe et d'en démarrer un nouveau. Lorsque vous avez démarré un nouveau, fonctionnait-il avec le même niveau d'intégrité que l'original?

Vos paramètres de l'explorateur indiquent-ils de parcourir les fichiers dans un nouveau processus? Si oui, ce processus fonctionne-t-il avec le même niveau d'intégrité que l'original? En outre, puisque vous exécutez un débogueur, il est probable que vous ayez créé une version de débogage. Est-ce que explorer.exe essaie parfois de charger la version debug de votre DLL et essaie parfois de charger la version release de votre DLL?

+0

Pouvez-vous élaborer sur la partie «niveau d'intégrité» de votre réponse? Je suis confronté à exactement ce même problème, https://www.youtube.com/watch?v=NEq1S2y6Y14, version build etc. Je reçois les appels createAggregate() et queryInterface() à l'instance de IShellExtInit, mais Initialize n'est jamais appelé. Il est * appelé * lorsqu'il est exécuté à partir du bureau, des boîtes de dialogue à fenêtre ouverte, etc. – qdot

+0

De nombreux auteurs publient de nombreux articles MSDN et blogues. Les niveaux d'intégrité sont élevés, moyens et faibles. Les applications exécutées à différents niveaux d'intégrité sont isolées les unes des autres, même dans le même bureau. Habituellement, le processus explorer.exe fonctionne à intégrité moyenne. Si quelqu'un exécute Visual Studio en tant qu'administrateur et débogue un processus, il peut s'agir d'une intégrité élevée. Dans certains cas, explorer.exe peut être exécuté avec une intégrité élevée, de sorte que le problème peut être le contraire, si une application fonctionne à intégrité moyenne. –

+0

Merci. Il s'est avéré être sans rapport - j'ai toujours supposé que le concept d'intégrité a été introduit autour de Vista, et j'ai rencontré ces bugs dans XP. – qdot

0

OK, je tombe sur le même problème ici, et il se trouve que la question doit faire avec

ThreadingModel = Apartment 

Fondamentalement, ce que je pense que vous rencontrez, est que le deuxième fil de explorer.exe (le bureau s'exécute dans le thread STA) utilise la valeur par défaut (ancienne version) ThreadingModel - et s'attend à ce que votre COM mette en œuvre IMarshal pour effectuer l'IPC. ApartmentThreadingModel permet à plusieurs instances de votre classe IShellExt de coexister.


caveat - Si vous utilisez ActiveQt pour développer Menu contextuel Extensions Shell, il y a quelques trucs à utiliser.