在64位操作系统上使用32位任务从跳转任务打开explorer.exe

时间:2013-04-03 13:40:49

标签: .net windows-7 32bit-64bit jump-list

我有一个32位应用程序,我想注册打开" explorer.exe"作为一项跳跃任务。它在32位Windows 7上工作正常,但在64位Windows中,它会出现错误" C:\ Windows \ system32 \ explorer.exe未指定错误"。

由于Explorer的完整路径是" 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();

1 个答案:

答案 0 :(得分: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);
    }