Dark_Diver
Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Баг в ShellExecute в Windows 8.1: Win8.1 при выполнении ShellExecute разыменовывает символические ссылки на файлы при их открытии. Т.е. создаю файл, на него создаю символическую ссылку, пытаюсь открыть файл через созданную ссылку - ассоциированному приложению в качестве параметра передаётся не имя ссылки, как в более ранних версия Windows, а имя цели. Пример: открываю командную строку от админа, выполняю следующие команды: Код: echo 1>1.txt mklink 2.txt 1.txt 2.txt | В Win8.1 открывается блокнот, в котором открыт файл "1.txt", а не "2.txt" (в заголовке окна видим имя открытого файла). Не важно, как открывать - через окно проводника или в командной строке по имени файла. Когда Windows запускает ассоциированное с данным типом файла приложение, то она передаёт этому приложению разыменованное имя файла, а не имя ссылки. При этом в диспетчере задач видно, что в командной строке блокноту в качестве параметра было передано именно "1.txt", а не "2.txt" - если самому вызвать в командной строке блокнот с именем ссылки, то блокнот откроет файл именно по ссылке: Код: - откроет в блокноте файл по ссылке "2.txt" (видно в заголовке окна и в командной строке запущенного блокнота). В более ранних версиях (Висте, 7-ке, вероятно и в 8-ке и в соответствующих им серверных) ассоциированному приложению передаётся имя ссылки, как и должно быть. Кто в курсе, куда M$у написать об этом? Не уверен, что исправят, правда, они там чем-то очень-очень заняты - им ещё в конце прошлого года так же жаловались на другой баг с ссылками, но у M$ руки так и не дошли его исправить. У меня исторически используется один батник с кучей символических ссылок на него и батник по вызванному имени определяет, что от него требуется ("unix-style"). Так вот, в проводнике, при запуске по разным символическим ссылкам, батник всё время запускается с одним ("родным") именем и всё перестало работать, естественно. А вот при вызове из командной строки всё работает - CMD сам, видимо, обрабатывает запуск "своих" CMD-файлов и не использует для этого вызов ShellExecute. |