代码之家  ›  专栏  ›  技术社区  ›  Greg Domjan

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

  •  4
  • Greg Domjan  · 技术社区  · 16 年前

    假设您有一个应用程序,您想让用户能够浏览system32目录并在其中执行程序(如telnet)。

    当您需要将XP作为客户端支持,而将2K作为服务器支持时,支持这一点的最佳方法是什么?

    写了所有这些之后,我想知道提供一个浏览来完成这项工作是否花费了太多的时间/精力,在那里他们可以从资源管理器复制它。仍然需要发射能力。

    我找到一些关于 Nynaeve .

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

    1. 在Windows中创建一个sysnative文件夹,允许您浏览/执行64位。问题是:
      • 仅在Vista/Longhorn中可用,因此不支持XP 64
      • 导致不同的路径命名,不能在多个版本上使用相同的路径。
      • 将在整个窗口中激活,而不仅仅是我们的应用程序
      • 安装应用程序时可能不适合(可能不适合)
      • 如果存在32位和64位版本,则仅允许通过路径显式指定要启动的应用程序版本
    2. 在显示文件列表或执行用户运行命令时,使用Windows API临时禁用重定向。问题是:
      • 仅在64位上可用-必须与GetProcAddress混淆
      • 仅在某些服务包下可用
      • 必须单独确定所有应实施的地点。
      • 用户需要提供关于这是64位应用程序还是32位应用程序的单独信息。

    如果有人有一些显示Windows OpenFile对话框(比如使用MFC cfileDialog)的示例代码,显示了针对xp/vista的Nativly,并允许查看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 回复  |  直到 14 年前
        1
  •  4
  •   Greg Domjan    16 年前

    我选择了选项2, 对于那些可能感兴趣的人,这里是我的快速黑客在一个范围内的版本管理禁用wow64重定向基于MS的说明。将重定向如果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
    
        2
  •  0
  •   Cat Zimmermann    16 年前

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