Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Создание ярлыка с помощью VBS (http://forum.oszone.net/showthread.php?t=276798)

Dodakaedr 30-01-2014 23:29 2299573

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

omegastripes 31-01-2014 00:07 2299585

Код:

If WScript.Arguments.Count <> 1 Then
        MsgBox "Drag'n'drop exe file to pin to taskbar", , "Pin to Taskbar"
        WScript.Quit
End If

strPath = WScript.Arguments(0)
Set objShell = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))

If objFolderItem Is Nothing Then
        MsgBox strPath & vbCrLf & "not found", , "Pin to Taskbar"
        WScript.Quit
End If

Set colVerbs = objFolderItem.Verbs

bPinned = False
For Each objVerb In colVerbs
        VerbName = Replace(objVerb.Name, "&", "")
        If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
                objVerb.DoIt
                bPinned = True
                Exit For
        End If
Next

If bPinned Then
        Msgbox strPath & vbCrLf & "successfully pinned to taskbar"
Else
        Msgbox strPath & vbCrLf & "pin error"
End If


Dodakaedr 31-01-2014 19:46 2300125

Где прописывать путь к файлу? Как убрать диалоговое окно?

Dodakaedr 31-01-2014 20:29 2300163

Мне нужно для инсталяции программы. А именно в Smart Install Maker

Iska 31-01-2014 20:54 2300188

Цитата:

Цитата Dodakaedr
Где прописывать путь к файлу? »

Параметром скрипта.

Цитата:

Цитата Dodakaedr
Как убрать диалоговое окно? »

Укажете параметр — окна не будет.

Цитата:

Цитата Dodakaedr
Мне нужно для инсталяции программы. А именно в Smart Install Maker »

Без разницы. Хоть для WiX.

Dodakaedr 31-01-2014 22:11 2300233

Цитата:

Цитата Iska
Параметром скрипта. »

каким параметром?
Цитата:

Цитата Iska
Укажете параметр — окна не будет. »

какой параметр?

Я в этом не разбираюсь.

Iska 31-01-2014 23:05 2300273

Цитата:

Цитата Dodakaedr
каким параметром? »

Первым и единственным.

Вы сохранили вышеприведённый код в файл «Путь\Имя скрипта.vbs». Запустите скрипт с указанием параметра, например:
Код:

wscript.exe "Путь\Имя скрипта.vbs" "C:\WINDOWS\system32\notepad.exe"
В Вашем случае:
Цитата:

Цитата Dodakaedr
Мне нужно для инсталяции программы. А именно в Smart Install Maker »

Вы должны вместо «Путь\Имя скрипта.vbs» указать конкретный путь, куда у Вас будет извлечён этот скрипт, а вместо «C:\WINDOWS\system32\notepad.exe» — полный путь к исполняемому файлу, который Вы проинсталлируете.

Dodakaedr 01-02-2014 13:09 2300517

Цитата:

Цитата Iska
Вы сохранили вышеприведённый код в файл «Путь\Имя скрипта.vbs». Запустите скрипт с указанием параметра, например:
Код:
wscript.exe "Путь\Имя скрипта.vbs" "C:\WINDOWS\system32\notepad.exe" »

а как насчет окна которое выскакивает? Как его убрать?

Dodakaedr 01-02-2014 13:18 2300524

Вот сделал как ты описал, но ничего так и не получилось. Выскочило окошко Drag'n'drop exe file to pin to taskbar и все((

Iska 01-02-2014 14:15 2300557

Цитата:

Цитата Dodakaedr
Вот сделал как ты описал, »

Вы сделали по-своему. Но неправильно.

У меня нет BitTorrent, посему в его качестве выступал Dropbox:

Используйте переменные вместо непосредственного написания путей.

Dodakaedr 01-02-2014 14:41 2300571

Цитата:

Цитата Iska
Используйте переменные »

Спасибо!!! Все заработало))))

Iska 01-02-2014 15:13 2300591

Dodakaedr, успехов! А я пойду удалять [«зачем мне пирамидон?!» ;)] свежеустановленный «Smart Install Maker».

Dodakaedr 04-02-2014 17:45 2302644



Iska, что я делаю не так?

omegastripes 04-02-2014 19:16 2302692

Цитата:

Цитата Dodakaedr
что я делаю не так? »

Добавил в код во 2 посте проверку на наличие файла. Вероятно, это поможет разобраться.

Dodakaedr 04-02-2014 19:32 2302702

omegastripes, ничего не понял...

omegastripes 04-02-2014 19:46 2302708

Цитата:

Цитата Dodakaedr
ничего не понял... »

Dodakaedr, "Ошибка: Требуется объект: 'objFolderItem'" возникала в случае, когда указываемого вами в строке "Параметры" файла не существовало. Но теперь, после доработки, скрипт проверяет его наличие, и выдает информацию какой файл не удалось найти. Вместо приведенной на скриншоте строки "%InstallPath%\IceTorrent.exe" он покажет путь к файлу, если его не удастся найти. Именно это, вероятно, поможет разобраться.

Dodakaedr 04-02-2014 20:14 2302721

Цитата:

Цитата omegastripes
"Ошибка: Требуется объект: 'objFolderItem'" возникала в случае, когда »

ага, сейчас попробую...

Dodakaedr 04-02-2014 20:37 2302735

omegastripes, не помогло, просто выскакивает "Drag'n'drop exe file to pin to taskbar" и все....

omegastripes 04-02-2014 20:44 2302739

Цитата:

Цитата Dodakaedr
выскакивает "Drag'n'drop exe file to pin to taskbar" »

Это означает, что скрипту не передан в параметре путь к файлу, который нужно закрепить в панели. Что у вас в строке "Параметры"? По всей видимости, придется выложить еще один скриншот...

Dodakaedr 04-02-2014 20:46 2302743

так работает

а так нет

судя по всему скрипт не понимает переменную %InstallPatch%, если это так, можно как нибудь это исправить аналогичной командой которую понимает скрипт???



И "%ProgramFiles%\IceTorrent\IceTorrent.exe" пробовал, выдает ошибку.

omegastripes 04-02-2014 21:41 2302780

Цитата:

Цитата Dodakaedr
судя по всему скрипт не понимает переменную %InstallPatch% »

Дело в том, что скрипту в качестве параметра не передаются переменные окружения вида "%name%". Сперва программа преобразует эти переменные в конкретные пути, только после этого вызывает указанный скрипт, и передает ему в параметре преобразованные пути.

Цитата:

Цитата Iska
А именно в Smart Install Maker »

Поскольку в данном случае этой программой является Smart Install Maker, с ним и нужно разбираться. Но этот софт я знаю только поверхностно, и не готов дать дельный совет.

Если начать копать, можно для дебага заменить скрипт "заглушкой", которая будет просто показывать что за параметр передала скрипту программа. Для этого подойдет такой скрипт:
Код:

args = ""
for each arg in wscript.arguments
        args = args & arg & vbcrlf & vbcrlf
next
if args = "" then args = "аргументы не переданы скрипту"
msgbox args, , "wscript.arguments"


Iska 05-02-2014 01:46 2302909

Цитата:

Цитата Dodakaedr
Iska, что я делаю не так? »

Для начала попробуйте обрамить пути, указанные в «Команда:» и «Параметры:» в кавычки, как это было указано в моём примере. По результату отпишитесь.

Покажите, куда у Вас происходит установка «IceTorrent.exe» по факту.

Dodakaedr 05-02-2014 13:11 2303154

Цитата:

Цитата Iska
Покажите, куда у Вас происходит установка «IceTorrent.exe» по факту. »

По умолчанию в C:\Program Files\IceTorrent\IceTorrent.exe, но вообще используется переменная "%InstallPatch%" тоисть по выбору пользователя.

Цитата:

Цитата Iska
Для начала попробуйте обрамить пути, указанные в «Команда:» и «Параметры:» »

Действительно, взял «команду» в кавычки скрипт заработал. Спасибо!

Как теперь добавить диалоговое окно с текстом "Закрепить ярлык в панели задач", "Да" - создается, "Нет" - выход. Какой код нужно вставить? Чтобы этот диалог обязательно появлялся.

Iska 05-02-2014 13:37 2303186

Цитата:

Цитата Dodakaedr
используется переменная "%InstallPatch%" »

Коллега, Вы в третий раз вставляете лишнюю букву в словосочетание: «%InstallPatch%».


Цитата:

Цитата Dodakaedr
Как теперь добавить диалоговое окно с текстом "Закрепить ярлык в панели задач", "Да" - создается, "Нет" - выход. Какой код нужно вставить? Чтобы этот диалог обязательно появлялся. »

Запрашивайте посредством MsgBox() и анализируйте ответ в If … Then.

А самым правильным будет перейти на использование бесплатных InnoSetup или NSIS, и реализовать сие непосредственно в самом инсталляторе.

Dodakaedr 05-02-2014 13:57 2303205

Цитата:

Цитата Iska
А самым правильным будет перейти на использование бесплатных InnoSetup или NSIS, и реализовать сие непосредственно в самом инсталляторе. »

Смотрел я эти программы там в основном скрипты, а я в них не особо знаюсь и к тому же я просто привык к smart install maker

Цитата:

Цитата Iska
Запрашивайте посредством MsgBox() и анализируйте ответ в If … Then. »

Как правильно это оформить?



Как добавить да и нет?

Iska 05-02-2014 14:20 2303225

Цитата:

Цитата Dodakaedr
Смотрел я эти программы там в основном скрипты, а я в них не особо знаюсь и к тому же я просто привык к smart install maker »

«Найдите десять отличий» ;):



Цитата:

Цитата Dodakaedr
Как добавить да и нет? »

Код:

'…
strPath = WScript.Arguments(0)
'…
If MsgBox("Закрепить ярлык на [" & strPath & "] на Панели задач?", vbYesNo + vbInformation, "Закрепление ярлыка на Панели задач") = vbYes Then
        ' Здесь код
End If


Dodakaedr 05-02-2014 14:40 2303242

Цитата:

Цитата Iska
'… »

Ничего не получается, ошибки выдает

Dodakaedr 05-02-2014 15:53 2303308

Все разобрался.
Это если при выборе "Да" а при "Нет" как? Потому что при выборе "Нет" выскакивает ошибка...
Все и в этом разобрался командой Elseif)))

Iska 05-02-2014 17:13 2303350

Цитата:

Цитата Dodakaedr
Все и в этом разобрался командой Elseif))) »

Вам вообще не нужна ветвь «else».

Dodakaedr 06-02-2014 22:06 2304341

Цитата:

Цитата Iska
Вам вообще не нужна ветвь «else». »

Почему? Именно с ней и заработал скрипт, без нее ошибки выскакивали.

А можно создать такой скрипт который после установки программы автоматов будет ассоциировать поддерживаемые форматы? А то вручную долго прописывать???

Iska 06-02-2014 22:18 2304349

Цитата:

Цитата Dodakaedr
Почему? »

Потому что не нужна.

Цитата:

Цитата Dodakaedr
Именно с ней и заработал скрипт, без нее ошибки выскакивали. »

Если приведёте Ваш код — посмотрим.

Цитата:

Цитата Dodakaedr
А можно создать такой скрипт который после установки программы автоматов будет ассоциировать поддерживаемые форматы? »

Можно. Но есть два но: 1) кто будет убирать сделанную ассоциацию и восстанавливать предыдущую и 2) ассоциация ассоциации рознь — ассоциации строятся не по одному и тому же сценарию. Надо рассматривать каждый конкретный случай.

Цитата:

Цитата Dodakaedr
А то вручную долго прописывать??? »

Да ну? Например?

Dodakaedr 06-02-2014 23:17 2304401

Цитата:

Если приведёте Ваш код — посмотрим.
Код:

If WScript.Arguments.Count <> 1 Then
        MsgBox "Drag'n'drop exe file to pin to taskbar", , "Pin to Taskbar"
        WScript.Quit
End If
        a=MsgBox("Закрепить ярлык на Панели задач?", vbYesNo + vbInformation, "ххх")
        If a = 6 Then
strPath = WScript.Arguments(0)
Set objShell = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))
        ElseIf a = 7 Then
        WScript.Quit
        End If
If objFolderItem Is Nothing Then
        MsgBox strPath & vbCrLf & "not found", , "Pin to Taskbar"
        WScript.Quit
End If

Set colVerbs = objFolderItem.Verbs

bPinned = False
For Each objVerb In colVerbs
        VerbName = Replace(objVerb.Name, "&", "")
        If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
                objVerb.DoIt
                bPinned = True
                Exit For
        End If
       
Next
       
If bPinned Then
        Msgbox "Ярлык закреплен", vbOKOnly + vbInformation, "ххх"
Else
        Msgbox "Ошибка", vbOKOnly + vbCritical, "ххх"
End If

Цитата:

Да ну? Например?

Iska 06-02-2014 23:31 2304418

Dodakaedr, я как не по-русски написал:
Цитата:

Код:

'…
strPath = WScript.Arguments(0)
'…
If MsgBox("Закрепить ярлык на [" & strPath & "] на Панели задач?", vbYesNo + vbInformation, "Закрепление ярлыка на Панели задач") = vbYes Then
        ' Здесь код
End If


?!

Вот всё, что требовалось сделать:
Код:

If WScript.Arguments.Count <> 1 Then
        MsgBox "Drag'n'drop exe file to pin to taskbar", , "Pin to Taskbar"
        WScript.Quit
End If

strPath = WScript.Arguments(0)

If MsgBox("Закрепить ярлык на [" & strPath & "] на Панели задач?", vbYesNo + vbInformation, "Закрепление ярлыка на Панели задач") = vbYes Then
        Set objShell = CreateObject("Shell.Application")
        Set objFSO = CreateObject("Scripting.FileSystemObject")
       
        Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
        Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))
       
        If objFolderItem Is Nothing Then
                MsgBox strPath & vbCrLf & "not found", , "Pin to Taskbar"
                WScript.Quit
        End If
       
        Set colVerbs = objFolderItem.Verbs
       
        bPinned = False
        For Each objVerb In colVerbs
                VerbName = Replace(objVerb.Name, "&", "")
                If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
                        objVerb.DoIt
                        bPinned = True
                        Exit For
                End If
               
        Next
               
        If bPinned Then
                Msgbox "Ярлык закреплен", vbOKOnly + vbInformation, "ххх"
        Else
                Msgbox "Ошибка", vbOKOnly + vbCritical, "ххх"
        End If
End If

Цитата:

Цитата Dodakaedr

Коллега, «По-моему вы слишком много кушать» ;).

omegastripes 06-02-2014 23:49 2304447

Цитата:

Цитата Dodakaedr
А можно создать такой скрипт который после установки программы автоматов будет ассоциировать поддерживаемые форматы? А то вручную долго прописывать??? »

Для этих целей не лишена смысла идея посмотреть в сторону *.reg файлов.
Кстати, исходные ассоциации можно бы забэкапить в эти файлы, но это попахивает извращением: поскольку как такового процесса деинсталляции нет,- пользователю придется самому запускать *.reg для восстановления ассоциаций; плюс ко всему, будут восстановлены ассоциации неизвестно какой давности, с момента создания бэкапа пользователь мог их неоднократно изменить.

Dodakaedr 07-02-2014 16:31 2304898

Цитата:

Цитата Iska
я как не по-русски написал: »

Но при выборе "Нет" выскакивала ошибка!

Iska 07-02-2014 17:16 2304926

Цитата:

Цитата Dodakaedr
Но при выборе "Нет" выскакивала ошибка! »

Потому что Вы неверным образом составили код. По приведённому примеру теперь понятно, как следовало сие сделать?

Dodakaedr 07-02-2014 17:48 2304949

Цитата:

Цитата Iska
Потому что Вы неверным образом составили код. По приведённому примеру теперь понятно, как следовало сие сделать? »

Действительно все работает норм, а у меня не получалось...Спасибо!!!

Dodakaedr 12-02-2014 16:34 2307915

Iska, Как теперь написать этот код в язык LUA???

Iska 12-02-2014 18:11 2307965

Цитата:

Цитата Dodakaedr
Iska, Как теперь написать этот код в язык LUA??? »

Без понятия. Я LUA пока не трогал, жду пока третья версия Far Manager'а «устаканится», тогда и приступлю.

Dodakaedr 21-02-2014 01:48 2312772

omegastripes, Iska, а можете обратный код написать, чтобы извлекал ярлык с панели задач? Просто после удаления программы остается как-бы след ярлыка (но сам ярлык удаляется через стандартный uninstall).

omegastripes 22-02-2014 22:57 2313924

Цитата:

Цитата Dodakaedr
а можете обратный код написать, чтобы извлекал ярлык с панели задач? »

Код, собственно, можно использовать тот же, просто вместо строки
Код:

If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
поменять желаемое действие на "Открепить от":
Код:

If VerbName = "Открепить от панели задач" Then
Для моей версии Win7HB вышеуказанное название действия появляется в контекстном меню закрепленного на панели задач файла. Для других версий и языковых пакетов я, к сожалению, не подскажу. Естественно, если названия для тех версий не прописать, то скрипт в них не будет функционировать.

Dodakaedr 29-06-2014 15:43 2369840

Iska, Здравствуйте! Нужна Ваша помочь. Можете изменить скрипт чтобы он закреплял ярлык в меню пуск?
читать дальше »
Код:

If WScript.Arguments.Count <> 1 Then
        MsgBox "Drag'n'drop exe file to pin to taskbar", , "bla-bla"
        WScript.Quit
End If

strPath = WScript.Arguments(0)
Set objShell = CreateObject("Shell.Application")
Set objFSO = CreateObject("Scripting.FileSystemObject")

Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))

If objFolderItem Is Nothing Then
        MsgBox strPath & vbCrLf & "not found", , "bla-bla"
        WScript.Quit
End If

Set colVerbs = objFolderItem.Verbs

bPinned = False
For Each objVerb In colVerbs
        VerbName = Replace(objVerb.Name, "&", "")
        If VerbName = "Закрепить программу в панели задач" Or VerbName = "Закрепить на панели задач" Or VerbName = "Pin to Taskbar" Then
                objVerb.DoIt
                bPinned = True
                Exit For
        End If
Next


Dodakaedr 01-07-2014 21:52 2370840

Помогите кто-нибудь с предыдущим постом.

morozoff 01-07-2014 22:55 2370864

Dodakaedr, Посмотрите в этой теме. Там есть VBS-скрипты для закрепления на панели задач и закрепления в меню пуск.

Dodakaedr 02-07-2014 01:14 2370909

morozoff, тот пример не подходит, мне нужен как у меня только чтобы закреплял в меню "Пуск".

omegastripes 06-07-2014 01:20 2372574

Dodakaedr, вот, все аналогично первому скрипту, сохраняйте в виде файла .vbs:
Код:

If WScript.Arguments.Count <> 1 Then
        MsgBox "Перетащите файл, чтобы закрепить его в меню ""Пуск""", , "Закрепление ярлыка в меню ""Пуск"""
        WScript.Quit
End If

strPath = WScript.Arguments(0)

If MsgBox("Закрепить ярлык на [" & strPath & "] в меню ""Пуск""?", vbYesNo + vbInformation, "Закрепление ярлыка в меню ""Пуск""") = vbYes Then
        Set objShell = CreateObject("Shell.Application")
        Set objFSO = CreateObject("Scripting.FileSystemObject")
       
        Set objFolder = objShell.NameSpace(objFSO.GetParentFolderName(strPath))
        Set objFolderItem = objFolder.ParseName(objFSO.GetFileName(strPath))
       
        If objFolderItem Is Nothing Then
                MsgBox strPath & vbCrLf & "Файл не найден", , "Закрепление ярлыка в меню ""Пуск"""
                WScript.Quit
        End If
       
        Set colVerbs = objFolderItem.Verbs
       
        bPinned = False
        For Each objVerb In colVerbs
                VerbName = Replace(objVerb.Name, "&", "")
                If VerbName = "Закрепить в меню ""Пуск""" Or VerbName = "Pin to Start Menu" Then
                        objVerb.DoIt
                        bPinned = True
                        Exit For
                End If
               
        Next
               
        If bPinned Then
                Msgbox "Ярлык закреплен", vbOKOnly + vbInformation, "Закрепление ярлыка в меню ""Пуск"""
        Else
                Msgbox "Ошибка закрепления ярлыка", vbOKOnly + vbCritical, "Закрепление ярлыка в меню ""Пуск"""
        End If
End If

Предвосхищая следующий вопрос - "Как убрать ярлык из меню Пуск?", отвечу: в тексте скрипта выше нужно заменить вот эту строку:
Код:

If VerbName = "Закрепить в меню ""Пуск""" Or VerbName = "Pin to Start Menu" Then
на строку
Код:

If VerbName = "Изъять из меню ""Пуск""" Or VerbName = "Unpin from Start Menu" Then
Ну и по тексту посмотреть - где было "...закрепить..." - заменить на "...изъять...".

P.S.: Напомню, что в зависимости от локализации эти скрипты могут легко Вас подвести. Пока что учтены имена действий только на русском и английском. В идеале нужно бы найти некий системный ресурс, который для всех языковых пакетов находился бы в одном и том же месте, и по определенному индексу из него можно было бы извлечь нужное название действия именно для текущей локализации.

Dodakaedr 06-07-2014 19:36 2372808

omegastripes, Огромное Спасибо!

Dodakaedr 09-04-2016 20:12 2624736

Подскажите, пожалуйста, как нужно указать файл с параметром, например такой:
Код:

MyProg.exe /Rem
чтобы ярлык закреплялся с параметром запуска программы.
Пробовал по разному не работает.
Код:

[run]
Filename: "{tmp}\1.vbs"; Parameters: """{app}\MyProg.exe /Rem"""; Flags: shellexec waituntilterminated;

Код:

[run]
Filename: "{tmp}\1.vbs"; Parameters: """{app}\MyProg.exe"" /Rem"; Flags: shellexec waituntilterminated;


Iska 09-04-2016 21:26 2624745

Dodakaedr, это что? Скрипт установки InnoSetup?

Dodakaedr 09-04-2016 21:43 2624748

Iska, да

Dodakaedr 10-04-2016 20:11 2624944

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

Iska 10-04-2016 20:55 2624955

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

Dodakaedr 10-04-2016 20:59 2624957

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

Iska 11-04-2016 00:54 2624985

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%, а ярлык на него, созданный в Главном меню в процессе инсталляции (уже со всеми потребными параметрами).

Iska 11-04-2016 06:40 2625000

Ну, вот, попробовал:
Скрытый текст
Код:

//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"

Dodakaedr 11-04-2016 14:10 2625123

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

Iska 11-04-2016 14:24 2625125

Цитата:

Цитата 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
У меня китайская расширенная версия компилятора. »

Возьмите последнюю официальную.

Dodakaedr 11-04-2016 14:38 2625127

Цитата:

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

в моем случаи очень бы пригодилось.
Цитата:

Цитата Iska
Возьмите последнюю официальную. »

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

Iska 11-04-2016 18:15 2625197

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

Dodakaedr 12-04-2016 15:25 2625424

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

Iska 12-04-2016 15:52 2625437

Цитата:

Цитата Dodakaedr
только для "полного счастья" нужен обратный код, то есть открепления... »

См. выше.

Dodakaedr 12-04-2016 15:54 2625438

Iska, я уже пролистал, теперь пытаюсь под себя сделать скрипт. Спасибо!


Время: 20:06.

Время: 20:06.
© OSzone.net 2001-