2011-05-17 69 views
2

我希望有人在這裏有一些洞察什麼可能會導致此問題。我已經爲Explorer提供了幾個COM擴展,提供了ShellIconOverlay和ContextMenu,並且覆蓋層完美工作。上下文菜單工作正常,當我點擊桌面時,但當我右鍵單擊任何資源管理器實例時,我可以看到在調試器中查詢接口和正在生成的IShellExtInit實例,但初始化函數不會在瀏覽器中調用實例,但它在桌面上被稱爲罰款,並且之後立即查詢ContextMenu項目。Windows外殼擴展沒有調用初始化

有沒有人在這裏看到過這樣的事情?

回答

2

如果你正在調試一個shell擴展,很可能你有時候終止正在運行的explorer.exe進程並開始一個新的進程。當你開始一個新的,它是否與原來的一樣完整?

您的資源管理器設置是否會在新流程中瀏覽文件?如果是這樣,那麼這個過程是否與原來的完整性級別一樣?

此外,由於您正在運行調試程序,因此您可能會構建一個調試版本。 explorer.exe有時會嘗試加載DLL的調試版本,有時會嘗試加載DLL的發行版本?

+0

您可以詳細說明答案的「完整性級別」部分嗎?我遇到了這個完全相同的問題,https://www.youtube.com/watch?v=NEq1S2y6Y14,發佈構建等我確實得到了對IShellExtInit的實例的createAggregate()和queryInterface()調用,但初始化永遠不會被調用。當從桌面運行,打開窗口對話框等時,它*被*調用。 – qdot 2014-09-10 18:06:58

+0

許多作者都有許多MSDN文章和博客文章。完整性水平高,中,低。即使在相同的桌面環境中,運行在不同完整性級別的應用程序也可以相互隔離。通常explorer.exe進程以中等完整性運行。如果某人以管理員身份運行Visual Studio並調試一個進程,那麼它可能具有很高的完整性。在某些情況下,explorer.exe可能以高完整性運行,所以如果應用程序以中等完整性運行,問題可能相反。 – 2014-09-10 23:06:05

+0

謝謝。事實證明,這與我無關 - 我始終認爲完整性概念是圍繞Vista引入的,我在XP中遇到過這些錯誤。 – qdot 2014-09-11 15:41:27

0

OK,我碰上了完全相同的問題就在這裏,而且事實證明,這個問題有

ThreadingModel = Apartment 

基本上,我認爲你正在經歷的事情,就是第二線explorer.exe(桌面在STA線程中運行)使用默認(傳統)ThreadingModel - 並且期望您的COM執行IMarshal來執行IPC。 ApartmentThreadingModel允許IShellExt類的多個實例共存。


買者 - 如果你正在使用ActiveQt開發上下文菜單外殼擴展,很少有更多的技巧來使用。