Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Создание ярлыка с помощью VBS

Ответить
Настройки темы
VBS/WSH/JS - [решено] Создание ярлыка с помощью VBS

Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262


Конфигурация

Профиль | Отправить PM | Цитировать


Подскажите пожалуйста скрипт который будет создавать закрепленный ярлык на панели задач.....Очень надо. Или какой-нибудь другой способ данного действия.

Отправлено: 23:29, 30-01-2014

 

Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262

Профиль | Отправить PM | Цитировать


Iska, есть какие-нибудь идеи?

-------
Inno Setup 5 Ultra Unicode


Отправлено: 20:11, 10-04-2016 | #51



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Dodakaedr, тут не идеи нужны. Надо загрузить InnoSetup+редактор, создать инсталляцию, запустить её и отследить, что происходит.

Отправлено: 20:55, 10-04-2016 | #52


Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262

Профиль | Отправить PM | Цитировать


Iska, если указывать параметр то скрипт не видит файл.

-------
Inno Setup 5 Ultra Unicode


Отправлено: 20:59, 10-04-2016 | #53


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Dodakaedr, ото ж .

Давайте попробуем так: сначала прикрепляем ярлык на Панель задач, затем добавляем к нему аргумент.

Добавьте в секцию [code] скрипта инсталляции следующий код:
Скрытый текст
Код: Выделить весь код
//the function is work well on Unicode Inno Setup, 
//if Non Unicode Inno Setup, one need to modify,
//and I think you can do it!
//Inno use Win32 API
const
  // these constants are not defined in Windows
  SHELL32_STRING_ID_PIN_TO_TASKBAR = 5386;
  SHELL32_STRING_ID_PIN_TO_STARTMENU = 5381;
  SHELL32_STRING_ID_UNPIN_FROM_TASKBAR = 5387;
  SHELL32_STRING_ID_UNPIN_FROM_STARTMENU = 5382;

  sFileName = 'Program.exe';

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function LoadLibrary(lpFilename : String) : LongInt;
external 'LoadLibrary{#A}@kernel32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadLibraryA
function FreeLibrary(hModule : LongInt) : BOOL;
external 'FreeLibrary@kernel32.dll stdcall delayload';
function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
external 'LoadString{#A}@user32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadStringA

//here is the function
//@param strPath The App's directory,
//@param strApp The App's name
//@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
procedure zylPinAppToTaskbar(strPath, strApp: string);  
var  
  vShell, vFolder, vFolderItem, vItemVerbs: Variant;  
  vPinnedShortcutFileName: Variant;
  vWshShell, vShellLink: Variant;
  vPath, vApp: Variant;  
  i: Integer;  
  sItem: String;   
  h: LongInt; 
  szPinName: String; 
  filenameEnd : Integer;
  filename    : String; 
  strEnd    : String;
begin 
  SetLength(szPinName, 255); 
  h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));  
  LoadString(h, SHELL32_STRING_ID_PIN_TO_TASKBAR, szPinName, 255); //pin to taskbar text 
  FreeLibrary(h);  
  strEnd := #0;
  filenameEnd := Pos(strEnd, szPinName);
  filename := Copy(szPinName, 1, filenameEnd - 1);
  if (Length(filename) > 0) then  //WinXp or lower, no pin taskbar function
  begin
    vShell := CreateOleObject('Shell.Application');  
    vPath := strPath;  
    vFolder := vShell.NameSpace(vPath);  
    vApp := strApp;  
    vFolderItem := vFolder.ParseName(vApp);  
    vItemVerbs := vFolderItem.Verbs;  
    for i := 1 to vItemVerbs.Count do  
    begin  
      sItem := vItemVerbs.Item(i).Name;
      if (sItem = filename) then
      begin
        // 63 63 72 75 6E 2E 63 6F 6D  
        vItemVerbs.Item(i).DoIt;
        vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
        if (FileExists(vPinnedShortcutFileName)) then
        begin
          vWshShell := CreateOleObject('Wscript.Shell');
          vShellLink := vWshShell.CreateShortcut(vPinnedShortcutFileName);
          vShellLink.Arguments := '/Rem';
          vShellLink.Save();
        end;
        break; 
      end; 
    end;
  end;
end;  

//You can use zylPinAppToTaskbar like this
procedure CurPageChanged(CurPageID: Integer);
begin
  //When Finished page is shown, call the function
  //You can also call is when the "Finish" button clicked.
  if  CurPageID = wpFinished then  
  begin
  if IsTaskSelected('pintaskbar') then
    zylPinAppToTaskbar(ExpandConstant('{app}'), sFileName);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  vShell, vFolder, vFolderItem: Variant;  
  vPinnedShortcutFileName: Variant;
begin
  if CurUninstallStep = usUninstall then  
  begin
    vShell := CreateOleObject('Shell.Application');  
    vFolder := vShell.NameSpace(ExpandConstant('{app}'));  
    vFolderItem := vFolder.ParseName(sFileName);  
    vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + vFolder.GetDetailsOf(vFolderItem, 34) + '.lnk';
    UnpinShellLink(vPinnedShortcutFileName);
  end;
end;

Укажите вместо «Program.exe» имя Вашего «MyProg.exe». У меня под Windows 7 работает. Под более новыми версиями, полагаю, могут быть проблемы из-за номера свойства Проводника «Описание файла» (или отсутствия описания).

P.S. По-хорошему, надо попробовать закреплять не сам исполняемый файл из %ProgramFiles%, а ярлык на него, созданный в Главном меню в процессе инсталляции (уже со всеми потребными параметрами).
Это сообщение посчитали полезным следующие участники:

Отправлено: 00:54, 11-04-2016 | #54


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Ну, вот, попробовал:
Скрытый текст
Код: Выделить весь код
//the function is work well on Unicode Inno Setup, 
//if Non Unicode Inno Setup, one need to modify,
//and I think you can do it!
//Inno use Win32 API
const
  // these constants are not defined in Windows
  SHELL32_STRING_ID_PIN_TO_TASKBAR = 5386;
  SHELL32_STRING_ID_PIN_TO_STARTMENU = 5381;
  SHELL32_STRING_ID_UNPIN_FROM_TASKBAR = 5387;
  SHELL32_STRING_ID_UNPIN_FROM_STARTMENU = 5382;

  sFileName = 'ShortcutName.lnk';

#ifdef UNICODE
    #define A "W"
#else
    #define A "A"
#endif
function LoadLibrary(lpFilename : String) : LongInt;
external 'LoadLibrary{#A}@kernel32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadLibraryA
function FreeLibrary(hModule : LongInt) : BOOL;
external 'FreeLibrary@kernel32.dll stdcall delayload';
function LoadString(hInstance:LongInt; uId:UINT; lpBuffer:String; nBufferMax:Integer) : Integer;
external 'LoadString{#A}@user32.dll stdcall delayload';  //if Non Unicode Inno Setup, use LoadStringA

//here is the function
//@param strPath The App's directory,
//@param strApp The App's name
//@example zylPinAppToTaskbar('c:\window', 'notepad.exe');
procedure zylPinAppToTaskbar(strPath, strApp: string);  
var  
  vShell, vFolder, vFolderItem, vItemVerbs: Variant;  
  vPath, vApp: Variant;  
  i: Integer;  
  sItem: String;   
  h: LongInt; 
  szPinName: String; 
  filenameEnd : Integer;
  filename    : String; 
  strEnd    : String;
begin 
  SetLength(szPinName, 255); 
  h := LoadLibrary(ExpandConstant('{sys}\Shell32.dll'));  
  LoadString(h, SHELL32_STRING_ID_PIN_TO_TASKBAR, szPinName, 255); //pin to taskbar text 
  FreeLibrary(h);  
  strEnd := #0;
  filenameEnd := Pos(strEnd, szPinName);
  filename := Copy(szPinName, 1, filenameEnd - 1);
  if (Length(filename) > 0) then  //WinXp or lower, no pin taskbar function
  begin
    vShell := CreateOleObject('Shell.Application');  
    vPath := strPath;  
    vFolder := vShell.NameSpace(vPath);  
    vApp := strApp;  
    vFolderItem := vFolder.ParseName(vApp);  
    vItemVerbs := vFolderItem.Verbs;  
    for i := 1 to vItemVerbs.Count do  
    begin  
      sItem := vItemVerbs.Item(i).Name;
      if (sItem = filename) then
      begin
        // 63 63 72 75 6E 2E 63 6F 6D  
        vItemVerbs.Item(i).DoIt;
        break; 
      end; 
    end;
  end;
end;  

//You can use zylPinAppToTaskbar like this
procedure CurPageChanged(CurPageID: Integer);
begin
  //When Finished page is shown, call the function
  //You can also call is when the "Finish" button clicked.
  if  CurPageID = wpFinished then  
  begin
  if IsTaskSelected('pintaskbar') then
    zylPinAppToTaskbar(ExpandConstant('{group}'), sFileName);
  end;
end;

procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  vShell, vFolder: Variant;  
  vPinnedShortcutFileName: Variant;
begin
  if CurUninstallStep = usUninstall then  
  begin
    vShell := CreateOleObject('Shell.Application');  
    vFolder := vShell.NameSpace(ExpandConstant('{app}'));  
    vPinnedShortcutFileName := vShell.NameSpace('shell:User Pinned').self.Path + '\TaskBar\' + sFileName;
    UnpinShellLink(vPinnedShortcutFileName);
  end;
end;

«ShortcutName» — имя ярлыка, создаваемого в разделе ярлыков [Icons] скрипта инсталляции с параметром «/Rem», наподобие:
Код: Выделить весь код
Name: "{group}\ShortcutName"; Filename: "{app}\Program.exe"; WorkingDir: "{app}"; IconFilename: "{app}\Program.exe"; Parameters: "/Rem"
Это сообщение посчитали полезным следующие участники:

Отправлено: 06:40, 11-04-2016 | #55


Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262

Профиль | Отправить PM | Цитировать


Iska, не могу скомпилировать, неизвестный идентификатор UnpinShellLink. Чему он должен быть равен?
У меня китайская расширенная версия компилятора.

-------
Inno Setup 5 Ultra Unicode


Отправлено: 14:10, 11-04-2016 | #56


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Цитата Dodakaedr:
Iska, не могу скомпилировать, неизвестный идентификатор UnpinShellLink. Чему он должен быть равен? »
Это стандартная функция:
Цитата:
Pascal Scripting: UnpinShellLink

Prototype:
function UnpinShellLink(const Filename: String): Boolean;

Description:
Attempt to unpin the shortcut with the specified filename. Returns True if the shortcut was successfully removed from the list of pinned items and/or the taskbar, or if the shortcut was not pinned at all.
В принципе, для UnPin'а можно было бы написать свою, по аналогии с процедурой zylPinAppToTaskbar(), но зачем?!

Цитата Dodakaedr:
У меня китайская расширенная версия компилятора. »
Возьмите последнюю официальную.

Отправлено: 14:24, 11-04-2016 | #57


Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262

Профиль | Отправить PM | Цитировать


Цитата Iska:
В принципе, для UnPin'а можно было бы написать свою, по аналогии с процедурой zylPinAppToTaskbar(), но зачем?! »
в моем случаи очень бы пригодилось.
Цитата Iska:
Возьмите последнюю официальную. »
не вариант, у меня используется много других функций, которые не работают на официальной версии.

-------
Inno Setup 5 Ultra Unicode


Отправлено: 14:38, 11-04-2016 | #58


Ветеран


Сообщения: 27449
Благодарности: 8087

Профиль | Отправить PM | Цитировать


Dodakaedr, тогда берите последний код — и с ним сюда: Скрипты Inno Setup. Помощь и советы [часть 8]. Кто-нибудь да сделает, там делов не на много. В качестве параметров для планируемой функции UnPin() должны передаваться те же параметры путь/имя на исходный ярлык в Главном меню (а не на сам прикреплённый ярлык).

Отправлено: 18:15, 11-04-2016 | #59


Аватара для Dodakaedr

Ветеран


Сообщения: 863
Благодарности: 262

Профиль | Отправить PM | Цитировать


Iska, если брать сам ярлык, то можно воспользоватся и vbs скриптом, проверил работает, только для "полного счастья" нужен обратный код, то есть открепления...

-------
Inno Setup 5 Ultra Unicode


Отправлено: 15:25, 12-04-2016 | #60



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - [решено] Создание ярлыка с помощью VBS

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
VBS/WSH/JS - [решено] Скрипт vbs для создания ярлыка на рабочем столе angel_lyucifer Скриптовые языки администрирования Windows 31 27-11-2017 14:26
CMD/BAT - [решено] Создание с помощью bat ярлыка в SendTo intelem Скриптовые языки администрирования Windows 4 24-12-2011 19:59
CMD/BAT - [решено] Возможно ли в свойствах ярлыка поменять размер шрифта посредством cmd/vbs? Anton04 Скриптовые языки администрирования Windows 20 06-09-2011 16:53
VBS/WSH/JS - [решено] Автоматическое создание папок из полей таблицы c помощью VBS NecroTYN Скриптовые языки администрирования Windows 58 14-07-2011 20:13
Обои и Значки - Возможно позиционирование окна с помощью ярлыка? KupC Оформление Windows XP 1 03-05-2011 14:11




 
Переход