为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
湖上湖 2019-09-21 14:31:21
我想知道在C ++应用程序中注册文件扩展名的最干净的方法,这样当双击与我的程序关联的数据文件时,将打开该应用程序,并将文件名作为参数传递给该应用程序。当前,我是通过wix安装程序执行此操作的,但是在某些情况下,该应用程序将不会安装在用户的计算机上,因此,我还需要通过该应用程序创建注册表项的选项。另外,这是否还意味着如果删除了该应用程序,注册表中未使用的条目将被留下来?
查看完整描述

3 回答

?
缥缈止盈

TA贡献2041条经验 获得超4个赞

您可以在此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"

现在,您可能希望以编程方式完成此任务。绝对来说,您可以检查这些键是否存在,并相应地更改程序行为,尤其是在假设您控制某些通用文件扩展名的情况下。但是,可以通过使用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");

当然,您可以手动打开每个子键,手动创建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中打开文件时,您的应用程序将不会启动。


查看完整回答
反对 回复 2019-09-21
?
斯蒂芬大帝

TA贡献1827条经验 获得超8个赞

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


它确实有效,但是将被覆盖


HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\<.ext>\UserChoice

我相信Microsoft建议第二种做法-因为这是内置的“打开方式”所做的。在这种情况下,Progid“键” 的值等于默认值HKEY_CURRENT_USER\Software\Classes\<.ext>。


查看完整回答
反对 回复 2019-09-21
  • 3 回答
  • 0 关注
  • 618 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信