我有一些Windows应用程序,在Windows 7 32位上运行。我正在尝试使用Windows注册表向我的应用程序注册特定的文件扩展名open命令。这样的文件扩展名是我自己的,也是我注册的。该应用程序安装在Program Files
内的特定子目录中。我希望我的安装程序能够正确地为32位和64位平台注册应用程序,因为x86和x64平台上的实际Program Files
目录名称可能不同,而我需要指定应用程序的路径,我正在使用注册表重定向%ProgramFiles%
。在这里,我重现了我对注册表所做的记录:
// file extension
HKEY_CURRENT_USER
Software
Classes
.myext
Default REG_SZ myapp.myext
// application
HKEY_CURRENT_USER
Software
Classes
.myapp.myext
Shell
Open
Command
Default REG_SZ "%ProgramFiles%\path\to\my\app\myapp.exe" -u -i "%1"
我的测试机器中程序文件目录的实际路径为C:\Program Files
有了这样的注册,我收到一个错误:
Windows无法访问指定的设备路径或文件。你不可以 拥有访问该项目的适当权限。
如果我将%ProgramFiles%
替换为实际C:\Program Files
,一切正常。此外,当我使用相同的路径:"%ProgramFiles%\path\to\my\app\myapp.exe"
从控制台运行应用程序一切正常。这个问题可能是什么原因。
答案 0 :(得分:1)
%ProgramFiles%计算32位进程中的32位程序文件dir和64位进程中的64位程序文件dir。但是,可执行文件的位置不依赖于shell的位数,而是读取这些注册表设置。您希望将以下值写入注册表:
"C:\Program Files (x86)\path\to\my\app\myapp.exe" -u -i "%1"
我假设这是32位程序文件dir的路径。您不应该将环境变量写入此注册表项。您的安装程序已经知道可执行文件的完整路径,您只需编写它。
我认为可能让您感到困惑的一个问题是您可能认为程序文件目录受文件系统重定向的影响。他们不是。
顺便说一句,如果您需要在注册表中编写环境变量,并希望在阅读时对其进行扩展,请使用REG_EXPAND_SZ
而不是REG_SZ
。