背景和我做了什么
我正在尝试学习如何为 Windows 编写 shell 扩展,但是这个过程没有很好的记录,而且初学者的信息很少。根据我的阅读,this该指南作为 Windows Shell 扩展的最佳初学者教程之一随处发布。我已经按照教程进行到最后,但我不得不做一些调整以避免一些冲突:
- 我不得不修改 Visual Studio 2012 以构建 x86-64 位。我所做的只是将配置从
win32
切换到x64
,但可能还有更多我不知道的步骤。 - 我使用 Visual Studio 2012 附带的
guidgen.exe
为我生成 GUID。
我的项目编译成功,我可以通过终止explorer.exe
(ctrl+shift+右键单击开始菜单,选择Exit Explorer
)并编译/运行来启动它我的项目处于 Release模式(然后启动 explorer.exe
的另一个实例)。
问题
问题是在执行程序时 CLSID 值没有写入 regedit.exe
(尽管 txtfile
注册表位置确实得到更新)。此外,所有程序 Hook 都不起作用,如果未注册 CLSID,这是可以预料的。我希望我能进一步缩小问题的范围,而不是仅仅说“帮助;它不起作用!”但老实说,我不知道我能做些什么来进一步查明问题。我几乎可以肯定我的 SimpleShlExt.rgs
文件有问题,但是该指南没有提供有关 *.rgs
文件这一关键步骤的太多信息(除了一些离题的玩笑)
- 在向注册表注册我的 DLL 时,我如何才能获得有关出现问题的更多信息?
- 教程中是否有任何未解释的 Visual Studio 2012 警告(由于教程年代久远或我缺乏隐含知识)。
- 我的
SimpleShlExt.rgs
文件有什么问题?!?!?
代码
有关更多信息,我在下面发布了相关代码。它与上面引用的指南几乎相同(但具有不同的 GUID)。如果需要,我可以发布我的 SimpleShlExt.cpp
和 SimpleShlExt.h
,但是它与指南几乎相同,我不确定它是否添加了任何有用的信息。
SimpleShlExt.rgs(CLSID 是用 guidgen.exe
生成的)
HKCR
{
NoRemove CLSID
{
ForceRemove {E2D6660C-E3E5-43CE-BF24-44D4269EEC1C} = s 'SimpleShlExt Class'
{
InprocServer32 = s '%MODULE%'
{
val ThreadingModel = s 'Apartment'
}
}
}
}
HKCR
{
NoRemove txtfile
{
NoRemove ShellEx
{
NoRemove ContextMenuHandlers
{
ForceRemove SimpleShlExt = s '{E2D6660C-E3E5-43CE-BF24-44D4269EEC1C}'
}
}
}
}
最佳答案
这是很久以前的事了,但我才意识到我把它搁置了。我回去使用示例的 CLSID,它工作得很好。我发现了其他几个定义 CLSID 的文件,这些文件与我使用 guidgen.exe
生成的文件不匹配。例如,本教程并没有真正提到 SimpleExt.h
,它也注册了 CLSID 信息。为了更改 CLSID,您必须找出它出现的所有位置。
关于c++ - Windows shell 扩展教程不会将 CLSID 添加到注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031488/