Set*_*eth 42 c++ registry file-extension
我想知道,这样当我的程序相关的数据文件被双击,打开应用程序和文件名作为参数传递给应用与我的C++应用程序注册文件扩展名的最彻底的方法.
目前,我通过我的wix安装程序执行此操作,但有些情况下应用程序将不会安装在用户的计算机上,因此我还需要通过应用程序创建注册表项的选项.
此外,这是否也意味着如果删除了应用程序,注册表中未使用的条目将被放置?
Fac*_*tic 79
您可以在此MSDN文章中找到有关该过程的基本概述.关键部分位于列表的底部:
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中打开该文件时,您的应用程序将无法启动.
对于你想做的事情,这应该是一个不错的入门书.为了进一步阅读,我建议
另请参阅我对类似问题的类似答案:
这是一个两步过程:
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();
我不知道为什么人们会一直说这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>.