Я создал тему на оффоруме, но никто не ответил. Собственно чтобы не дублировать пример. Я его обновил, добавив CLSID и несколько полей.
1. Сначала я начал экспериментировать методом сохранения двух структур ShellLinkHeaderStr и LinkInfoStr друг за другом, из которых я понял что LinkInfo (суффиксы Str там лишние, гугл выдаёт имена структур без них), где структура LinkInfo содержит сдвиги, что ясно по "Offset" в имени полей структуры. Я посчитал что сдвиги являются либо от начала структуры LinkInfo , так как подразумевается что оставшаяся часть вся является структурой LinkInfo, так как она ссылается на поля строк, либо отсчёт идёт от конца структуры LinkInfo, но взятие LinkInfoHeaderSize=28, а размер (SizeOf) LinkInfo=36, LinkInfoSize=98 с реального ярлыка.
Также размер ShellLinkHeader=76 всегда, и указывается в первых байтах ярлыка. LinkFlags этой структуры если 2, то используется структура LinkInfo, а если не 2, то что, последовательно идут поля A-Z описанные в справке.
2. Эксперимент с полями после структуры ShellLinkHeader не дал результата, а взятие данных с ярлыков подтвердило что "нормальным" ярлыком считается ярлык со структурой LinkInfo, из чего я начал экспериментировать этот вариант.
3. Обратившись к примеру автора blueznl я не увидел в нём структуры LinkInfo, при этом он считывает данные с ярлыков.
4. Я решил использовать структуру LinkInfo, но оставшиеся поля (путь запуска, рабочий каталог, аргументы, значок) я добавляю после структуры LinkInfo и кстати эта структура не содержит полей на "рабочий каталог", аргументы, значок, а только на "путь запуска", а значит избежать этих полей не удастся. Из примера blueznl я понял, что перед каждым полем вводится длина этого поля. Я использую StringByteLength() чтобы получить длину и пишу её в месте где находится файловый указатель и после него пишу путь добавляя в конце два Null. В инструкции написано что строка нуль-терминированная, а в примере blueznl я не вижу место где происходит сдиг- пропуск этих двух байтов, а сразу читается следующее поле - размер и строка.
Если кто желает поиграться, может получится. Я во первых проверяю бинарные данные в HxD и смотрю свойства ярлыка, ни разу не появлялась вкладка "Ярлык", что сигнализирует как сломанный ярлык. Началось всё с примера RASHAD, который модернизировал пример от infratec, из чего я понял что ярлык можно создать бинарно. Отличие бинарного создания от объектов заключается в отсутствии проверки существования путей, что заметно при использовании генерации ярлыков методом создания объектной функцией - это длится 2 минуты для 100 ярлыков, а фактической создание файлов должно быть почти мгновенно.
Отредактировано AZJIO (08.06.2024 13:40:27)