Перевод 32-битных путей в их WOW64-эквиваленты - PullRequest
4 голосов
/ 03 июня 2009

Есть ли какая-нибудь функция, которую я могу вызвать в 32-битном приложении, которая бы преобразовывала пути, которые, по ее мнению, она использует, в пути из тех, которые она использует? (Например, вызовите его, чтобы преобразовать путь к папке в Program Files в путь в Program Files (x86) или наоборот при работе в 64-разрядной системе.) Мне нужно сделать это так, чтобы, когда пользователь представленный с каталогом в графическом интерфейсе (как при просмотре файлов или каталогов), он видит реальный каталог, а не то, что само приложение думает, что видит.

Нам необходимо поддерживать как 32-, так и 64-разрядную версию Windows, поэтому это должно работать в обеих средах.

Редактировать Необходимость работы с WOW64 заключается в том, что мое приложение является загрузочным приложением установщика. По умолчанию продукт устанавливается в Program Files в 32-разрядной системе, а в 64-разрядной системе - в Program Files (x86). Диалог, позволяющий пользователю выбрать, куда установить продукт (в том числе на другой жесткий диск, если он этого хочет или нуждается); и он должен работать правильно в обеих средах. В настоящее время он всегда отображает (и просматривает) файлы программ, даже в 64-битных системах.

Ответы [ 2 ]

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

Является ли просмотр файлов программы и Windows \ System32 сценарием использования для вашего приложения? Я призываю вас отказаться от решения этой проблемы, потому что она выглядит ужасно. Либо оставайтесь все в 32-битном мире, либо перекомпилируйте для x64. Жизнь в промежуточном мире WOW64 сделает ваш код намного более сложным.

Если вы действительно хотите это сделать, http://msdn.microsoft.com/en-us/library/aa365743(VS.85).aspx справится с задачей.

0 голосов
/ 03 июня 2009

Здесь у меня есть рабочий образец отключения перенаправления wow64:

BOOL CCopyUtils::CopyServiceFiles(CAtlString szSourceDir, CAtlString szTargetDir)
{
    BOOL bResult = TRUE;
    TCHAR szSource[MAX_PATH];
    TCHAR szDest[MAX_PATH];
    TCHAR szSourceFile[MAX_PATH];
    TCHAR szDestFile[MAX_PATH];

    HINSTANCE hDll;
    PVOID OldValue;
    Wow64DisableWow64FsRedirection pfWow64DisableWow64FsRedirection=NULL;
    Wow64RevertWow64FsRedirection pfWow64RevertWow64FsRedirection=NULL;

    hDll=LoadLibrary("Kernel32.dll");
    ATLASSERT(hDll!=NULL);

    pfWow64DisableWow64FsRedirection=(Wow64DisableWow64FsRedirection)GetProcAddress(
        hDll, "Wow64DisableWow64FsRedirection");
    // http://msdn.microsoft.com/en-us/library/aa365745(VS.85).aspx
    pfWow64RevertWow64FsRedirection=(Wow64RevertWow64FsRedirection)GetProcAddress(
        hDll, "Wow64RevertWow64FsRedirection");

    if(pfWow64DisableWow64FsRedirection==NULL)
        ATLTRACE(_T("Function 'Wow64DisableWow64FsRedirection' not loaded."));
    else if((pfWow64DisableWow64FsRedirection)(&OldValue)==TRUE)
        ATLTRACE(_T("Wow64 filesystem redirecton disabled."));
    else 
        ATLTRACE(_T("Wow64 filesystem redirecton not disabled."));

    if (_taccess(szTargetDir, 0) != 0)
        _tmkdir(szTargetDir);

    DeleteOldFiles(szTargetDir);

    int  i = 0;
    _tcscpy(szSource, szSourceDir);
    if (szSource[_tcslen (szSource) -1] != '\\')
        _tcscat (szSource,"\\");    

    _tcscpy(szDest, szTargetDir);
    if (szDest[_tcslen (szDest) -1] != '\\')
        _tcscat (szDest,"\\");    

    while (m_ServiceFiles[i] != NULL)
    {
        _tcscpy(szSourceFile, szSource);
        _tcscat(szSourceFile, m_ServiceFiles[i]);

        _tcscpy(szDestFile, szDest);
        _tcscat(szDestFile, m_ServiceFiles[i]);

        if (!CopyFile(szSourceFile, szDestFile, FALSE))     
        {
            bResult = FALSE;
            ATLTRACE(_T("Error coping %s to %s\n"), szSourceFile, szDestFile);
            ATLASSERT(FALSE);                   
            break;
        }
        i++;
    }

    if(pfWow64RevertWow64FsRedirection==NULL)
        ATLTRACE(_T("Function 'pfWow64RevertWow64FsRedirection' not loaded."));
    else if((pfWow64RevertWow64FsRedirection)(OldValue)==TRUE)
        ATLTRACE(_T("Wow64 filesystem redirecton restored."));
    else 
        ATLTRACE(_T("Wow64 filesystem redirecton not restored."));
    FreeLibrary(hDll);

    return bResult;
}

С наилучшими пожеланиями

...