c++ - 从 32 位应用程序打开 64 位注册表编辑器

标签 c++ windows winapi shellexecute

我正在尝试使用 ShellExecute 从我的 32 位应用程序打开 64 位 Regedit。

我在 Process Explorer 中注意到,如果我正常打开 Regedit,它会显示图像是 64 位的,但是如果我使用 ShellExecute 从我的 32 位应用程序中打开 C:\Windows\Regedit.exe, Process Explorer 说图像是 32 位的。

(它确实在 Windows 目录中打开注册表编辑器,而不是在 SysWOW64 中)

我发现如果我在调用 ShellExecute 之前使用 Wow64DisableWow64FsRedirection 函数,它会打开它的 64 位图像。但是我的应用程序无法在 32 位 XP 上运行。

令我困惑的是,无论我以何种方式打开 regedit,它们都驻留在 C:\Windows 中,并且都是相同的可执行文件。同一个可执行文件怎么会有两种不同的图像类型?以及如何在没有 Wow64DisableWow64FsRedirection 的情况下打开 64 位版本?

最佳答案

您需要使用 Is64BitProcess 检测您是否处于 64 位进程中,如果是,则访问 %windir%\Sysnative,因为它指向“真实”System32 文件夹,以便 32 位应用程序需要访问 64 位 System32 文件夹。

string system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "system32");
if(Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
{
    // For 32-bit processes on 64-bit systems, %windir%\system32 folder
    // can only be accessed by specifying %windir%\sysnative folder.
    system32Directory = Path.Combine(Environment.ExpandEnvironmentVariables("%windir%"), "sysnative");

}

关于c++ - 从 32 位应用程序打开 64 位注册表编辑器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12233396/

相关文章:

winapi - 适用于VISTA,7及更高版本的Windows API

c++ - 子类型和子类之间有什么区别?

c++ - 如何让 clang 3.4 编译通用 lambdas?

linux - 有没有一种方法可以每天自动备份文件并每天突出显示差异

python - 在 python 中精确 sleep

c++ - 将数据从缓冲区写入磁盘上的波形文件

c++ - 如何使用 typename 而不是 typedef?

c++ - 如何为 native C++ 创建 nuget 包

java - Windows - 在哪里找到 .bashrc 文件以增加堆大小

winapi - 将 wstringstream 转换为 LPCWSTR