我们如何使用特定文件扩展名注册Shell扩展

时间:2010-09-21 07:39:58

标签: c++ windows windows-shell shell-extensions

我已经测试了一个引用代码项目article的小型shell扩展。虽然整个过程非常复杂,但我知道下面的方法是什么以及它们做了​​什么。:

Initialize,DragQueryFile,GetCommandString,InvokeCommand,QueryContextMenu

但在阅读完之后,我无法理解我们的ContextMenu扩展如何与.txt文件相关联。

文章解释了我们是否会查看.rgs文件,我们可以看到它创建了一个这样的注册表项:

HKCR
{
  NoRemove txtfile
  {
    NoRemove ShellEx
    {
      NoRemove ContextMenuHandlers
      {
        ForceRemove SimpleShlExt = s '{5E2121EE-0300-11D4-8D3B-444553540000}'
      }
    }
  }
}

但实际上,在关注文章并编写代码之后,当我打开SimpleShlExt.rgs它看起来像这样:

- 在CodeProject中编辑 -

HKCR
{

    NoRemove CLSID
    {
        ForceRemove {1E569362-E0A6-4DEA-AB1F-67D6D3DEF1A5} = s 'SimpleShExt Class'
        {

            InprocServer32 = s '%MODULE%'
            {
                val ThreadingModel = s 'Apartment'
            }

        }
    }
}

注册表是否动态创建了CLSID和txtfile reg条目之间的任何映射。

如果是这种情况,如果我想修改任何其他文件的行为,例如对于mp3文件或驱动器本身,我希望我的上下文菜单弹出或显示,那么如何去做。因为我不知道CLSID。

3 个答案:

答案 0 :(得分:1)

一种可能性是为您要支持的所有文件扩展名注册上下文菜单。另一种可能性是在通配符/ *类中注册您的扩展。然后它将针对所有文件进行实例化。然后,您可以决定是否应该为此文件显示上下文菜单。这可以通过使用IShellExtInit :: Initialize。

的IDataObject参数来完成

答案 1 :(得分:0)

您必须手动将txt文件扩展名注册的部分添加到您的rgs文件中。 Visual Studio仅添加部件以注册shell扩展。

答案 2 :(得分:0)

假设您的 lib 的 for x, row in df.iterrows(): zip_text = row['zip_cd'] street_text = row['street_addr'] test_wtf1 = len(re.findall('\d{5}$', street_text) ) test_wtf3 = re.search('\d{5}$', street_text) #alternative that works with None test_zip = ((zip_text == 'nan') | (zip_text == '') ) test_addr = (test_wtf1 != 0) df.at[x, 'zip_cd'] = np.where( (test_zip and test_addr), str(street_text[-5:]1), str(zip_text) ) df.at[x, 'street_addr'] = np.where( test_addr, str(street_text[:len(street_text)-5]), str(street_text) ) zip_text1 = df.at[x, 'zip_cd'] street_text1 = df.at[x, 'street_addr'] if test_zip or test_addr: do_nothing_last = "" #breakpoint for testing specific situations return df uuid,然后使用以下内容将您的 shell 扩展名与 5E2121EE-0300-11D4-8D3B-444553540000*.txt 文件相关联。为每个新扩展添加另一个块:

*.tab