将32位路径转换为其WOW64等效路径

时间:2009-06-02 21:58:49

标签: c++ windows mfc wow64

我是否可以在32位应用程序中调用任何可以将其认为正在使用的路径转换为实际使用的路径的函数? (例如,当在64位系统上运行时,调用它将Program Files中文件夹的路径转换为Program Files(x86)中的路径,反之亦然。)我需要这样做,以便当用户使用时在GUI中显示目录(当浏览文件或目录时),他看到了真实的目录,而不是应用程序本身认为它看到的目录。

我们需要支持32位和64位Windows,因此这应该适用于两种环境。

编辑处理WOW64的需要在于我的应用程序是安装程序的引导程序。默认情况下,产品安装在32位系统上的Program Files下,而在64位系统上,它安装在Program Files(x86)下。允许用户选择安装产品的位置的对话(如果这是他想要或需要的话,包括在不同的硬盘上);它必须在两种环境中都能正常工作。目前,它始终显示(和浏览)程序文件,即使在64位系统上也是如此。

2 个答案:

答案 0 :(得分:1)

浏览Program Files和Windows \ System32是否适用于您的应用?我鼓励你放弃解决这个问题,因为它真的丑陋。要么全部保留在32位世界中,要么重新编译为x64。生活在WOW64的“中间”世界将使您的代码更加复杂。

如果你真的想这样做,http://msdn.microsoft.com/en-us/library/aa365743(VS.85).aspx就可以了。

答案 1 :(得分:0)

这里有一个disablig 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;
}

祝你好运