猿问

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

我想知道在C ++应用程序中注册文件扩展名的最干净的方法,这样当双击与我的程序关联的数据文件时,将打开该应用程序,并将文件名作为参数传递给该应用程序。

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

另外,这是否还意味着如果删除了该应用程序,注册表中未使用的条目将被留下来?


湖上湖
浏览 619回答 3
3回答

缥缈止盈

您可以在此MSDN文章中找到有关该过程的基本概述。关键部分在列表的底部:注册ProgIDProgID(本质上是文件类型注册表项)是包含重要文件类型属性的内容,例如图标,描述和上下文菜单项,包括双击文件时使用的应用程序。许多扩展名可能具有相同的文件类型。该映射在下一步中完成:注册文件类型的文件扩展名在这里,您可以为扩展名设置一个注册表值,将该扩展名的文件类型设置为您在上一步中创建的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中打开文件时,您的应用程序将不会启动。

斯蒂芬大帝

我不知道为什么人们总是说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>。
随时随地看视频慕课网APP
我要回答