如何允许64位窗口上的32位应用程序执行Windows \ System32中提供的64位应用程序

时间:2009-02-04 03:48:42

标签: c++ windows-vista 64-bit 32-bit vista64

假设您有一个应用程序,您希望为用户提供浏览system32目录和执行程序的能力(如telnet)。

当您需要支持XP作为客户端以及2k以上的服务器时,支持此功能的最佳方法是什么?

写完所有这些后,我想知道提供浏览是否需要太多时间/精力,他们可以从资源管理器中复制它。仍然需要启动的能力。

我在Nynaeve找到了一些讨论。

到目前为止,似乎有以下选项

  1. 在Windows中创建一个sysnative文件夹,允许您浏览/执行64位。问题是:
    • 仅适用于Vista / Longhorn,因此不支持XP 64
    • 导致不同的路径命名,不能在多个版本上使用相同的路径。
    • 将对整个窗口有效,而不仅仅是我们的应用程序
    • 在安装应用程序时可能不适合(可能不适合)
    • 允许仅通过路径明确指定在有32位和64位版本的情况下要启动的应用程序版本
  2. 使用Windows API在显示文件列表或执行用户运行命令时临时禁用重定向。问题是:
    • 仅适用于64位 - 必须弄乱GetProcAddress
    • 仅在某些服务包下可用
    • 必须单独识别应实施的所有位置
    • 用户需要提供有关这是64位app还是32位的单独信息。
  3. 如果有人有一些示例代码显示Windows OpenFile对话框(比如说使用MFC CFileDialog),它显示了XP / Vista,并允许查看64位system32目录,那就太棒了。

    如果有人有一个启动命名应用程序的例子,那也很棒!

    编辑:
    目前我们使用CreateProcess启动应用程序(失败)。

    err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);
    

2 个答案:

答案 0 :(得分:4)

我选择了2, 对于那些可能感兴趣的人;这是我对基于MS的笔记管理Wow64重定向禁用的范围版本的快速破解。如果API可用,将重定向,期望kernel32.dll已经可用。

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

因此用法将是

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess

答案 1 :(得分:0)

您是否被重定向到Windows / SysWoW64?我可以从32位托管可执行文件中的OpenFile启动Windows / System32中的64位应用程序。