Как разрешить 32-разрядным приложениям в 64-разрядных окнах выполнять 64-разрядные приложения, предоставляемые в Windows \ System32 - PullRequest
4 голосов
/ 04 февраля 2009

Скажем, у вас есть приложение, которое вы хотите предоставить пользователям возможность просматривать каталог system32 и запускать программы (например, telnet).

Каков наилучший метод для поддержки этого, когда вам нужно поддерживать XP в качестве клиента и 2k в качестве сервера?

Написав все это, я задаюсь вопросом, не слишком ли много времени / усилий для обеспечения просмотра, чтобы сделать это, где они могли бы просто скопировать его из проводника. Требуется возможность запуска.

Я нашел обсуждение на Найнив .

Пока, похоже, есть следующие опции

  1. Создайте папку sysnative в Windows, которая позволит вам просматривать / выполнять 64-битные. Проблемы:
    • доступно только в Vista / Longhorn, поэтому нет поддержки XP 64
    • приводит к разным именам путей, не может использовать один и тот же путь в нескольких версиях.
    • будет активен для всех окон, а не только для нашего приложения
    • может не (вероятно, не) делать при установке приложения
    • позволяет явно указать через путь только, какую версию приложения запускать, если есть 32-битная и 64-битная версия
  2. Используйте Windows API для временного отключения перенаправления при отображении списков файлов или выполнении пользователем команд запуска. Проблемы:
    • Доступно только в 64-битной версии - придется связываться с GetProcAddress
    • доступно только для определенных пакетов обновлений
    • должен индивидуально идентифицировать все места, которые должны быть реализованы
    • пользователь должен будет предоставить отдельную информацию о том, является ли это 64-битным приложением или 32-битным.

Если бы у кого-нибудь был пример кода, который отображал диалоговое окно Windows OpenFile (скажем, с использованием MFC CFileDialog), показывающее нативно для XP / Vista и позволяющее просматривать 64-битный каталог system32, это было бы здорово.

Если бы у кого-нибудь был пример запуска названного приложения, это тоже было бы здорово!

Edit:
В настоящее время мы используем CreateProcess для запуска приложения (которое не работает).

err = CreateProcess((wchar_t*)exeName.c_str(), (wchar_t*)cmdLine.c_str(), NULL, NULL, FALSE, CREATE_SEPARATE_WOW_VDM, NULL, workingDir.c_str(), &startupInfo, &processInfo);

Ответы [ 2 ]

4 голосов
/ 05 февраля 2009

Я пошел с вариантом 2, Для тех, кому это может быть интересно; Вот мой быстрый взлом на ограниченную версию управления отключением перенаправления Wow64 на основе заметок MS. Перенаправит, если API доступен, ожидает, что kernel32.dll уже доступна.

class Wow64RedirectOff {
    typedef BOOL (WINAPI *FN_Wow64DisableWow64FsRedirection) ( __out PVOID *OldValue );
    typedef BOOL (WINAPI *FN_Wow64RevertWow64FsRedirection) ( __in  PVOID OldValue );

public:
    Wow64RedirectOff() {
        LPFN_Disable = (FN_Wow64DisableWow64FsRedirection)GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"Wow64DisableWow64FsRedirection");
        if( LPFN_Disable ) {
            LPFN_Disable(&OldValue);
        }
    }

    ~Wow64RedirectOff() {
        if( LPFN_Disable ) {
            FN_Wow64RevertWow64FsRedirection LPFN_Revert = (FN_Wow64RevertWow64FsRedirection)GetProcAddress(
                GetModuleHandle(TEXT("kernel32")),"Wow64RevertWow64FsRedirection");
            if( LPFN_Revert ) {
                LPFN_Revert(OldValue);
            }
        }
    }

private:
    FN_Wow64DisableWow64FsRedirection LPFN_Disable;
    PVOID OldValue; 
};

И, таким образом, использование будет

Wow64RedirectOff scopedRedirect;
//CFileOpen
//CreateProcess
0 голосов
/ 05 февраля 2009

Вы перенаправлены на Windows / SysWoW64? Я могу запускать 64-разрядные приложения из Windows / System32 из OpenFile в 32-разрядном управляемом исполняемом файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...