我有几个问题如下。 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位环境中加载,因此没有问题。
答案 0 :(得分:1)
现在我无法从CHM文件启动32位应用程序,因为64位进程无法加载32位进程
不确定'加载32位进程'是什么意思,但32位进程肯定会创建一个64位进程。例如,如果我有一个32位应用程序MyApp32.exe,它绝对可以启动64位应用程序MyApp64.exe。
当您阅读32位和64位代码之间的不兼容性时,它指的是加载64位DLL的32位应用程序,反之亦然。
我怀疑您的问题实际上是用于启动应用程序的路径与WOW64文件系统重定向相冲突。在此方案中,访问C:\ Windows \ System32的32位应用程序实际上被重定向到C:\ Windows \ SysWow64 \ System32。您可以阅读更多here
如果这不起作用,有关如何启动此32位进程以及它在文件系统中的位置的更多信息可能会增加一些清晰度。
答案 1 :(得分:0)
或者3)分发由CHM发起的64位版本的应用程序?
答案 2 :(得分:0)
您需要执行32位版本的 hh.exe 。为此,请使用此路径%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