Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2015, 17:40   #1
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию Изменить свойство стороннего ярлыка

Здравствуйте, подскажите, как поменять свойство стороннего ярлыка, не создавая новый(копию)?

Всё что нужно, это вписать в ярлыке в строчке "Объект" пару команд.

Как сделать это программно?
Rec0il вне форума Ответить с цитированием
Старый 13.05.2015, 17:45   #2
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Нашёл в инете структуру и чтение ярлыка, но сам не проверял:
Код:
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;
FaTaL вне форума Ответить с цитированием
Старый 13.05.2015, 18:13   #3
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Нашёл в инете структуру и чтение ярлыка, но сам не проверял:
Тоже самое я нашёл на DelphiWorld
Но там написано что это получение информации о ярлыке. А мне как бы изменить его надо, дополнить.
Rec0il вне форума Ответить с цитированием
Старый 13.05.2015, 19:01   #4
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Ну вот есть http://www.programmersclub.ru/simply-art-yarl/
FaTaL вне форума Ответить с цитированием
Старый 13.05.2015, 21:33   #5
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Цитата:
Сообщение от FaTaL Посмотреть сообщение
Это всё не то. Мне нужно не создавать ярлык, не дублировать его.
А изменить уже готовый.
Допустим валяется на рабочем столе ярлык, мне нужно через свою программу добавить в свойстве ярлыка, в поле "Объект" пару букв...
Ярлык известен, путь к нему тоже, вобщем всё известно, кроме того, как редактировать его свойства.
Rec0il вне форума Ответить с цитированием
Старый 14.05.2015, 06:36   #6
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

ищи создание ярлыков, код в инете точно был. как-то использовал.
можно сделать так, прочитать инфу кодом который есть выше (если он рабочий) и эти данные использовать чтобы создать новый ярлык, а тот просто удалишь
ZuBy вне форума Ответить с цитированием
Старый 14.05.2015, 07:46   #7
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Ну MS официально не документирует структуру ярлыка. Так что придётся создавать новый и удалять старый. Что Вас в этом смущает? Это же по времени очень мало займёт. Я понимаю файл бы в несколько гигов перезаписывал, а тут всего то.
FaTaL вне форума Ответить с цитированием
Старый 14.05.2015, 16:09   #8
Rec0il
Пользователь
 
Регистрация: 16.03.2013
Сообщений: 69
По умолчанию

Спасибо за помощь!

Решение нашёл в гугле, а точнее в картинках гугла...
Решил не бросать этот вопрос без ответа, вдруг люди будут задаваться подобным вопросом.

http://www.decoding.dax.ru/practic/link/link.html

Тут создание lnk. С возможностью изменить иконку, добавить параметры запуска и тд..
Rec0il вне форума Ответить с цитированием
Старый 14.05.2015, 16:31   #9
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Так я тебе выше тоже самое кидал, только более развёрнуто.
Тем более в твоём примере "кривое" (не правильное) нахождение специальных папок через реестр. Этого сам мелкософт категорически не рекомендует делать.
Цитата:
!Do not use this registry key
Use the SHGetFolderPath or SHGetKnownFolderPath function instead

Последний раз редактировалось FaTaL; 14.05.2015 в 16:34.
FaTaL вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изменить свойство компонента в Rave Reports - Delphi S_007 Общие вопросы Delphi 2 04.05.2015 18:40
jquery, изменить свойство объекта Mortimoro JavaScript, Ajax 4 08.04.2013 20:22
как изменить css свойство transform из Js? Даниил_глазко JavaScript, Ajax 2 15.10.2011 13:23
Как программно VBA изменить свойство Обязательное поле в таблице myprog Microsoft Office Access 10 05.10.2010 11:23
Как изменить свойство href тега <A> Ga-sergey JavaScript, Ajax 2 23.04.2010 17:49