2009-06-02 3 views
4

Есть ли какая-либо функция, которую я могу вызвать в 32-битном приложении, которое преобразует пути, которые, по его мнению, используются на и с тех путей, которые он фактически использует? (Например, вызовите его, чтобы преобразовать путь для папки в Program Files к пути в Program Files (x86) или наоборот при работе в 64-разрядной системе.) Мне нужно сделать это, чтобы, когда пользователь представленный в графическом интерфейсе (как при просмотре файлов или каталогов), он видит реальный каталог, а не то, что, по мнению самого приложения, видит.Перевод 32-битных путей на их эквиваленты WOW64

Нам необходимо поддерживать 32- и 64-разрядную Windows, поэтому это должно работать в обеих средах.

Редактировать Необходимость иметь дело с WOW64 заключается в том, что мое приложение является загрузочным приложением установщика. По умолчанию продукт устанавливается в Program Files в 32-разрядной системе, а в 64-разрядной системе - в Program Files (x86). Диалог, который позволяет пользователю выбирать, где устанавливать продукт (в том числе на другом жестком диске, если это то, что он хочет или нуждается); и он должен работать должным образом в обеих средах. В настоящее время он всегда отображает (и просматривает) программные файлы даже в 64-битных системах.

+0

вы когда-нибудь найти хорошее решение для этого? Я столкнулся с той же дилеммой; Я хотел бы преобразовать, например, путь system32 к его эквиваленту WOW64. –

+0

@Joe: Пока. – RobH

+0

Я знаю, что это старо, но функция, которую вы вызываете, чтобы получить путь к файлам программ, должна возвращать «реальный» путь (т. Е. C: \ program files (x86) \ whatever). Предполагая, что вы используете SHGetFolderPath или большинство других функций Win32 API. – eselk

ответ

1

Просматривает файлы программ и Windows \ System32 для вашего приложения? Я призываю вас отказаться от решения этой проблемы, так как она получает действительно уродливый. Оставайтесь в 32-битном мире или перекомпилируйте для x64. Жизнь в «промежуточном» мире WOW64 сделает ваш код намного более сложным.

Если вы действительно хотите это сделать, http://msdn.microsoft.com/en-us/library/aa365743(VS.85).aspx сделает трюк.

+0

Я знаю об этой функции. Это не дает мне средство преобразования пути, которое мне нужно. – RobH

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; 
} 

наилучшие пожелания

+1

Вопрос не в том, «как отключить перенаправление WOW64?» Я уже знаю, как это сделать. То, что мне нужно, - это способ определить по пути путь к перенаправленному пути, чтобы я мог отображать этот путь в графическом интерфейсе. И наоборот, с учетом перенаправленного пути мне нужно обратное преобразование. (Только в том случае, если приложение работает в 64-разрядной системе. Если приложение работает в 32-разрядной системе, преобразования не должны ничего делать с этим путем.) – RobH