0

我有一个 32 位应用程序,我想注册打开“explorer.exe”作为跳转任务。它在 32 位 Windows 7 上运行良好,但在 64 位 Windows 中,它会给出错误“C:\Windows\system32\explorer.exe 未指定错误”。

由于资源管理器的完整路径是“C:\Windows\SysWOW64\explorer.exe”,我认为这是 Windows 在运行时看到 32 位模拟路径的结果,但跳转列表需要完整的 64 位路径。有没有一种简单的方法来构建这个可以在 64 位操作系统上运行的跳转列表?

我想我可以检查 Environment.Is64BitOperatingSystem 并将位置硬编码为“C:\Windows\SysWow64”(如果已设置),但使用硬编码路径很糟糕。

string exe = System.Reflection.Assembly.GetExecutingAssembly().Location;
string current = System.IO.Path.GetDirectoryName(exe);
var jl = new System.Windows.Shell.JumpList();
jl.ShowFrequentCategory = false;
jl.ShowRecentCategory = false;
jl.BeginInit();
jl.JumpItems.AddRange(new[]
    {
        new System.Windows.Shell.JumpTask
        {
            Title = "Explore",
            ApplicationPath = "explorer.exe",
            IconResourcePath = "explorer.exe",
            Arguments = "/select,\"" + exe,
            WorkingDirectory = current,
        },
        // other jump tasks here
    });
jl.EndInit();
jl.Apply();
4

1 回答 1

0

我在这里找到了答案How to start a 64-bit process from a 32-bit process

“sysnative”的东西在这种情况下不起作用,但暂时禁用文件系统重定向有效:

[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr);
[DllImport("kernel32.dll", SetLastError = true)]
private static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr);

    if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
        Wow64DisableWow64FsRedirection(ref ptr);
    try
    {
        // Add jump list code
    }
    finally
    {
        if (Environment.Is64BitOperatingSystem && !Environment.Is64BitProcess)
            Wow64RevertWow64FsRedirection(ptr);
    }
于 2013-04-03T14:54:57.493 回答