Проблемы WOW64 (ярлыки .lnk)

Я использую Windows 7 (x64) и Delphi 2010.

Я пишу компонент, который будет эмулировать меню «Пуск». Однако я столкнулся со следующими проблемами:

  1. Если я попытаюсь открыть ярлык (файл .lnk) с помощью ShellExecute, это завершится ошибкой, если %ProgramFiles% является частью целевого пути ярлыка (затем он будет смотреть на C: папку \Program Files (x86) вместо C:\Program Files);
  2. ShGetFileInfo не может извлечь правильный индекс значка в списке образов системы, если %ProgramFiles% является частью пути к файлу значка (та же проблема, что и выше).

Есть ли какой-нибудь обходной путь для вышеуказанных проблем или мне нужно ждать, пока родная 64-разрядная версия Delphi станет доступной, чтобы это заработало?


person Mattias Andersson    schedule 26.06.2010    source источник


Ответы (3)


Я думаю, вам следует вызвать Wow64DisableWow64FsRedirection до и Wow64RevertWow64FsRedirection позже.

person Giel    schedule 26.06.2010
comment
Хорошо, это очень раздражает. Хотя Wow64DisableWow64FsRedirection не решает мою первоначальную проблему, она решает проблему всякий раз, когда %windir% используется как часть имени пути. Можно было бы ожидать, что это скорректирует/перенаправит все переменные среды! - person Mattias Andersson; 27.06.2010
comment
Я не думаю, что это сработает. Все, что нужно сделать, это отключить перенаправление, чтобы доступ к c:\windows\system32 (в качестве примера) из программы Wow64 не перенаправлялся под прикрытием на c:\windows\syswow64. Насколько я знаю, это ничего не делает, чтобы помочь вам с переменными среды. Вам придется либо скомпилировать как собственный 64-битный код, либо самостоятельно обрабатывать переменные среды. - person Luke; 27.06.2010
comment
Хорошо, SetEnvironmentVariable('ProgramFiles', 'C:\Program Files') устраняет проблему для ShGetFileInfo, но проблема остается для ShellExecute. - person Mattias Andersson; 27.06.2010

Хорошо, небольшой пример, демонстрирующий проблему.

Я вызываю ShellExecute со следующими параметрами:

ShellExecute(Handle, 'open', 'C:\Users\...\Internet Explorer (64-bit).lnk', nil, nil, SW_SHOWNORMAL);

Целью Internet Explorer (64-bit).lnk является:

C:\Program Files\Internet Explorer\iexplore.exe

Тем не менее, 32-разрядная версия iexplore.exe открывается. В этом случае путь даже не использует %ProgramFiles%, поэтому каким-то образом ShellExecute преобразует C:\Program Files в C:\Program Files (x86) внутри. Я понятия не имею, как заставить его открывать 64-разрядную версию iexplore.exe.

Еще проблема, после вызова Wow64DisableWow64FsRedirection, ShellExecute больше не будет открывать папки.

person Mattias Andersson    schedule 27.06.2010
comment
Это не ответ на вопрос. Вместо этого добавьте дополнительные сведения в вопрос. - person Andreas Rejbrand; 27.06.2010
comment
Извините, я недавно зарегистрировался, когда я добавил openid в свою учетную запись, я потерял личность, которую использовал при публикации вопроса... - person Mattias Andersson; 27.06.2010
comment
Дополнительную информацию по этой проблеме можно найти здесь: stackoverflow.com/questions/386715/ - person Tobbe; 01.09.2010

Следующие переменные среды всегда будут указывать правильное направление на 64-битной машине и не будут определены на 32-битной машине:

из 32-битной оболочки на 32-битной архитектуре:

C:\>echo %processor_architecture%
x86
C:\>echo %programfiles(x86)%
%programfiles(x86)%
C:\>echo %programw6432%
%programw6432%
C:\>echo %programfiles%
C:\Program Files

из 32-битной оболочки на 64-битной архитектуре:

C:\>echo %processor_architecture%
x86
C:\>echo %programfiles(x86)%
C:\Program Files (x86)
C:\>echo %programw6432%
C:\Program Files
C:\>echo %programfiles%
C:\Program Files (x86)

из 64-битной оболочки:

C:\>echo %processor_architecture%
AMD64
C:\>echo %programfiles(x86)%
C:\Program Files (x86)
C:\>echo %programw6432%
C:\Program Files
C:\>echo %programfiles%
C:\Program Files

Попробуйте заменить их перед запуском приложения.

person SztupY    schedule 27.06.2010