Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка, является ли файл ярлыком 
V
    Опции темы
Keeper89
Дата 30.10.2009, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Доброго времени суток!

Существует ли способ (кроме проверки расширения) определить, является найденный файл ярлыком или нет? 
Если нет, то :
1) есть ли точный список расширений ярлыков, т.к. кроме *.lnk бывают, например .*pif или *.url?
2) т.к. файлы находятся через FindFirst/FindNext, можно ли задать маску для поиска нескольких файлов?

Это сообщение отредактировал(а) Keeper89 - 30.10.2009, 00:29


--------------------
PM MAIL WWW   Вверх
Beltar
Дата 30.10.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 627
Регистрация: 11.1.2006

Репутация: 3
Всего: 7



С .lnk http://computer-forensics-lab.org/lib/data/92.pdf По остальным гугл в помощь.

Цитата

 т.к. файлы находятся через FindFirst/FindNext, можно ли задать маску для поиска нескольких файлов?


Э-э. Мой компонент в примере, что вчера выкладывал имеет свойство Extensions:TStrings для работы только с нужными расширениями.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы. smile(с) я, хотя может и нет
Пищущий на C++ мужик. Даже если это мужик сидит в написанном на Delphi и жрущем паскалевскую библиотеку билдере.
PM MAIL   Вверх
CodeMonkey
Дата 30.10.2009, 09:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(Keeper89 @  30.10.2009,  00:27 Найти цитируемый пост)
есть ли точный список расширений ярлыков, т.к. кроме *.lnk бывают, например .*pif или *.url?

Вообще-то это разные вещи.
url - это вообще ini-файл, просто ассоциированный с браузером.

Смысла считать не-lnk файл ярлыком я не вижу. Единственное, что с ним можно сделать - открыть в ассоциированной программе.


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
bems
Дата 30.10.2009, 10:49 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Цитата(CodeMonkey @  30.10.2009,  09:59 Найти цитируемый пост)
Смысла считать не-lnk файл ярлыком я не вижу
Ну это преждевременно. Вот тут http://msdn.microsoft.com/en-us/library/bb...28VS.85%29.aspx написано что приложение может зарегить своё расширение как ярлык добавив значение IsShortcut.



--------------------
Обижено школьников: 8
PM MAIL   Вверх
Данкинг
Дата 30.10.2009, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 9
Всего: 130



А PIF - это с какой стати ярлык? Насколько я помню, PIF-файлы использовались в Win 3.1 для запуска DOS-приложений. smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Qu1nt
Дата 30.10.2009, 11:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



Как-то так.
Код

uses
  ActiveX, ComObj, ShlObj;

function IsLabel(const Path: AnsiString): Boolean;
begin
  Result := Succeeded(((CreateComObject(CLSID_ShellLink) as IShellLink)
    as IPersistFile).Load(StringToOleStr(Path), STGM_READ));
end;

Если накосячил - поправьте = )

Это сообщение отредактировал(а) Qu1nt - 30.10.2009, 11:46
PM MAIL   Вверх
bems
Дата 30.10.2009, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



Данкинг, они и потом использовались. В линолиуме были, в 2к тоже кажись были. Ярлык тож.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
CodeMonkey
Дата 30.10.2009, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1839
Регистрация: 24.6.2008
Где: Россия, Тверь

Репутация: 38
Всего: 89



Цитата(bems @  30.10.2009,  10:49 Найти цитируемый пост)
Ну это преждевременно. Вот тут http://msdn.microsoft.com/en-us/library/bb...28VS.85%29.aspx написано что приложение может зарегить своё расширение как ярлык добавив значение IsShortcut.

Спасибо за ссылку!


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Keeper89
Дата 31.10.2009, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Qu1nt, спасибо, действительно можно попробовать работать с файлом как с ярлыком; если не получится - значит не ярлык. smile


--------------------
PM MAIL WWW   Вверх
Keeper89
Дата 2.11.2009, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Возник вопрос: почему данный метод относит к ярлыкам файлы *.bat и *.sys (другие расширения пока не попадались)? smile


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 3.11.2009, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Цитата(Keeper89 @  3.11.2009,  04:31 Найти цитируемый пост)
Возник вопрос: почему данный метод относит к ярлыкам файлы *.bat и *.sys (другие расширения пока не попадались)? smile

Какой размер у этих файлов? Файлы 0 байт любого расширения считаются "правильными" ярлыками, если использовать этот метод.


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 3.11.2009, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(Rrader @  3.11.2009,  19:32 Найти цитируемый пост)
Какой размер у этих файлов? Файлы 0 байт любого расширения считаются "правильными" ярлыками, если использовать этот метод. 

В точку  smile 
Как их тогда можно отделить от ярлыков?


--------------------
PM MAIL WWW   Вверх
Rrader
  Дата 3.11.2009, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Просто проверяя размер файла. Кстати, в этом коде
Код

Load(StringToOleStr(Path), STGM_READ));

второй параметр на самом деле не используется smile Потому что CShellLink реализует метод Load интерфейса IPersistFile примерно так:
Код

function CShellLink.Load(pwszFile: LPCOLESTR; grfMode: DWORD): HRESULT; stdcall;
begin
  Result := E_INVALIDARG;
  if pwszFile <> nil then
  begin
    Result := _LoadFromFile(W2CT(pwszFile));
    if Succeeded(Result) then
      Result := NOERROR;  
  end;
end;


Добавлено @ 19:20
Если мы пойдем в _LoadFromFile, то сможем там увидеть:
Код

function CShellLink.Load(pstm: IStream): HRESULT; stdcall;
var
  cbBytes: ULONG;
  cbSize: DWORD;
begin
  Result := pstm.Read(cbSize, SizeOf(cbSize), cbBytes);
  if Succeeded(Result) then   
    if cbBytes = SizeOf(cbSize) then
      ...
    else if cbBytes = 0 then
      { Файл нулевой длины - правильный! }
  else
    Result := E_FAIL;
end;       



--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Keeper89
Дата 3.11.2009, 19:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 20
Всего: 58



Цитата(Rrader @  3.11.2009,  20:14 Найти цитируемый пост)
Просто проверяя размер файла

Т.е.
  • Ярлык = IsLabel and Размер<>0
  • Файл = not IsLabel or Размер=0
правильно ? smile
Цитата(Rrader @  3.11.2009,  20:14 Найти цитируемый пост)
второй параметр на самом деле не используется smile Потому что CShellLink реализует метод Load интерфейса IPersistFile примерно так:

Учту. ;)


--------------------
PM MAIL WWW   Вверх
Rrader
Дата 3.11.2009, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Inspired =)
***


Профиль
Группа: Экс. модератор
Сообщений: 1535
Регистрация: 7.5.2005

Репутация: 70
Всего: 191



Да, все так. 


--------------------
Let's do this quickly!
Rest in peace, Vit!
PM MAIL Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0840 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.