创建注册表项以将文件扩展名与C++中的应用程序相关联

Set*_*eth 42 c++ registry file-extension

我想知道,这样当我的程序相关的数据文件被双击,打开应用程序和文件名作为参数传递给应用与我的C++应用程序注册文件扩展名的最彻底的方法.

目前,我通过我的wix安装程序执行此操作,但有些情况下应用程序将不会安装在用户的计算机上,因此我还需要通过应用程序创建注册表项的选项.

此外,这是否也意味着如果删除了应用程序,注册表中未使用的条目将被放置?

Fac*_*tic 79

您可以在此MSDN文章中找到有关该过程的基本概述.关键部分位于列表的底部:

  • 注册ProgID

ProgID(本质上是文件类型注册表项)包含重要的文件类型属性,例如图标,描述和上下文菜单项,包括双击文件时使用的应用程序.许多扩展可能具有相同的文件类型.该映射在下一步中完成:

  • 注册文件类型的文件扩展名

在这里,您为扩展设置了一个注册表值,将该扩展名的文件类型设置为您在上一步中创建的ProgID.

使用您的应用程序打开文件所需的最少工作量是设置/创建两个注册表项.在这个示例.reg文件中,我创建了一个文件类型(blergcorp.blergapp.v1)并将文件扩展名(.blerg)与它关联起来.

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command]
@="c:\path\to\app.exe \"%1\""
[HKEY_CURRENT_USER\Software\Classes\.blerg]
@="blergcorp.blergapp.v1"
Run Code Online (Sandbox Code Playgroud)

现在,您可能希望以编程方式完成此操作.为了绝对犹太,你可以检查这些键的存在,并相应地改变你的程序行为,特别是如果你正在控制一些常见的文件扩展名.但是,可以通过使用SetValue函数设置这两个键来实现目标.

我不确定C++的确切语法,但在C#中,语法看起来像这样:

Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\blergcorp.blergapp.v1\shell\open\command", null, @"c:\path\to\app.exe \"%1\"");
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Classes\.blerg", null, "blergcorp.blergapp.v1");
Run Code Online (Sandbox Code Playgroud)

当然你可以手动打开每个子键,手动创建ProgID和扩展子键,然后设置键值,但关于该SetValue功能的一个好处是,如果键或值不存在,它们将自动创建.非常便利.

现在,快速了解哪个蜂巢使用.许多在线文件关联示例(包括MSDN上的文件关联示例)显示了这些密钥的设置HKEY_CLASSES_ROOT.我不建议这样做.该配置单元是HKEY_LOCAL_MACHINE\Software\Classes(系统默认值)和HKEY_CURRENT_USER\Software\Classes(每用户设置)的合并虚拟视图,并且对配置单元中的任何子项的写入都将重定向到相同的密钥HKEY_LOCAL_MACHINE\Software\Classes.现在,这样做没有直接问题,但是您可能会遇到这个问题:如果您写入HKCR(重定向到HKLM),并且用户在HKCU中指定了具有不同值的相同键,则HKCU值将优先.因此,您的写入将成功,但您不会看到任何更改,因为HKEY_CURRENT_USER设置优先于HKEY_LOCAL_MACHINE设置.

因此,在设计应用程序时应考虑到这一点.现在,另一方面,你可以只写HKEY_CURRENT_USER,正如我在这里的例子所示.但是,只会为当前用户加载该文件关联设置,如果已为所有用户安装了应用程序,则当其他用户在Windows中打开该文件时,您的应用程序将无法启动.

对于你想做的事情,这应该是一个不错的入门书.为了进一步阅读,我建议

另请参阅我对类似问题的类似答案:

  • 为了编辑(默认)键,你应该使用:@ = "C:\\路径\\为\\ APP.EXE \" %1\"" 注意:多布尔 "\\" (3认同)
  • @ThomasTempelmann可以在SO上询问和回答你自己的问题,所以继续发布并将其链接到这里为后代 (3认同)

bee*_*ann 7

这是一个两步过程:

 1. Define a program that would take care of extension: (unless you want to use existing one)
      1.1 create a key in "HKCU\\Software\\Classes\\" for example 
          "Software\\Classes\\YourProgramName.file.ext"
      1.2 create subkey "Software\\Classes\\YourProgramName.file.ext\\DefaultIcon"
        1.2.1 set default value ("") to your application full path to get
              icon from resources
      1.3 create a subkey "Software\\Classes\\YourProgramName.file.ext\\Shell\\OperationName\\Command"
          OperationName = for example Open, Print or Other
        1.3.1 set default value ("") to your application full path +optional runtime params (filename)

2.Associate file extension with program.
  2.1 create a key HKCU\\Software\\Classes\\.ext   - here goes your extension
  2.2 set default value to the program definition key
    ("YourProgramName.file.ext")

下面是用c#编写的程序的一部分,它关联文件扩展名.它不是c ++,但我认为它很简单,需要解释自己和AFAIK它是verv simmilar如果不是与c ++中的代码相同

1.


    RegistryKey keyPFCTExt0 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc", true);
        if (keyPFCTExt0 == null)
        {
            keyPFCTExt0 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc");
            keyPFCTExt0.CreateSubKey("DefaultIcon");
                RegistryKey keyPFCTExt0ext = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\DefaultIcon", true);
                    keyPFCTExt0ext.SetValue("", Application.ExecutablePath +",0");
                keyPFCTExt0ext.Close();
            keyPFCTExt0.CreateSubKey("Shell\\PFCT_Decrypt\\Command");
        }
    keyPFCTExt0.SetValue("", "PFCT.file.enc");
    keyPFCTExt0.Close();

2.


    RegistryKey keyPFCTExt1 = Registry.CurrentUser.OpenSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command", true);
        if (keyPFCTExt1 == null)
            keyPFCTExt1 = Registry.CurrentUser.CreateSubKey("Software\\Classes\\PFCT.file.enc\\Shell\\PFCT_Decrypt\\Command");
        keyPFCTExt1.SetValue("", Application.ExecutablePath + " !d %1"); //!d %1 are optional params, here !d string and full file path
        keyPFCTExt1.Close(); 


fir*_*ack 6

我不知道为什么人们会一直说这HKEY_CURRENT_USER\Software\Classes\<.ext>是默认值(它会将你重定向到另一个(软件创建的)类.

它确实有效,但它会被覆盖

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>\UserChoice
Run Code Online (Sandbox Code Playgroud)

而且我相信微软推荐第二种做法 - 因为它是内置的"开放式"所做的.在这种情况下,Progid"key" 的值等于默认值HKEY_CURRENT_USER\Software\Classes\<.ext>.