c ++ - Oversættelse 32-bit stier til deres WOW64-ækvivalenter

Indlæg af Hanne Mølgaard Plasc

Problem



Er der nogen funktion, som jeg kan ringe til i en 32-bit app, der ville konvertere stier, som den mener, at den bruger til og fra de stier, som den faktisk bruger? (For eksempel kalder det om at konvertere stien til en mappe i programfiler til en sti i programfiler (x86) eller omvendt, når du kører på et 64-bit system.) Jeg skal gøre dette, så når brugeren er præsenteret med en mappe i GUI'en (som når du kigger efter filer eller mapper), ser han den rigtige mappe i stedet for hvad selve appen synes at se.


Vi skal understøtte både 32- og 64-bit Windows, så dette skal fungere i begge miljøer.


Rediger Behovet for at håndtere WOW64 ligger i, at min app er bootstrap-applikationen af ​​et installationsprogram. Som standard er produktet installeret under Programfiler på et 32-bit system, mens det er installeret under Programfiler (x86), mens det er på et 64-bit system. Dialogen, der giver brugeren mulighed for at vælge, hvor produktet skal installeres (inklusive på en anden harddisk helt og holdent, hvis det er hvad han ønsker eller har brug for); og det skal fungere ordentligt i begge miljøer. I øjeblikket viser den altid (og browsing) Programmer, selv på 64-bit systemer.

Bedste reference


Bliver du gennem programfiler og Windows \ System32 et brugs-tilfælde til din app? Jeg opfordrer dig til at opgive at løse dette problem, da det bliver virkelig grimt. Du kan enten forblive i 32-bit verden eller genkompilere til x64. At bo i WOW64's 'mellemliggende' verden vil gøre din kode meget mere kompleks.


Hvis du virkelig vil gøre dette, vil http://msdn.microsoft.com/en-us/library/aa365743(VS.85).aspx gøre tricket. [2]

Andre referencer 1


Her har jeg en arbejdsprøve af uheldig wow64 omdirigering:


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
"), 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;
}


Med venlig hilsen