Задачка нетривиальная, как может показаться на первый взгляд. Скажите, может кто знает, как можно получить в своём оконном приложении иконку и заголовок того ярлыка, через который было запущено приложение? Приведу пример, если не совсем понятно объяснил: Созадал .bat-файл, который делает резервную копию инф'ы, запускаю этот файл через ярлык, который лежит в quiklanch. У ярлыка настроена иконка, отличная от того, что имеем для ярлыка на bat-файл. При запуске и во время архивирования в заголовке консоли windows вижу эту иконку и название ярлыка. Так вот, мне понятно, что эта особенность специфична для консоли windows (если что, у меня XP SP2). Но вот как заставить вести себя подобным образом простое оконное приложение, создаваемое, скажем через регистрацию класса и CreateWindow/CreateWindowEx? Желательно решить эту задачу без промежуточного вызова консольного окошка для выковыривания иконки и текста заголовка самой консоли, хотя это и есть одно из возможных решений.
http://delphiworld.narod.ru/base/change_console_win_icon_and_caption.html Советую скачать от туда всю базу статей. Если ты будешь работать с заголовком консольного окна, то при запуске в Ubuntu (или другом лине) под wine, появится это самое окошко, но вывод всё равно будет идти в терминальное окно. Вчера проверял.
Спасибо за пример, но к сожалению требовалось не это, а просто надо получить дескриптор иконки и указатель на строку ярлыка, по которому было вызвано приложение, причём я бы хотел, чтобы не создавалось никаких консолей, а создалось обыное оконное приложение, причём сразу. Я считаю, что раз консоль cmd.exe является простым оконным windows приложением, то она (консоль) как-то получает при запуске данные ярлыка, через который она была вызвана.
mc black, не верно понял (заголовок темы напомнил о вчерашних стараниях). Тебе нужно достать иконку из lnk файла?
иконка обычно сама присваивается. по крайней мере с pif файлами. иначе - апи. незнаю какие, но у винды нет невозможного. а там - SetConsoleTitle() из GetCommandLineA(),
Было увидено, что по адресу [PEB.ProcessParameters] (==0x20000) находится структура RTL_USER_PROCESS_PARAMETERS. По смещению 0x70 (в висте32 и wnet32) в RTL_USER_PROCESS_PARAMETERS находится UNICODE_STRING, определяющая имя ярлыка, с которого запущен процесс. Ну а получение иконки, определённой в ярлыке, должно быть документировано. Итак, [PEB.ProcessParameters].WindowTilte.Buffer Edit: А-ха. Всё несколько проще: GetStartupInfo(STARTUPINFO* si). Похоже, что si.lpTitle получает указатель на строку с именем ярлыка.
Sol_Ksacap Спасибо, ты оказался прав! Я думал раньше про STARTUPINFO, но, к сожалению, поленился это проверять..