Описание функции


CreateLink

Создаёт ярлык

CreateLink(Path$, Link$, Argument$, Description$, WorkingDirectory$, ShowCommand.l, HotKey.l, IconFile$, IconIndexInFile.l)

Параметры

Path$ Путь к программе, для которой создаётся ярлык (exe-файл)
Link$ Полный путь к ярлыку, который будет создан.
Argument$ Параметры передаваемые exe-файлу при запуске.
Description$ Описание ярлыка, выводится при наведении курсора на ярлык.
WorkingDirectory$ Рабочая папка, если не указана, то обычно папка программы.
ShowCommand Флаг состояния окна запускаемой программы:
    1 - #SW_SHOWNORMAL - нормальная, по умолчанию
    2 - #SW_SHOWMINIMIZED - свёрнутая
    3 - #SW_SHOWMAXIMIZED - развёрнутая на весь экран
HotKey Горячая клавиша. Обычно действует при создании ярлыка, а после перезагрузки не работает. Возможно работает при активном рабочем столе.
IconFile$ Путь к иконке ярлыка (ico, dll). Для путей перечисленных в %Path% путь указывать не обязательно, например "Shell32.dll"
IconIndexInFile Номер иконки по счёту, если это пакетный файл, например для "Shell32.dll", не для "ico", для "ico" это 0. Попробуйте отрицательные значения, чтобы указать номер ресурса иконки, например значок ini-файла "-151" по счёту "69".

Пример

; Fred
; https://www.purebasic.fr/english/viewtopic.php?p=61476#p61476

EnableExplicit

Procedure CreateLink(PATH$, LINK$, Argument$, DESCRIPTION$, WorkingDirectory$, ShowCommand.l, HotKey.l, IconFile$, IconIndexInFile.l)
    Protected result = 0, hres
    Protected ShellLink.IShellLinkA
    Protected PersistFile.IPersistFile
    result = 0
    CoInitialize_(0)
    If CoCreateInstance_(?CLSID_ShellLink, 0, 1, ?IID_IShellLink, @ShellLink.IShellLinkA) = 0
        ;
        ShellLink\SetPath(PATH$)
        ShellLink\SetArguments(Argument$)
        ShellLink\SetWorkingDirectory(WorkingDirectory$)
        ShellLink\SetDescription(DESCRIPTION$)
        ShellLink\SetShowCmd(ShowCommand)

        ; Горячие клавиши:
        ; Код виртуальной клавиши находится в младшем байте, а флаги-модификаторы — в старшем байте.
        ; Флаги модификаторов могут представлять собой комбинацию следующих значений:
        ;
        ; HOTKEYF_ALT = ALT key
        ; HOTKEYF_CONTROL = CTRL key
        ; HOTKEYF_EXT = Extended key
        ; HOTKEYF_SHIFT = SHIFT key
        ;
        ShellLink\SetHotkey(HotKey)
        ShellLink\SetIconLocation(IconFile$, IconIndexInFile)


        ;-ShellLink_SAVE:
        ; Запрос IShellLink Для интерфейса IPersistFile Для сохранения ярлыка в постоянном хранилище.
        If ShellLink\QueryInterface(?IID_IPersistFile, @PersistFile.IPersistFile) = 0
            ; Убедитесь, что строка имеет формат Unicode.
            ; Сохраните ссылку, вызвав IPersistFile::Save.
            ;hres = ppf->Save(wsz, TRUE);
            hres = PersistFile\SAVE(LINK$, #True)
            result = 1
            PersistFile\Release()
        EndIf
        ShellLink\Release()
    EndIf
    CoUninitialize_()
    ProcedureReturn result

    DataSection
        CLSID_ShellLink:
        ; 00021401-0000-0000-C000-000000000046
        Data.l $00021401
        Data.w $0000, $0000
        Data.b $C0, $00, $00, $00, $00, $00, $00, $46
        IID_IShellLink:
        ; DEFINE_SHLGUID(IID_IShellLinkA, 0x000214EEL, 0, 0);
        ; C000-000000000046
        Data.l $000214EE
        Data.w $0000, $0000
        Data.b $C0, $00, $00, $00, $00, $00, $00, $46
        IID_IPersistFile:
        ; 0000010b-0000-0000-C000-000000000046
        Data.l $0000010b
        Data.w $0000, $0000
        Data.b $C0, $00, $00, $00, $00, $00, $00, $46
    EndDataSection

EndProcedure

Define Path$, PathLnk$
Path$ = "C:\Windows\System32\charmap.exe"
PathLnk$ = GetUserDirectory(#PB_Directory_ProgramData) + "Microsoft\Windows\Start Menu\Programs\Startup\Test_charmap.lnk"
CreateLink(Path$, PathLnk$, "", "", "", #SW_SHOWNORMAL, 0, "Shell32.dll", -151) ; 69
RunProgram(GetPathPart(PathLnk$))