#include-once
; #FUNCTION# ;=================================================================================
; Function Name ...: _StartUp
; Description ........: Add or delete a startup
; Syntax................: _StartUp ( [$flag = 0 [, $sName = '' [, $sPathRun = '' [, $sArgs = '' [, $sDesc = '' [, $sIcon = '' [, $iIconNum = 0 [, $state = 0]]]]]]]] )
; Parameters:
;		$flag - Specifies the startup option. Can be a combination of the following values:
;                  |1 - The registry, otherwise shortcut
;                  |2 - For all users, otherwise for the current user
;                  |4 - The one-time run (RunOnce), otherwise each time (registry)
;                  |8 - The one-time run (RunOnceEx), otherwise each time (registry)
;                  |16 - Do not overwrite
;                  |32 - To remove (Requires flags, with which the object was created and $sName, the rest are ignored.)
;		$sName - Name of the registry key or shortcut. By default, the name of the current script
;		$sPathRun - Path of the file, by default the full path to the current script
;		$sArgs - Command-line options, by default "" - empty string
;		$sDesc - File Description (is ignored for the registry)
;		$sIcon - Full Path/File name of icon to use. (is ignored for the registry)
;		$iIconNum - The icon instance to use (usually 0)
;		$state - The state the shortcut is launched in
; Return values ....: Success - 1
;					Failure - 0. Errors are the same as in the RegWrite, RegDelete. @error = 4 when the flag "do not overwrite"
; Author(s) ..........: AZJIO
; Remarks ..........: Flags 4 and 8 can not be specified together. Options, ranging from $sDesc to $state are only used for the shortcut
; ============================================================================================
; Имя функции ...: _StartUp
; Описание ........: Добавляет или удаляет исполняемый файл в автозагрузку
; Синтаксис.......: _StartUp ( [$flag = 0 [, $sName = '' [, $sPathRun = '' [, $sArgs = '' [, $sDesc = '' [, $sIcon = '' [, $iIconNum = 0 [, $state = 0]]]]]]]] )
; Параметры:
;		$flag - Указывает вариант автозагрузки. Может быть комбинацией следующих значений:
;                  |1 - Реестр, иначе ярлык
;                  |2 - Для всех пользователей, иначе для текущего
;                  |4 - Одноразовый запуск (RunOnce), иначе при каждой загрузке (только для реестра)
;                  |8 - Одноразовый запуск (RunOnceEx), иначе при каждой загрузке (только для реестра)
;                  |16 - Не перезаписывать
;                  |32 - Удалить (Требует флаги, с которыми был создан элемент автозагрузки и параметр $sName, остальные игнорирует)
;		$sName - Имя параметра реестра или ярлыка. По умолчанию "" пустая строка, что означает имя текущего скрипта
;		$sPathRun - Путь к запускаемому файлу. По умолчанию "" пустая строка, что означает полный путь к текущему скрипту
;		$sArgs - Параметры запуска, по умолчанию "" - пустая строка
;		$sDesc - Описание, отображается во всплывающей подсказке (только ярлыку)
;		$sIcon - Имя или путь к файлу с иконкой (ico, dll, exe и др.). (только ярлыку)
;		$iIconNum - Номер иконки для использования (только ярлыку)
;		$state - Состояние окна при запуске
; Возвращаемое значение: Успешно - 1
;					Неудачно - 0. При добавлении/удалении в реестре ошибки повторяют значения ошибок соответствующих функций. Дополнительно @error = 4, если не удалось перезаписать ярлык или параметр в реестре при использовании флага "не перезаписывать"
; Автор ..........: AZJIO
; Примечания ..: Флаг удаления ставится с той же комбинацией флагов, что и создавался, иначе не сработает. Параметры, начиная с $sDesc заканчивая $state используются только для ярлыка, но и для него в большинстве случаев они является излишними. Флаги 4 и 8 не указывается вместе. Отличие RunOnceEx в том, что команды из этого раздела выполняются последовательно в порядке сортировки имён параметров, а также каждый следующий запуск ждёт окончания предыдущего.
; ============================================================================================
Func _StartUp($flag = 0, $sName = '', $sPathRun = '', $sArgs = '', $sDesc = '', $sIcon = '', $iIconNum = 0, $state = @SW_SHOWNORMAL)
	If Not $sPathRun Then $sPathRun = @ScriptFullPath
	If Not $sName Then
		$sName = @ScriptName
		Local $iPos = StringInStr($sName, '.', 1, -1)
		If $iPos Then $sName = StringLeft($sName, $iPos - 1)
	EndIf
	If BitAND($flag, 1) Then
		Local $sKeyName
		If BitAND($flag, 2) Then
			$sKeyName = 'HKLM'
		Else
			$sKeyName = 'HKCU'
		EndIf
		If @OSArch = 'X64' Then $sKeyName &= '64'
		$sKeyName &= '\Software\Microsoft\Windows\CurrentVersion\Run'
		If BitAND($flag, 4) Then
			$sKeyName &= 'Once'
		ElseIf BitAND($flag, 8) Then
			$sKeyName &= 'OnceEx'
		EndIf
		If BitAND($flag, 32) Then Return RegDelete($sKeyName, $sName)
		RegRead($sKeyName, $sName)
		If Not @error And BitAND($flag, 16) Then Return SetError(4, 0, 0)
		If $sArgs Then $sArgs = ' ' & $sArgs
		Local $iRes = RegWrite($sKeyName, $sName, "REG_SZ", '"' & $sPathRun & '"' & $sArgs)
		Return SetError(@error, 0, $iRes)
	Else
		Local $sPathLnk
		If BitAND($flag, 2) Then
			$sPathLnk = @StartupCommonDir & '\' & $sName & '.lnk'
		Else
			$sPathLnk = @StartupDir & '\' & $sName & '.lnk'
		EndIf
		If BitAND($flag, 32) Then Return FileDelete($sPathLnk)
		If BitAND($flag, 16) And FileExists($sPathLnk) Then Return SetError(4, 0, 0)
		Return FileCreateShortcut($sPathRun, $sPathLnk, '', $sArgs, $sDesc, $sIcon, '', $iIconNum, $state)
	EndIf
EndFunc   ;==>_StartUp