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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как вытащить инфрмацию из файлов ярлыка (*.lnk) ? 
:(
    Опции темы
midavik
Дата 21.9.2007, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



меня интересует можно ли при помощи интерфейса IShellLink либо какого-нибудь другого вытащить всю информацию о файлах с расширением LNK?

В следующем примере показывается как вытащить некоторые параметры:
Код

uses  
  ShlObj,  
  ComObj,  
  ActiveX,  
  CommCtrl;  

type  
  PShellLinkInfoStruct = ^TShellLinkInfoStruct;  
  TShellLinkInfoStruct = record  
    FullPathAndNameOfLinkFile: array[0..MAX_PATH] of Char;  
    FullPathAndNameOfFileToExecute: array[0..MAX_PATH] of Char;  
    ParamStringsOfFileToExecute: array[0..MAX_PATH] of Char;  
    FullPathAndNameOfWorkingDirectroy: array[0..MAX_PATH] of Char;  
    Description: array[0..MAX_PATH] of Char;  
    FullPathAndNameOfFileContiningIcon: array[0..MAX_PATH] of Char;  
    IconIndex: Integer;  
    HotKey: Word;  
    ShowCommand: Integer;  
    FindData: TWIN32FINDDATA;  
  end;  

procedure GetLinkInfo(lpShellLinkInfoStruct: PShellLinkInfoStruct);  
var  
  ShellLink: IShellLink;  
  PersistFile: IPersistFile;  
  AnObj: IUnknown;  
begin  
  // access to the two interfaces of the object  
  AnObj       := CreateComObject(CLSID_ShellLink);  
  ShellLink   := AnObj as IShellLink;  
  PersistFile := AnObj as IPersistFile;  

  // Opens the specified file and initializes an object from the file contents.  
  PersistFile.Load(PWChar(WideString(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile)), 0);  
  with ShellLink do  
  begin  
    // Retrieves the path and file name of a Shell link object.  
    GetPath(lpShellLinkInfoStruct^.FullPathAndNameOfFileToExecute,  
      SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfLinkFile),  
      lpShellLinkInfoStruct^.FindData,  
      SLGP_UNCPRIORITY);  

    // Retrieves the description string for a Shell link object.  
    GetDescription(lpShellLinkInfoStruct^.Description,  
      SizeOf(lpShellLinkInfoStruct^.Description));  

    // Retrieves the command-line arguments associated with a Shell link object.  
    GetArguments(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute,  
      SizeOf(lpShellLinkInfoStruct^.ParamStringsOfFileToExecute));  

    // Retrieves the name of the working directory for a Shell link object.  
    GetWorkingDirectory(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy,  
      SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfWorkingDirectroy));  

    // Retrieves the location (path and index) of the icon for a Shell link object.  
    GetIconLocation(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon,  
      SizeOf(lpShellLinkInfoStruct^.FullPathAndNameOfFileContiningIcon),  
      lpShellLinkInfoStruct^.IconIndex);  

    // Retrieves the hot key for a Shell link object.  
    GetHotKey(lpShellLinkInfoStruct^.HotKey);  

    // Retrieves the show (SW_) command for a Shell link object.  
    GetShowCmd(lpShellLinkInfoStruct^.ShowCommand);  
  end;  
end;  

procedure TForm1.Button1Click(Sender: TObject);  
const  
  br = #13#10;  
var  
  LinkInfo: TShellLinkInfoStruct;  
  s: string;  
begin  
  FillChar(LinkInfo, SizeOf(LinkInfo), #0);  
  LinkInfo.FullPathAndNameOfLinkFile := 'C:\WINNT\Profiles\user\Desktop\FileName.lnk';  
  GetLinkInfo(@LinkInfo);  
  with LinkInfo do  
    s := FullPathAndNameOfLinkFile + br +  
      FullPathAndNameOfFileToExecute + br +  
      ParamStringsOfFileToExecute + br +  
      FullPathAndNameOfWorkingDirectroy + br +  
      Description + br +  
      FullPathAndNameOfFileContiningIcon + br +  
      IntToStr(IconIndex) + br +  
      IntToStr(LoByte(HotKey)) + br +  
      IntToStr(HiByte(HotKey)) + br +  
      IntToStr(ShowCommand) + br +  
      FindData.cFileName + br +  
      FindData.cAlternateFileName;  
  Memo1.Lines.Add(s);  
end; 



но согласно недокументированному формату структуры таких файлов http://www.stdlib.com/art6-Shortcut-File-Format-lnk.html
там гораздо больше информации о файле. А интерфейс IShellLink насколько я понял не позволяет извлечь такую информацию.

А именно особенно интересуют такие параметры как:
1)Type of volume
2)Volume serial number
3)Volume label
4)Network share name
Я конечно могу, зная на каком диске находится этот файл, узнать все эти св-ва диска и компьютера, но меня интересует именно та информация о этих параметрах которая находится в самом файле.

И еще может кто знает хранит ли файл ярлыка в себе помимо всего прочего еще и информацию о MAC - адресе машины?
PM MAIL   Вверх
Mikh@il
Дата 23.9.2007, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



http://www.delphisources.ru/pages/faq/base/make_link.html

Посмотри тут, может поможет
PM MAIL   Вверх
Alexeis
Дата 25.9.2007, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



Mikh@il, чем этот пример лучше того что привел автор?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Dragin
Дата 29.9.2007, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Type
TLinkParamList = Array[1..4] Of String;

Function GetLinkInfo(FileName:PWideChar):TLinkParamList;
{ 1 - Полное и директория родного файла
  2 - Коментарий
  3 - Директория родного файла
  4 - Тип окна
  Uses - ShlObj,ComObj,ActiveX }
Var
ShellLink : IShellLink;
IUnk: IUnknown;
ShellFile: IPersistFile;
Buffer : Array [0..255] of Char;
TempInfo : _Win32_Find_DataA;
XShowCmd:Integer;
Begin
FillChar(Result,SizeOf(Result),Byte(0));
IUnk := CreateComObject(CLSID_ShellLink);
ShellLink := IUnk as IShellLink;
ShellFile :=  IUnk as IPersistFile;
ShellFile.Load(FileName,STGM_READWRITE);
ShellLink.GetPath(Buffer,SizeOf(Buffer),TempInfo,0);
Result[1] := Buffer;
ShellLink.GetDescription(Buffer,SizeOf(Buffer));
Result[2] := Buffer;
ShellLink.GetWorkingDirectory(Buffer,SizeOf(Buffer));
Result[3] := Buffer;
ShellLink.GetShowCmd(XShowCmd);
Case XShowCmd Of
1 : Result[4] := 'Обычный';
7 : Result[4] := 'Свёрнутый';
3 : Result[4] := 'Развёрнутый';
End;
Pointer(ShellFile) := Nil;
Pointer(ShellLink) := Nil;
End;


Вот довно писал, что то типо
PM MAIL   Вверх
Alexeis
Дата 29.9.2007, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 16
Всего: 459



  А если внимательно почитать что спрашивает автор? Это уже 2я копия кода аналоичного тому что привел автор поста.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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