1

ShellExecuteを使用して、32ビットアプリケーションから64ビットのRegeditを開こうとしています。

Process Explorerで、Regeditを通常どおり開くと、イメージが64ビットであると表示さC:\Windows\Regedit.exeれますが、ShellExecuteを使用して32ビットアプリケーションから開くと、ProcessExplorerはイメージが32ビットであると表示します。

(そして、SysWOW64ではなくWindowsディレクトリでregeditを開きます)

ShellExecuteを呼び出す前にこの関数を使用するとWow64DisableWow64FsRedirection、その64ビットイメージが開くことがわかりました。しかし、私のアプリケーションは32ビットXPでは動作しません。

私が困惑しているのは、regeditを開く方法に関係なく、どちらもに存在しC:\Windows、どちらも同じ実行可能ファイルです。同じ実行可能ファイルに2つの異なるイメージタイプを設定するにはどうすればよいですか?そして、どうすれば64ビットを開かずに開くことができWow64DisableWow64FsRedirectionますか?

4

2 に答える 2

3

Is64BitProcessを使用して64ビットプロセスを使用しているかどうかを検出する必要があります。その場合は%windir%\Sysnative、32ビットアプリケーションが64ビットSystem32フォルダーにアクセスする必要がある場合に、「実際の」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");

}
于 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 に答える