我目前正在尝试创建一个自定义的Shell Namespace扩展(用于呈现一个包含“子文件夹”和“文件”的虚拟文件夹,它们实际上是来自远程服务的分层树结构中的数据的表示形式)。
这个扩展是用C#编写的,我知道这曾经是一个坏主意,但是自从.NET 4引入了不同版本的.NET运行时在同一进程中共存的可能性以来,我认为这个限制已经不再是问题了。
到目前为止,通过遵循网络上提供的大量示例和参考资料,我已经让它在Windows XP中运行得很好,但当我在Windows 7中尝试它时(我还没有在Vista中尝试它,所以我不知道它在Vista中是否有效),这个扩展没有加载。根据我的调试日志输出,它注册正常,但是当我打开Windows资源管理器窗口时,似乎没有发生对COM接口的常见调用(通常以IPersistFolder::Initialize开始)。实际上,甚至连类构造函数都没有被调用。我不知道是否正在查询接口(是否成功),因为我不确定如何在.NET中检测到这一点,以便记录它。所以,基本上,我没有任何线索可供参考,因为它甚至在我有机会记录任何可能出错的有用信息之前就失败了。
有没有人知道问题出在哪里?与Windows XP相比,Windows 7在处理shell命名空间扩展时有没有什么我应该注意的特性?如果需要更多细节,请随时询问(我尽量保持简短,因为我确信没有人会喜欢我在这里复制和粘贴我的整个代码,并且我不能将其缩减到仅相关的部分,因为我根本不知道哪些是……)
发布于 2012-12-20 04:20:20
我刚才遇到了一个非常类似的情况:
扩展位于正确的位置(在我的例子中是“我的电脑”)、图标和所有东西。尽管如此,我的COM类(我检查了进程监视器)没有执行任何实例化,也没有调用
我使用的是ATL和64位,所以我知道.NET不是我的问题。
原来问题是注册表中没有以下值:HKEY_CLASSES_ROOT\CLSID{您的CLSID}\ShellFolder "Attributes"=dword:20000000
(仅有键或值是不够的-您需要(至少)有这个特定的属性值才能启动某些东西)。
添加之后,你需要杀死所有的explorer.exe进程并再次启动一个(例如使用任务管理器)。我希望这也能解决你的问题。
发布于 2011-07-14 17:47:55
这可能是由于以下原因:
作为自己开发这种复杂野兽的另一种选择,可以考虑使用EZNamespaceExtensions -它使开发变得非常简单,您可以专注于提供特定于nse的功能。
免责声明:我们是EZNamespaceExtensions的开发者。
发布于 2018-08-15 00:09:44
谢谢@Oren,对我来说,问题是我需要删除以下regedit条目中的所有其他版本:HKEY_CLASSES_ROOT\CLSID{您的CLSID}\InprocServer32\
我只留下了当前的版本。我想问题是我的版本号比我当前的版本高。
补充一句,我不得不对另一台有类似问题的计算机执行同样的甚至更多的操作。我从HKEY_LOCAL_MACHINE\SOFTWARE\CLASSES\CLSID{your CLSID\InprocServer32\中删除了所有其他版本
https://stackoverflow.com/questions/6667063
复制相似问题