1

背景和我做了什么

我正在尝试学习如何为 Windows 编写 shell 扩展,但是该过程没有很好的文档记录,并且初学者的信息很少。根据我的阅读,指南作为 Windows shell 扩展的最佳初学者教程之一随处发布。我已经按照教程完成了,但我不得不进行一些调整以避免一些冲突:

  1. 我不得不修改 Visual Studio 2012 来构建 x86-64bit。我所做的只是将配置从 切换win32x64,但可能还有更多我不知道的步骤。
  2. 我使用guidgen.exeVisual Studio 2012 附带的 为我生成 GUID。

我的项目编译成功,我可以通过终止explorer.exe(ctrl+shift+右键单击开始菜单,选择Exit Explorer)并在发布模式下编译/运行我的项目(然后启动另一个实例explorer.exe)来启动它。

问题

regedit.exe问题是执行程序时没有写入 CLSID 值(尽管txtfile注册表位置确实得到了更新)。此外,任何程序挂钩都不起作用,如果 CLSID 没有注册,这是可以预料的。我希望我能进一步缩小问题的范围,而不仅仅是说“帮助;它不起作用!” 但老实说,我不知道我能做些什么来进一步查明问题。我几乎可以肯定我的SimpleShlExt.rgs文件有问题,但是该指南没有提供有关该*.rgs文件的关键步骤的太多信息(除了一些离题的玩笑)

  1. 在向注册表注册我的 DLL 时,如何获得有关出现问题的更多信息?
  2. 教程中没有解释 Visual Studio 2012 的任何警告(由于教程的年龄或我缺乏隐含的知识)。
  3. 我的SimpleShlExt.rgs文件有什么问题?!?!?

代码

有关其他信息,我在下面发布了相关代码。它与上面引用的指南几乎相同(但具有不同的 GUID)。如果需要,我可以发布我的SimpleShlExt.cppSimpleShlExt.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}'
            }
        }
    }
}
4

1 回答 1

1

这是很久以前的事了,但我才意识到我把这个挂了。我回到使用示例的 CLSID 并且它工作得很好。我发现了其他几个定义 CLSID 的文件,然后这些文件与我用guidgen.exe. 例如,教程并没有真正提到SimpleExt.h其中也注册了 CLSID 信息。为了更改 CLSID,您必须找出它出现的所有位置。

于 2013-07-30T19:35:18.880 回答