1

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

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

(它确实在 Windows 目录中打开了 regedit,而不是在 SysWOW64 中)

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

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

4

2 回答 2

3

You need to detect if you are in a 64 bit process with Is64BitProcess, if so, access %windir%\Sysnative as that points to the "Real" System32 folder for when 32 bit applications need to access the 64 bit System32 folder.

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");

}
于 2012-09-02T04:36:08.613 回答
0

这是我用来从 32 位应用程序以 64 位启动 regedit 的代码:

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);

    [DllImport("kernel32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);

    internal int ExecuteCommand64(string Command, string Parameters)
    {

        IntPtr ptr = new IntPtr();
        bool isWow64FsRedirectionDisabled = Wow64DisableWow64FsRedirection(ref ptr);
        if (isWow64FsRedirectionDisabled)
        {

            //Set up a ProcessStartInfo using your path to the executable (Command) and the command line arguments (Parameters).
            ProcessStartInfo ProcessInfo = new ProcessStartInfo(Command, Parameters);
            ProcessInfo.CreateNoWindow = true;
            ProcessInfo.UseShellExecute = false;
            ProcessInfo.RedirectStandardOutput = true;

            //Invoke the process.
            Process Process = Process.Start(ProcessInfo);
            Process.WaitForExit();

            //Finish.
            // this.Context.LogMessage(Process.StandardOutput.ReadToEnd());
            int ExitCode = Process.ExitCode;
            Process.Close();
            bool isWow64FsRedirectionOK = Wow64RevertWow64FsRedirection(ptr);
            if (!isWow64FsRedirectionOK)
            {
                throw new Exception("Le retour en 32 bits a échoué.");
            }
            return ExitCode;
        }

        else
        {
            throw new Exception("Impossible de passer en 64 bits");
        }

    }

我用以下行调用它:

ExecuteCommand64(@"c:\windows\regedit", string.Format("\"{0}\"", regFileName));

其中 regFilename 是我要添加到注册表的注册表文件。

于 2016-10-13T07:32:17.960 回答