Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проверка, является ли файл ярлыком


Автор: Keeper89 30.10.2009, 00:27
Доброго времени суток!

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

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

Цитата

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


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

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

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

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

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

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

Автор: Qu1nt 30.10.2009, 11:26
Как-то так.
Код

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;

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

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

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

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

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

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

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

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

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

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

Автор: Rrader 3.11.2009, 19:14
Просто проверяя размер файла. Кстати, в этом коде
Код

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;       

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

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

Учту. ;)

Автор: Rrader 3.11.2009, 19:39
Да, все так. 

Автор: Keeper89 3.11.2009, 20:01
Спасибо.

Автор: CodeMonkey 3.11.2009, 21:46
Как насчёт файла ShowMeTheMoney.lnk размером 0 байт? Это ярлык или нет? Ну, просто парадокс какой-то  smile 

Автор: Qu1nt 3.11.2009, 22:14
Нет, это файл с расширением lnk.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)