4

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

我们需要同时支持 32 位和 64 位 Windows,因此这应该在两种环境中都可以工作。

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

4

2 回答 2

1

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

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

于 2009-06-02T23:13:36.853 回答
0

在这里,我有一个禁用 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;
}

此致

于 2009-06-03T08:32:01.967 回答