WOW64 горе (.lnk ярлыки) - PullRequest
4 голосов
/ 26 июня 2010

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

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

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

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

Ответы [ 3 ]

2 голосов
/ 26 июня 2010

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

1 голос
/ 27 июня 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

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

1 голос
/ 27 июня 2010

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

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

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

Цель Internet Explorer (64-разрядная версия). 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 больше не будет открывать папки.

...