2010-06-26 8 views
4

Я использую Windows 7 (x64) и Delphi 2010.WOW64 Беды (ярлыки .lnk)

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

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

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

ответ

2

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

+0

Хорошо, это очень раздражает.В то время как Wow64DisableWow64FsRedirection не решает мою начальную проблему, она решает проблему всякий раз, когда% windir% используется как часть имени пути. Можно было бы ожидать, что это изменит/перенаправит все переменные среды! –

+0

Я не думаю, что это сработает. Все, что делает это, отключает перенаправление, поэтому доступ к c: \ windows \ system32 (как пример) из Wow64-программы не перенаправляется под обложки в c: \ windows \ syswow64. Насколько я знаю, это не делает ничего, чтобы помочь вам с переменными окружения. Вам придется либо самостоятельно скомпилировать как собственные 64-разрядные, либо обрабатывать переменные среды обработки. – Luke

+0

Ок, SetEnvironmentVariable ('ProgramFiles', 'C: \ Program Files') исправляет проблему для ShGetFileInfo, но проблема остается в ShellExecute. –

1

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

Я призываю 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 больше не будет открывать папки.

+0

Это * не * ответ на вопрос. Вместо этого добавьте дополнительную информацию в вопрос. –

+0

Извините, я недавно зарегистрирован, когда я добавил openid в свою учетную запись, я потерял личность, которую использовал при отправке вопроса ... –

+1

Подробнее об этом выпуске можно найти здесь: http://stackoverflow.com/questions/386715/запуск-оболочка-ссылка-lnks-из-WOW64 – Tobbe

1

Следующие переменные среды всегда будет указывать на правильное направление на 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 

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