4

使用していると思われるパスを実際に使用しているパスとの間で変換する32ビットアプリで呼び出すことができる関数はありますか?(たとえば、64ビットシステムで実行している場合は、プログラムファイル内のフォルダーのパスをプログラムファイル(x86)内のパスに、またはその逆に変換するために呼び出します。)これを行う必要があります。 GUIでディレクトリが表示されると(ファイルやディレクトリを参照するときのように)、アプリ自体が認識していると見なすのではなく、実際のディレクトリが表示されます。

32ビットと64ビットの両方のWindowsをサポートする必要があるため、これは両方の環境で機能するはずです。

編集WOW64に対処する必要があるのは、私のアプリがインストーラーのブートストラップアプリケーションであるという事実にあります。デフォルトでは、製品は32ビットシステムのプログラムファイルの下にインストールされますが、64ビットシステムの場合、製品はプログラムファイル(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 に答える