【问题标题】:Loading a 32-bit process in a 64-bit environment在 64 位环境中加载 32 位进程
【发布时间】:2009-05-27 12:17:34
【问题描述】:

我有几个问题如下。 CHM 是(已编译的 HTML 文件)

我的 CHM 文件有一个用于启动 32 位应用程序的链接。 CHM 文件是用 Javascript 编码的。这在 32 位操作系统环境中运行良好。

但这在 64 位操作系统环境中不起作用。原因是:当我打开 chm 文件时,64 位版本的 hh.exe(操作系统可执行文件)执行并启动 chm。 并且 chm 在 64 位环境中加载。
现在我无法从 CHM 文件启动 32 位应用程序,因为 64 位进程无法加载 32 位进程。

有什么方法可以让它也适用于 64 位操作系统吗?

我想到了以下几个解决方案,但我不知道如何实现它们。

1)在 Javascript 代码中,如果我可以检查操作系统是 32 位还是 64 位。然后我可以向用户弹出一个明确定义的错误,如果它是 64 位操作系统。

2)或者如果我可以强制操作系统运行 32 位版本的 hh.exe,以便 chm 在 32 位环境中加载,因此不会造成问题。

【问题讨论】:

  • 建议添加“chm”和某种 Windows (win32?win64?) 标签。 Javascript 的通常假设是它是抽象的 Javascript 或者是指 Web 浏览器中的 Javascript,这两者都不是。

标签: javascript winapi chm win64


【解决方案1】:

现在我无法从 CHM 文件启动 32 位应用程序,因为 64 位进程无法加载 32 位进程

不确定“加载 32 位进程”是什么意思,但 32 位进程肯定可以创建 64 位进程。比如我有MyApp32.exe这个32位应用程序,它绝对可以启动MyApp64.exe这个64位应用程序。

当您了解 32 位和 64 位代码之间的不兼容性时,它指的是 32 位应用程序加载 64 位 DLL,反之亦然。

我怀疑您的问题实际上是您用于启动应用程序的路径与 WOW64 文件系统重定向相冲突。在此方案中,访问 C:\Windows\System32 的 32 位应用程序实际上被重定向到 C:\Windows\SysWow64\System32。你可以阅读更多here

如果这不起作用,有关如何启动此 32 位进程以及它在文件系统上的位置的更多信息可能会增加一些清晰度。

【讨论】:

    【解决方案2】:

    或者 3) 分发由 CHM 启动的 64 位版本的应用程序?

    【讨论】:

    • 这个问题是它不能在 32 位环境中工作。而且我们不能有多个版本的应用程序。即使我们有两个版本都可用于应用程序,Java Script 怎么知道要启动哪个版本。
    • 假设您有 32 位和 64 位版本,我建议您将正确的版本分发到正确的平台。鉴于您无法启动 32 位版本,hh.exe 可能是您唯一的选择。
    【解决方案3】:

    您需要执行 hh.exe 的 32 位版本。为此,请使用此路径 %WINDIR%\System32\hh.exe 启动 hh.exe,但在启动应用程序之前,您必须 disable the Wow64 file system redirection

    这里有一个例子:

    #define _WIN32_WINNT 0x0501
    #include <Windows.h>
    
    void main()
    {
        PVOID OldValue;
        HANDLE hFile = INVALID_HANDLE_VALUE;
    
        BOOL bRet = Wow64DisableWow64FsRedirection (&OldValue);
    
        if (bRet == TRUE) 
        {
            // Open a file
    
            hFile = CreateFile(TEXT("C:\\Windows\\System32\\Notepad.exe"),
                GENERIC_READ,
                FILE_SHARE_READ,
                NULL,
                OPEN_EXISTING,
                FILE_ATTRIBUTE_NORMAL,
                NULL);
    
            // Restore the previous WOW64 file system redirection value.
    
            Wow64RevertWow64FsRedirection (OldValue);
        }
    
        if( INVALID_HANDLE_VALUE != hFile )  
        {
            // Use the file handle
        }
    }
    

    注意:调用应用程序后记得revert the redirection

    【讨论】:

      猜你喜欢
      • 2014-08-10
      • 2018-05-29
      • 2011-10-08
      • 1970-01-01
      • 2018-08-05
      • 1970-01-01
      • 2011-08-12
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多