как вытащить инфрмацию из файлов ярлыка (*.lnk) ?
От: midavik  
Дата: 21.09.07 07:22
Оценка:
меня интересует можно ли при помощи интерфейса 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 — адресе машины?
Re: как вытащить инфрмацию из файлов ярлыка (*.lnk) ?
От: Firstborn Латвия  
Дата: 21.09.07 10:48
Оценка:
Здравствуйте, midavik, Вы писали:

M>И еще может кто знает хранит ли файл ярлыка в себе помимо всего прочего еще и информацию о MAC — адресе машины?


Наверняка не знаю, но не могу придумать ни одной причины, зачем МАС-адрес стоило бы засовывать в LNK-файл... Так что наверное его там и нет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.