2009-05-27 71 views
3

我有几个问题如下。 CHM是(编译的HTML文件)在64位环境中加载32位进程

我的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

建议添加“chm”和某种Windows(win32?win64?)标记。通常使用Javascript的推定是它是抽象的Javascript或在Web浏览器中引用Javascript,这两种情况都不是这种情况。 – 2009-05-27 12:42:55

回答

0

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

+0

问题在于它不能在32位环境中工作。 我们不能拥有多个版本的应用程序。即使我们有两个版本的应用程序可用,Java Script如何知道启动哪个版本。 – 2009-05-27 12:40:25

0

您需要执行32位版本的hh.exe。要这样做启动hh.exe与此路径%WINDIR%\ System32 \ 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之后您调用应用

1

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

不确定“加载32位进程”是什么意思,但32位进程可以最当然会创建一个64位的进程。例如,如果我有MyApp32.exe,一个32位应用程序,它可以绝对启动64位应用程序MyApp64.exe。

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

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

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

相关问题