c++ - Windows shell 扩展教程不会将 CLSID 添加到注册表

标签 c++ com registry atl shell-extensions

背景和我做了什么

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

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

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

问题

问题是在执行程序时 CLSID 值没有写入 regedit.exe(尽管 txtfile 注册表位置确实得到更新)。此外,所有程序 Hook 都不起作用,如果未注册 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}'
            }
        }
    }
}

最佳答案

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

关于c++ - Windows shell 扩展教程不会将 CLSID 添加到注册表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17031488/

相关文章:

c - RegLoadAppKey参数不正确

c# - 如何使用 Microsoft.Win32.Registry C# 创建注册表项

c++ - g++ 编译器是否以不同方式查看字符串数组和整数数组?

C++ 应用程序在 64 位版本的 Windows 中崩溃,但在 32 位 Windows 上运行良好

c++ - 如何 : Display progress dialog using IFileOperation

c++ - 确认注册的 COM 对象 CoCreateInstance 返回 REGDB_E_CLASSNOTREG

c++ - 日历库 C++

C++11绑定(bind): difference between using and not-using placeholder

C++、ASM 和 cout

Java - 如何远程访问 Windows 注册表