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

时间:2013-06-10 19:38:41

标签: c++ com registry atl shell-extensions

上下文&我做了什么

我正在尝试学习如何为Windows编写shell扩展,但是这个过程没有很好地记录,并且初学者的信息很少。根据我的阅读,this指南随处可见,作为Windows shell扩展的最佳初学者教程之一。我已经按照教程进行了结束,但我必须做一些调整以避免一些冲突:

  1. 我不得不修改Visual Studio 2012以构建x86-64bit。我所做的只是将配置从win32切换到x64,但可能会有更多我不了解的步骤。
  2. 我使用Visual Studio 2012附带的guidgen.exe来为我生成GUID。
  3. 我的项目编译成功,我可以通过终止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文件出了什么问题?!?!?
    4. 代码

      有关其他信息,我已在下面发布了相关代码。它几乎与上面引用的指南相同(但具有不同的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}'
                  }
              }
          }
      }
      

1 个答案:

答案 0 :(得分:1)

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