2009-06-02 6 views
4

Existe-t-il une fonction que je puisse appeler dans une application 32 bits qui convertit les chemins qu'elle pense utiliser vers et à partir des chemins qu'elle utilise réellement? (Par exemple, appelez-le pour convertir le chemin d'un dossier dans Program Files en un chemin dans Program Files (x86) ou vice versa lors de l'exécution sur un système 64 bits.) Je dois le faire de sorte que, lorsque l'utilisateur est présenté avec un répertoire dans l'interface graphique (comme lors de la recherche de fichiers ou de répertoires), il voit le vrai répertoire, plutôt que ce que l'application elle-même pense voir.Traduction de chemins 32 bits vers leurs équivalents WOW64

Nous devons prendre en charge Windows 32 bits et 64 bits, donc cela devrait fonctionner dans les deux environnements.

Modifier La nécessité de faire face à WOW64 réside dans le fait que mon application est l'application bootstrap d'un installateur. Par défaut, le produit est installé sous Program Files sur un système 32 bits, tandis que sur un système 64 bits, il est installé sous Program Files (x86). Le dialogue qui permet à l'utilisateur de choisir où installer le produit (y compris sur un disque dur différent si c'est ce qu'il veut ou a besoin); et il doit fonctionner correctement dans les deux environnements. Actuellement, il affiche toujours (et passe en revue) les Program Files, même sur les systèmes 64 bits.

+0

Avez-vous déjà trouvé une bonne solution à cela? Je suis confronté au même dilemme; Je voudrais convertir par exemple un chemin system32 à son équivalent WOW64. –

+0

@Joe: Pas si loin. – RobH

+0

Je sais que c'est vieux, mais la fonction que vous appelez pour obtenir le chemin des fichiers du programme devrait renvoyer le chemin "réel", (c.-à-d. Les fichiers c: \ program (x86) \ whatever). En supposant que vous utilisez SHGetFolderPath, ou la plupart des autres fonctions de l'API Win32. – eselk

Répondre

1

Est-ce que naviguer dans Program Files et Windows \ System32 est un cas d'utilisation pour votre application? Je vous encourage à abandonner résoudre ce problème, car il obtient vraiment moche. Restez tous dans le monde 32 bits, ou recompilez pour x64. Vivre dans le monde «entre-deux» de WOW64 rendra votre code beaucoup plus complexe. Si vous voulez vraiment faire cela, http://msdn.microsoft.com/en-us/library/aa365743(VS.85).aspx fera l'affaire.

+0

Je connais cette fonction. Cela ne me donne pas la facilité de conversion de chemin dont j'ai besoin. – RobH

0

Ici, j'ai un échantillon de travail de redirection 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; 
} 

Meilleures salutations

+1

La question n'était pas «comment désactiver la redirection WOW64? Je sais déjà comment faire ça. Ce dont j'ai besoin, c'est d'un moyen de déterminer, en fonction d'un chemin, quel est le chemin redirigé afin que je puisse afficher ce chemin dans l'interface graphique. Inversement, compte tenu d'un chemin redirigé, j'ai besoin de la conversion inverse. (Uniquement si l'application est exécutée sur un système 64 bits.) Si l'application est exécutée sur un système 32 bits, les conversions ne doivent rien faire pour le chemin. – RobH

Questions connexes