У меня есть рабочее решение для этого.Это что-то вроде хака, но это работает.
Краткий отказ от ответственности, прежде чем я покажу решение.Я в основном согласен с Хефферманом.Не судьба.Я на самом деле не рекомендую делать это для доставки кода.Это то, что не поддерживает ни 32-битный текстовый редактор, ни текстовый процессор (включая 32-битный Office), ни обычное приложение.Обычные пользователи в 64-битных системах не открывают и не сохраняют файлы непосредственно в системных каталогах.И большинство пользователей, не являющихся администраторами, в любом случае не имеют соответствующих прав для доступа к файлам.Microsoft перенаправляет файловую систему с очень веской причиной для 32-битных приложений.Не пытайтесь бороться с этим.
Теперь перейдем к решению.
Хитрость заключается в том, чтобы иметь вызов DLL Wow64DisableWow64FsRedirection в DllMain для каждого обратного вызова DLL_THREAD_ATTACH.
Первое созданиепростая DLL, которая имеет только DllMain и экспортирует несколько функций: «StartDisableRedirect» и «DisableRedirection».
bool g_fDisableRedirect = false;
__declspec(dllexport)
int DisableRedirection()
{
void* pVoid = NULL;
Wow64DisableWow64FsRedirection(&pVoid);
return 0;
}
__declspec(dllexport)
int StartDisableRedirect()
{
g_fDisableRedirect = true;
return 0;
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
{
void* pVoid = NULL;
if (g_fDisableRedirect)
{
DisableRedirection();
}
break;
}
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
Имейте вашу бинарную (EXE или DLL) ссылку напрямую с этой DLL.А затем, прямо перед вызовом GetOpenFileName, вызовите StartDisableRedirect (чтобы последующие потоки не перенаправлялись) и DisableRedirect (для текущего потока).
Я специально сделал функцию «Пуск», чтобы все DLL (включая системные DLL)) были загружены до того, как хук фактически начал обрабатывать потоки.Я не хотел предполагать, что DLL, реализующая Wow64Disable, будет загружена раньше, чем моя DLL.Вы должны быть очень осторожны (читай: не следует) при вызове кода из DllMain.
extern int StartDisableRedirect();
extern int DisableRedirection();
void OnFile(HWND hwndParent)
{
StartDisableRedirect();
DisableRedirection();
OPENFILENAME ofn = {};
WCHAR szFile[MAX_PATH*2] = {};
ofn.lStructSize = sizeof(ofn);
ofn.hwndOwner = hwndParent;
ofn.lpstrFilter = L"All Files\0*.*\0\0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFile;
ofn.nMaxFile = ARRAYSIZE(szFile);
ofn.Flags = OFN_DONTADDTORECENT|OFN_ENABLESIZING|OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST;
::GetOpenFileName(&ofn);
}