![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 13.09.2010
Сообщений: 65
|
![]()
В интернете нашёл один исходник (наверное на С или Делфи)
В качестве примера перечисленных действий ниже приведен текст функции, которая принимает в качестве параметра имя ярлыка и выводит на консоль полное имя файла, на который этот ярлык ссылается. Описание алгоритма: 1 - Инициализировать, если это еще не было сделано, COM-библиотеку вызовом функции CoInitialize (или CoInitializeEx). 2 - Создать с помощью функции CoCreateInstance экземпляр COM-класса ShellLink и получить указатель на его интерфейс IPersistFile. 3 - Загрузить вызовом метода Load требуемый ярлык, указав желаемый режим доступа к его свойствам — чтение (STGM_READ), запись (STGM_WRITE) или чтение/запись (STGM_READWRITE). 4 - Получить указатель на интерфейс IShellLink „нашего“ COM-объекта, вызвав метод QueryInterface через полученный ранее указатель на IPersistFile. 5 - Если существует вероятность того, что объект, на который ссылается ярлык, был перемещен — вызвать через полученный указатель метод Resolve для поиска объекта. 6 - Получить и (или) назначить требуемые свойства ярлыка, вызвав через указатель на IShellLink его методы GetXxxx и (или) SetXxxx соответственно. 7 - При необходимости — сохранить сделанные изменения с помощью метода Save интерфейса IPersistFile. 8 - „Отпустить“ полученные интерфейсы, вызвав для каждого из них метод Release. 9 - Завершить, если это необходимо, работу с COM-библиотекой вызовом функции CoUninitialize (перед этим можно вызвать функцию CoFreeUnusedLibraries для выгрузки из памяти всех неиспользуемых более COM-серверов). Код:
Нашёл файл shlobj.inc где (вроде бы) указаны эти константы и макрос "coinvoke" (хотя могу и ошибатся и это из другой оперы) Правда с методом "Load" я не разобрался и реализовал его на бум лазаря. Скорее всего ошибка в нём .Может кто в курсе что здесь не так, а то я по части COM не силён. Или на асемблере есть другие методы реализации этого действия? Код:
|
![]() |
![]() |
![]() |
#2 |
Пользователь
Регистрация: 15.07.2008
Сообщений: 28
|
![]()
assch, причём здесь gdi32 ???. Вместо
Код:
Код:
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 13.09.2010
Сообщений: 65
|
![]()
litrovith Большое спасибо
Век живи век учись |
![]() |
![]() |
![]() |
#4 |
Пользователь
Регистрация: 13.09.2010
Сообщений: 65
|
![]()
Попробывал реализовать идею обойтись без ком интерфейсов, и написал функцию которая вытаскивает путь из линк файла. Алгоритм может быть не совсем правильный и в плотную я её не тестировал но вроде бы работает (если у кого не сработает то значит в алгоритме ошибка).Если кому интересно то код представляю (может кто нибудь что нибудь подправит)
Код:
|
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как програмно отключить ярлык "Мой компьютер"? | bananasus | Общие вопросы Delphi | 2 | 15.04.2011 22:48 |
как узнать имя загружаемого файла? | pufystyj | PHP | 3 | 06.03.2011 12:41 |
Узнать путь и имя файла который находится под курсором? | Kostia | Win Api | 4 | 20.11.2009 12:16 |
Как програмно узнать размер файла? | Дима я | Общие вопросы C/C++ | 3 | 09.10.2009 21:37 |
Как узнать имя файла??? | Shurik Hacker | Работа с сетью в Delphi | 3 | 20.11.2007 17:06 |