2011-01-18 5 views
0

Я пытаюсь построить 32-разрядную программу, которая может работать корректно в 64-битной Windows; то есть, если ему нужно открыть текстовый файл для пользователя, файл должен быть не быть перенаправлен от C:\Program Files до C:\Program Files (x86). Однако, если я просто позвоню Wow64DisableWow64FsRedirection, тогда моя программа не загружается вообще, потому что некоторые системные библиотеки вызывают LoadLibrary, когда загружаются части графического интерфейса, который пытается загрузить 64-разрядную версию системной DLL в мою программу.WOW64 Redirection and LoadLibrary

Как решить эту проблему?


Edit:

См задачу на скриншоте ниже:


Edit 2:

Вот еще один вопрос, который будет решать эту проблему: Есть ли способ отключить перенаправление WOW64 для произвольного потока в лету ур или для вашего процесса в целом?

ответ

3

Просто позвоните Wow64DisableWow64FsRedirection как раз перед тем, как позвонить по телефону CreateFile, а затем позвоните по телефону Wow64RevertWow64FsRedirection, как только это будет сделано.

+0

Это проще сказать, чем сделать, потому что 'CreateFile()' получает вызов из * внутри * 'GetOpenFileName'. Итак, если я отключу WOW64, тогда диалог вообще не будет отображаться (из-за 'LoadLibrary'), а если нет, то он показывает, но я получаю виртуализованные данные. (Думаю, я должен был упомянуть о диалоговом окне, но дело в том, что я не контролирую, где вызывается вызов CreateFile.) – Mehrdad

+0

Почему CreateFile вызывается внутри GetOpenFileName? Вы делаете это в крючке? –

+0

Извините, я понял, что мое объяснение было немного неясным ... так что происходит, я называю «CreateFile» в других точках программы (и поэтому я могу отключить перенаправление, как вы сказали для этих точек), но диалог внутренне вызывает файл функции, такие как 'FindFirstFile',' FindNextFile' для перечисления каталогов (и, вероятно, также 'CreateFile'), которые все внутренне называют файловые функции нижнего уровня в системе (например,' NtCreateFile'). Я просто обобщил все те, что были в «CreateFile», вместо того, чтобы упоминать разные функции, но общая идея заключалась в том, что я не могу контролировать каждый звонок. – Mehrdad