3

我有几个问题如下。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 位环境中加载,因此不会出现问题。

4

3 回答 3

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。你可以在这里阅读更多

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

于 2009-06-04T23:54:59.340 回答
0

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

于 2009-05-27T12:23:04.780 回答
0

您需要执行 32 位版本的hh.exe。为此,使用此路径%WINDIR%\System32\hh.exe启动hh.exe,但在启动应用程序之前,您必须 禁用 Wow64 文件系统重定向

这里有一个例子:

#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
    }
}

注意:请记住在调用应用程序后恢复重定向

于 2009-05-27T15:41:05.270 回答