Загрузка 32-битного процесса в 64-битной среде - PullRequest
3 голосов
/ 27 мая 2009

У меня есть пара вопросов, как показано ниже. CHM is (скомпилированный файл HTML)

Мой файл CHM содержит ссылку для запуска 32-разрядного приложения. Файл CHM закодирован в Javascript. Это прекрасно работает в среде 32-битной ОС.

Но это не работает в среде 64-битной ОС. Причина в том, что: Когда я открываю файл chm, запускается и запускается chm 64-битная версия hh.exe (исполняемый файл операционной системы). И chm загружается в 64-битной среде.
И теперь я не могу запустить 32-битное приложение из файла CHM, потому что 64-битный процесс не может загрузить 32-битный процесс.

Есть ли способ заставить его работать и на 64-битных ОС?

Я думал о нескольких решениях, как показано ниже, но я не знаю, как их реализовать.

1) В коде Javascript, если бы я мог проверить, является ли ОС 32-битной или 64-битной. Затем я мог бы выдать пользователю четко определенную ошибку, если это 64-битная ОС.

2) Или, если бы я мог заставить ОС запустить 32-разрядную версию hh.exe, чтобы chm загружался в 32-разрядной среде и, следовательно, не вызывал проблем.

Ответы [ 3 ]

1 голос
/ 05 июня 2009

И теперь я не могу запустить 32-битное приложение из файла CHM, потому что 64-битный процесс не может загрузить 32-битный процесс

Не уверен, что вы подразумеваете под «загрузить 32-битный процесс», но 32-битный процесс наверняка может создать 64-битный процесс. Например, если у меня есть 32-разрядное приложение MyApp32.exe, оно может полностью запустить 64-разрядное приложение MyApp64.exe.

Когда вы читаете о несовместимости между 32- и 64-битным кодом, это относится к 32-битному приложению, загружающему 64-битную DLL, или наоборот.

Я подозреваю, что ваша проблема на самом деле - путь, который вы используете для запуска приложения, который находится вне перенаправления файловой системы WOW64. В этой схеме 32-разрядные приложения, которые обращаются к C: \ Windows \ System32, фактически перенаправляются в C: \ Windows \ SysWow64 \ System32. Вы можете прочитать об этом подробнее здесь

Если это не сработает, дополнительная информация о том, как вы запускаете этот 32-разрядный процесс и где он расположен в файловой системе, может внести некоторую ясность.

0 голосов
/ 27 мая 2009

Вам необходимо выполнить 32-битную версию hh.exe . Для этого запустите hh.exe с этим путем % WINDIR% \ System32 \ 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
    }
}

ПРИМЕЧАНИЕ: не забудьте отменить перенаправление после вызова приложения

0 голосов
/ 27 мая 2009

Или 3) распространить 64-битную версию приложения, запущенного CHM?

...