Что нового

НЕофициальный FAQ AutoIt

Статус
Закрыто для дальнейших ответов.

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Этот FAQ будет постепенно расти, по мере появления частых вопросов на форуме.

По любым предложениям/улучшениям/поправкам смело пишите мне в ЛС.

GUI и его элементы
1. Как избежать мерцание элементов GUI при их частом обновлений?
2. Как показать прокрутку только после того, когда текст выходит за рамки edit-поля?
3. Как сменить иконку у ListView Item?
4. Как правильно создавать дочерние окна?
5. Как правильно “запоминать” позицию GUI для последующих запусков?
6. Почему лучше использовать GUICtrl* вместо Control*?

Графика
1. Как получить размер изображения?

Автоматизация
1. Как учётной записи пользователя назначить административные права?
2. Как создать учётную запись пользователя с правами администратора?

Имитирование нажатия клавиш, Send, HotKeys
1. Почему не работает HotKeySet, или как обойти проблему с раскладкой клавиатуры при отправке сочетаний клавиш?

Общие принципы написания скриптов
1. Как эффективнее организовать операторы сравнения?
2. Почему лучше использовать BitOR для добавления значении констант (например в стилях GUI)?
3. Как предотвратить критические ошибки скрипта?
4. Как отловить критические ошибки скрипта?
5. Как сопоставить номер строки из ошибки скомпилированного скрипта с исходником?

Системный Tray
1. Как создать GUI по двойному нажатию на иконку в трее?

Разное
1. Как установить пароль на запуск скрипта?
2. Как запустить скрипт вместе с Windows?
3. Как передать данные из скрипта в скрипт (интеракция)?

Интернет и сеть
1. Как включить/выключить локальное сетевое подключение?
2. Как отправить GET-запрос?
3. Как отправить POST-запрос?
4. Как отправить имя и пароль для HTTP-аутентификации?
5. Как выполнить перенаправление по ссылке, и получить перенаправленную ссылку?

Файловая система
1. Как разделить/соединить файл?

Процессы, сервисы и работа с памятью
1. Как “заморозить/разморозить” процесс?

AutoIt-специфичное
1. Как заставить FileInstall работать с каталогами?
2. Как позволить запуск только одной копии программы?
3. Как добавить цифровую подпись в свои программы?
4. Как выполнить часть кода с повышением прав?
 
Последнее редактирование:
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как избежать мерцание элементов GUI при их частом обновлений?

Ответ:
Вариантов есть несколько...

1) Добавить в расширенные стили GUI (предпоследний параметр ExStyle) стиль $WS_EX_COMPOSITED (требует подключение WindowsConstants.au3).
Данный стиль не работает под Win 7, используйте GUIFFLabel.

2) Вместо GUICtrlSetData используйте _WinAPI_SetWindowText (требует подключение библиотеки WinAPI.au3). Также см. здесь несколько решении по теме.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Вопрос:
Как эффективнее организовать операторы сравнения?

Ответ:
Помимо того, что следуя справке, необходимо вместо нескольких операторов
Код:
If Statement1 Then
; Какие-то операции
EndIf
If Statement2 Then
; Какие-то операции
EndIf
...
If StatementN Then
; Какие-то операции
EndIf

использовать альтернативные условия, используя конструкцию
Код:
If Statement1 Then
; Какие-то операции
ElseIf Statement2 Then
; Какие-то операции
...
ElseIf StatementN Then
; Какие-то операции
EndIf

так же необходимо помнить о том, что интерпретатор выполняет полученные команды "сверху вниз", то есть "заходить" в "ветки" многоступенчатой условной конструкции интерпретатор будет начиная с самого верхнего и при достижения успеха выходить из всего "дерева" пропуская оставшиеся "ветки". Учитывая, что золотым правилом программирования всех времен и народов всегда было уменьшение времени выполнения кода, весьма целесообразным выглядит использование априорной информации о вероятности наступления условий в той или иной ветке многоступенчатой условной конструкции. К примеру, программист заранее знает, что числа кратные трем чередуются через два, то есть: 1 2 3 4 5 6 7 8 9, ..., 997 998 999. Представим ситуацию, когда программисту надо в цикле перебирать числа от 1 до 1000 и выполнять определенные действия в зависимости от делимости числа на 3: Если делится возводить в куб, если нет, то в квадрат. Можно предложить два способа организации такого алгоритма, проверять сначала на делимость и, соответственно, наоборот - на неделимость, и просто сравнить результаты.
Код:
$N = 1000000
; Проверка на делимость
$start = TimerInit()
For $i = 1 to $N
    If Mod($i, 3) = 0 Then
        $res = $i^3
    ElseIf Mod($i, 3) > 0
        $res = $i^2
    EndIf
Next
$elapsed1 = TimerDiff($start)

; Проверка на неделимость
$start = TimerInit()
For $i = 1 to $N
    If Mod($i, 3) > 0 Then
        $res = $i^2
    ElseIf Mod($i, 3) = 0
        $res = $i^3
    EndIf
Next
$elapsed2 = TimerDiff($start)
ConsoleWrite('Первый способ проверки показал время: ' & $elapsed1 & @CRLF & _
             'Второй способ проверки показал время: ' & $elapsed2 & @CRLF)

Как можно видеть, при втором способе время значительно ниже, так как в двух случаях из трех проверка завершится не перейдя во вторую ветвь, в то время, как в первом варианте цикл будет делать холостые проходы и только в одном случае из трех выходить из проверки после первой ветки. Математически это можно охарактеризовать как, мера частоты появления числа не делящегося на 3 выше этой самой меры для числа на 3 делящегося. Разница будет особенно заметной, где такие сравнения производятся в цикле из большого кол-ва итераций (как в примере выше). Исключения составляют только двухуровневые проверки (как в примере выше, но без постпроверки ElseIf) объединенные оператором Else, так как в последнем случае фактическая проверка не производится, т.к. считается, что если не выполнены все вышеперечисленные условия, то участок кода с Else и есть истина (спасибо AZJIO за поправку).
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Вопрос:
Как создать GUI по двойному нажатию на иконку в трее?

Ответ:
Код:
#include <Constants.au3>
#include <GUIConstantsEx.au3>

Opt('GUIOnEventMode', 1)
Opt('TrayOnEventMode', 1)
Opt('TrayMenuMode', 1)

; созание GUI окна
$hMainGUI = GUICreate('Main win')
GUISetOnEvent($GUI_EVENT_CLOSE, '_Exit')

; назначение отображения tray меню: 0 - не отображать
TraySetClick(0)
; назначение выполнения функции при двойном нажтии левой кнопкой мышки
TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, '_ShowGUI')

While 1
    Sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc

Func _ShowGUI()
    GUISetState(@SW_SHOW, $hMainGUI)
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как показать прокрутку только после того, когда текст выходит за рамки edit-поля?

Ответ:
Код:
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hMain = GUICreate('Scrollbars Test', 640, 480, -1, -1, -1, $WS_EX_COMPOSITED)
$nEdit = GUICtrlCreateEdit('', 10, 10, 620, 460, BitOR($ES_WANTRETURN, $ES_AUTOHSCROLL, $ES_AUTOVSCROLL))
$hEdit = GUICtrlGetHandle($nEdit)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd

Func WM_COMMAND($hWnd, $MsgID, $wParam, $lParam)
	If $hWnd = $hMain And $lParam = $hEdit And _WinAPI_HiWord($wParam) = $EN_UPDATE Then
		_GUIScrollBars_ShowScrollBar($hEdit, $SB_BOTH, True)
		
		If BitAND(DllStructGetData(_GUIScrollBars_GetScrollBarInfoEx($hEdit, $OBJID_VSCROLL), 'rgstate', 1), 1) = 1 Then
			_GUIScrollBars_ShowScrollBar($hEdit, $SB_VERT, False)
		EndIf
		
		If BitAND(DllStructGetData(_GUIScrollBars_GetScrollBarInfoEx($hEdit, $OBJID_HSCROLL), 'rgstate', 1), 1) = 1 Then
			_GUIScrollBars_ShowScrollBar($hEdit, $SB_HORZ, False)
		EndIf
	EndIf
	
	Return $GUI_RUNDEFMSG
EndFunc
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Вопрос:
Как установить пароль на запуск скрипта?

Ответ:
Код:
$sReadKey = IniRead(@ScriptDir & "\options.ini", "Options", "key", "")
$iEnterAttempts = 3
$sPassword = "parol"

If $sReadKey = $sPassword Then
    MsgBox(64, "Password:", "The password is correct!")
Else
    For $I = 1 To $iEnterAttempts
        $sReadPass = InputBox("Ввод пароля", "Введите пароль", "", "*")
        
		If @error Or Not $sReadPass Then
			Exit
        EndIf
		
		$iCheckPass = StringCompare($sReadPass, $sPassword, 1)
        
		Switch $iCheckPass
            Case 0
                MsgBox(64, "OK", "Пароль правильный!", 3)
                IniWrite(@ScriptDir & "\options.ini", "Options", "key", $sPassword)
                ExitLoop
            Case Else
                If $iEnterAttempts - $i Then
                    MsgBox(16, "Error", "Пароль не правильный." & @LF & "Осталось попыток ввода: " & $iEnterAttempts - $i, 5)
                Else
                    MsgBox(16, "Error", "Попыток ввода пароля: " & $iEnterAttempts & ", и ни одной правильной!" & @LF & "До свидания!", 5)
                    Exit
                EndIf
        EndSwitch
    Next
EndIf
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как сменить иконку у ListView Item?

Ответ:
Тут
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Вопрос:
Как учетной записи пользователя назначить административные права?

Ответ:
Код:
$groupName = "Администраторы"
$userName = "User"

Run("net localgroup " & $groupName & " " & $userName & " /add", "", @SW_HIDE)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как создать учётную запись пользователя с правами администратора?

Ответ:
Код:
#Include <Security.au3>

TraySetState(2)

Dim $aSid = "S-1-5-32-544"
Dim $aresult = _Security__LookupAccountSid($aSid)
Dim $rSid = "S-1-5-32-555"
Dim $rresult = _Security__LookupAccountSid($rSid)
Dim $agroupName = $aresult[0]
Dim $rgroupName = $rresult[0]
Dim $userName = "TEST"
Dim $userPass = "pass"
$x = Chr(34)
RunWait("net user " & $userName & " " & $userPass & " /add", "", @SW_HIDE)
RunWait("net localgroup " & $x & "" & $rgroupName & "" & $x & " " & $userName & " /add", "", @SW_HIDE)
RunWait("net localgroup " & $agroupName & " " & $userName & " /add", "", @SW_HIDE)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как запустить скрипт вместе с Windows?

Ответ:
Код:
If @Compiled Then
    _RegAddToRun()
EndIf

;Тут Ваш скрипт

Func _RegAddToRun()
    Local $sRegRun = 'HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run'
    
    If RegRead($sRegRun, @ScriptName) = '' Or RegRead($sRegRun, @ScriptName) <> @ScriptFullPath Then
        RegWrite($sRegRun, @ScriptName, 'REG_SZ', @ScriptFullPath)
    EndIf
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как включить/выключить локальное сетевое подключение?

Ответ:
Код:
Run(@ComSpec & ' /C netsh interface set interface "Local Area Connection" DISABLE') ; выкл "Local Area Connection"
Run(@ComSpec & ' /C netsh interface set interface "Local Area Connection" ENABLE') ; вкл "Local Area Connection"
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как получить размер изображения?

Ответ:
Код:
#include <GDIPlus.au3>

_GDIPlus_Startup()
$sFile = @MyDocumentsDir & '\Скриншоты\sshot-1.jpg'
$hBitmap = _GDIPlus_BitmapCreateFromFile($sFile)
$iPic_W = _GDIPlus_ImageGetWidth($hBitmap)
$iPic_H = _GDIPlus_ImageGetHeight($hBitmap)
_GDIPlus_ImageDispose($hBitmap)
_GDIPlus_Shutdown()
ConsoleWrite($sFile & ', 0, 0, ' & $iPic_W & ', ' & $iPic_H & @CRLF)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как разделить/соеденить файл?

Ответ:
Код:
#include <Constants.au3>

$iMax = 1024 * 1024 * 5
$sFile = @ScriptDir & '\mult.avi'

$sFolderName = StringRegExpReplace($sFile, '^.*\.', '') & '_' & StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$sNewName = StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')
$hFile = FileOpen($sFile, 16)
$iSize = FileGetSize($sFile)

$iPart = Int($iSize / $iMax)
$iEnd = Mod($iSize, $iMax)

For $i = 0 To $iPart
    FileSetPos($hFile, $iMax * $i, $FILE_BEGIN)
    $sTempText = FileRead($hFile, $iMax)
    $hTempFile = FileOpen(@ScriptDir & '\' & $sFolderName & '\' & ($i + 1) & '_' & $sNewName & '.xyz', 26)
    FileWrite($hTempFile, $sTempText)
    FileClose($hTempFile)
Next

FileClose($hFile)

IniWrite(@ScriptDir & '\' & $sFolderName & '\' & 'File.ini', 'File','FileName', StringRegExpReplace($sFile, '^.*\\', ''))
IniWrite(@ScriptDir & '\' & $sFolderName & '\' & 'File.ini', 'File','FilePart', ($iPart + 1))

Код:
$sFile = IniRead(@ScriptDir & '\File.ini', 'File','FileName', 'error')
$iPart = IniRead(@ScriptDir & '\File.ini', 'File','FilePart', 'error')
$sName = StringRegExpReplace($sFile, '.*\\|\.[^.]*$', '')

$hFile = FileOpen(@ScriptDir & '\' & $sFile, 17)

For $i = 1 To $iPart
    $hTempFile = FileOpen(@ScriptDir & '\' & $i & '_' & $sName & '.xyz', 16)
    $sTempText = FileRead($hTempFile)
    FileWrite($hFile, $sTempText)
    FileClose($hTempFile)
Next

FileClose($hFile)
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как правильно создавать дочерние окна?

Ответ:
В функций GUICreate имеется параметр hWnd (последний/8-ой параметр), в качестве которого нужно указывать дескриптор родительского окна.
Также желательно “отключить” родительское окно, чтобы пользователь мог работать только с дочерним.
Вот пример создания подобного дочернего окна:

Код:
#Include <GUIConstantsEx.au3>

$hMain_GUI = GUICreate('Main GUI', 600, 500)
$nSttngs_Button = GUICtrlCreateButton('Settings', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain_GUI)

While 1
    $nMsg = GUIGetMsg()
	
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nSttngs_Button
            _Settings_Dlg($hMain_GUI)
    EndSwitch
WEnd

Func _Settings_Dlg($hParent = 0)
	Local $hSettings, $iGOEM_Opt
	
	;Предотвращение проблем в случае если главный GUI использует режим событий
	$iGOEM_Opt = Opt("GUIOnEventMode", 0)
	
	$hSettings_GUI = GUICreate('Settings', 500, 300, -1, -1, -1, -1, $hParent)
	
	;...
	
	GUISetState(@SW_DISABLE, $hParent)
	GUISetState(@SW_SHOW, $hSettings_GUI)
	
	While 1
		$nMsg = GUIGetMsg()
		
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
		EndSwitch
	WEnd
	
	Opt("GUIOnEventMode", $iGOEM_Opt)
	GUISetState(@SW_ENABLE, $hParent)
	GUIDelete($hSettings_GUI)
EndFunc


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

Код:
#include <GUIConstantsEx.au3>

;Обязательно задавать элементам -1, чтобы небыло ложного срабатывания событий в случае если (ещё) не создан элемент присваеваемый данной переменной
Global $nChildGUI_Close_Bttn = -1

$hMain_GUI = GUICreate("Main GUI", 250, 250)
$nChild_Button = GUICtrlCreateButton("Child", 20, 220, 60, 20)

GUISetState(@SW_SHOW, $hMain_GUI)

;Создаём дочерний GUI, не отображая его на экране
$hChild_GUI = _ChildGUI_Create($hMain_GUI)

While 1
	;Обработка событий в расширенном режиме
	$aMsg = GUIGetMsg(1)
	
	Switch $aMsg[0]
		Case $GUI_EVENT_CLOSE
			;Проверяем если "событие закрытия" поступило с главного-родительского GUI
			If $aMsg[1] = $hMain_GUI Then Exit
			
			;Если "событие закрытия" поступило с дочернего GUI, то просто прячем его
			If $aMsg[1] = $hChild_GUI Then
				GUISetState(@SW_HIDE, $hChild_GUI)
			EndIf
		Case $nChild_Button
			;Показываем дочерний GUI при нажатий на кнопку "Child"
			GUISetState(@SW_SHOW, $hChild_GUI)
			If Not WinActive($hChild_GUI) Then WinActivate($hChild_GUI)
		Case $nChildGUI_Close_Bttn
			MsgBox(64, 'Message', 'Child GUI "Close" button pressed, closing the child...', 3)
			GUISetState(@SW_HIDE, $hChild_GUI)
	EndSwitch
WEnd

Func _ChildGUI_Create($hParent)
	Local $hChild_GUI
	
	$hChild_GUI = GUICreate("Child GUI", 200, 200, -1, -1, -1, -1, $hParent)
	
	;Создаём элементы тут
	$nChildGUI_Close_Bttn = GUICtrlCreateButton("Close", 20, 170, 60, 20)
	
	Return $hChild_GUI
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как “заморозить/разморозить” процесс?

Ответ:
Код:
$iProc = ProcessExists("Process.exe")

_ProcessSuspend($iProc) ;"Заморозка" процесса
Sleep(2000)
_ProcessResume($iProc) ;"Разморозка" процесса



;===============================================================================
;
; Description:      Suspend all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Suspended and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;												@error to:	1 - Process not Found
;															2 - Error Calling 'CreateToolhelp32Snapshot'
;															3 - Error Calling 'Thread32First'
;															4 - Error Calling 'Thread32Next'
;															5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Ported from: http://www.codeproject.com/threads/pausep.asp
;					Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcessSuspend($vProcess, $iReserved = 0)
	Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
	Local $TH32CS_SNAPTHREAD = 0x00000004
	Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
	Local $THREAD_SUSPEND_RESUME = 0x0002
	Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
			 & "int;" _; 2 -> cntUsage
			 & "int;" _; 3 -> th32ThreadID
			 & "int;" _; 4 -> th32OwnerProcessID
			 & "int;" _; 5 -> tpBasePri
			 & "int;" _; 6 -> tpDeltaPri
			 & "int" ; 7 -> dwFlags
	$iPid = ProcessExists($vProcess)
	If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
	$vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
	If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
	If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
	$hThreadSnap = $vTmp[0]
	$ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
	DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
	$vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
	If @error Then Return SetError(3, 0, False) ; Thread32First Failed
	If Not $vTmp[0] Then
		DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
		Return SetError(3, 0, False) ; Thread32First Failed
	EndIf
	While 1
		If DllStructGetData($ThreadEntry32, 4) = $iPid Then
			$iThreadID = DllStructGetData($ThreadEntry32, 3)
			$vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
			If Not @error Then
				$hThread = $vTmp[0]
				If $hThread Then
					If $iReserved Then
						$sFunction = "ResumeThread"
					Else
						$sFunction = "SuspendThread"
					EndIf
					$vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
					If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
					DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
				EndIf
			EndIf
			$iThreadCnt += 1
		EndIf
		$vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
		If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
		If Not $vTmp[0] Then ExitLoop
	WEnd
	DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
	If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
	Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc

;===============================================================================
;
; Description:      Resume all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Resumed and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;												@error to:	1 - Process not Found
;															2 - Error Calling 'CreateToolhelp32Snapshot'
;															3 - Error Calling 'Thread32First'
;															4 - Error Calling 'Thread32Next'
;															5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Ported from: http://www.codeproject.com/threads/pausep.asp
;					Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcessResume($vProcess)
	Local $fRval = _ProcessSuspend($vProcess, True)
	Return SetError(@error, @extended, $fRval)
EndFunc
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как отправить GET-запрос?

Ответ:
  • С помощью InetGet/InetRead
    Код:
    $bData = InetRead('http://localhost/test/get.php?param1=value1&param2=value2', 1)
    
    If Not @error Then
    	MsgBox(0, 'Data', BinaryToString($bData))
    EndIf

  • С помощью WinHTTP через COM-интерфейс (http://msdn.microsoft.com/en-us/library/aa384106%28v=VS.85%29.aspx)
    Код:
    $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    	Exit 1
    EndIf
    
    $oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)
    
    Func ErrorFunc()
    	MsgBox(16, 'Ошибка', $oErrorHandler.description)
    	Exit 2
    EndFunc
    
    $oRequest.Open('GET', 'http://localhost/test/get.php?param1=value1&param2=value2', 0) ;Создаём соеденение, указываем адрес страницы вместе с параметрами
    $oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
    $oRequest.Send() ;отправляем запрос
    $sData = $oRequest.ResponseText
    
    $oErrorHandler = 0 ;выключаем обработчик ошибок
    
    MsgBox(0, 'Data', $sData)

  • С помощью WinHttp.au3 (WinHTTP через DllCalls) (http://www.autoitscript.com/forum/topic/84133-winhttp-functions/)
    Код:
    #include "WinHttp.au3"
    
    $hOpen = _WinHttpOpen('au3browser') ;инициализируем использование WinHTTP-функций, указываем заголовок User-Agent
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось инициализировать использование WinHttp-функций.')
    	Exit 1
    EndIf
    
    $hConnect = _WinHttpConnect($hOpen, 'localhost') ;создаём соеденение, указываем только домен/ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось создать соеденение.')
    	Exit 2
    EndIf
    
    $sData = _WinHttpSimpleRequest($hConnect, 'GET', 'test/get.php?param1=value1&param2=value2') ;отправляем запрос, указываем его метод, адрес страницы без домена и параметры
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить сообщение.')
    	Exit 3
    EndIf
    
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    
    MsgBox(0, 'Data', $sData)

  • С помощью TCP-функций AutoIt
    Код:
    $sDomain = 'localhost' ;домен или ip-адрес
    $iPort = 80 ;порт
    
    ;Запрос, который будет отправлен серверу
    $sRequest = 'GET /test/get.php?param1=value1&param2=value2 HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
    $sRequest &= 'Connection: close' & @CRLF ;Заголовки
    $sRequest &= 'Accept: */*' & @CRLF
    $sRequest &= 'User-Agent: au3browser' & @CRLF
    $sRequest &= 'Host: localhost' & @CRLF & @CRLF
    
    If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    	MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    	Exit 1
    EndIf
    
    $sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    	Exit 2
    EndIf
    
    $iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    	Exit 3
    EndIf
    
    TCPSend($iSocket, $sRequest) ;отправляем сообщение
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    	Exit 4
    EndIf
    
    $sData = ''
    $iTimer = TimerInit() ;запускаем таймер
    
    Do
    	$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    	$iError = @error
    	If Not $sBuffer = '' Then ;если удалось получить сообщение
    		$sData &= $sBuffer ;сохраняем полученное сообщение
    		$iTimer = TimerInit() ;обнуляем таймер
    	EndIf
    Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
    
    TCPCloseSocket($iSocket)
    TCPShutdown()
    
    $aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Полученные данные неверны.')
    	Exit 5
    EndIf
    
    MsgBox(0, 'Data', $aData[1])
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как отправить POST-запрос?

Ответ:
  • С помощью WinHTTP через COM-интерфейс (http://msdn.microsoft.com/en-us/library/aa384106%28v=VS.85%29.aspx)
    Код:
    $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    	Exit 1
    EndIf
    
    $oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)
    
    Func ErrorFunc()
    	MsgBox(16, 'Ошибка', $oErrorHandler.description)
    	Exit 2
    EndFunc
    
    $oRequest.Open('POST', 'http://localhost/test/post.php', 0) ;Создаём соеденение, указываем адрес страницы
    $oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
    $oRequest.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded') ;Указываем заголовок Content-Type (необходимо для POST-запроса (Content-Length указывается автоматически))
    $oRequest.Send('param1=value1&param2=value2') ;отправляем запрос
    $sData = $oRequest.ResponseText
    
    $oErrorHandler = 0 ;выключаем обработчик ошибок
    
    MsgBox(0, 'Data', $sData)
  • С помощью WinHttp.au3 (WinHTTP через DllCalls) (http://www.autoitscript.com/forum/topic/84133-winhttp-functions/)
    Код:
    #include "WinHttp.au3"
    
    $hOpen = _WinHttpOpen('au3browser') ;инициализируем использование WinHTTP-функций, указываем заголовок User-Agent
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось инициализировать использование WinHttp-функций.')
    	Exit 1
    EndIf
    
    $hConnect = _WinHttpConnect($hOpen, 'localhost') ;создаём соеденение, указываем только домен/ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось создать соеденение.')
    	Exit 2
    EndIf
    
    $sData = _WinHttpSimpleRequest($hConnect, 'POST', 'test/post.php', Default, 'param1=value1&param2=value2') ;отправляем запрос, указываем его метод, адрес страницы без домена и параметры
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить сообщение.')
    	Exit 3
    EndIf
    
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    
    MsgBox(0, 'Data', $sData)
  • С помощью TCP-функций AutoIt
    Код:
    $sDomain = 'localhost' ;домен или ip-адрес
    $iPort = 80 ;порт
    $sParameters = 'param1=value1&param2=value2' ;Параметры
    
    ;Запрос, который будет отправлен серверу
    $sRequest = 'POST /test/post.php HTTP/1.1' 1& @CRLF ;Request-строка
    $sRequest &= 'Connection: close' & @CRLF ;Заголовки
    $sRequest &= 'Accept: */*' & @CRLF
    $sRequest &= 'User-Agent: au3browser' & @CRLF
    $sRequest &= 'Host: localhost' & @CRLF
    $sRequest &= 'Content-Type: application/x-www-form-urlencoded' & @CRLF ;Указываем заголовок Content-Type (необходимо для POST-запроса)
    $sRequest &= 'Content-Length: ' & StringLen($sParameters) & @CRLF ;Указываем заголовок Content-Length (необходимо для POST-запроса)
    $sRequest &= @CRLF ;Заголовки от параметров отделяет пустая строка
    $sRequest &= $sParameters ;Параметры в запросе
    
    Opt('TCPTimeout', 5000)
    
    If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    	MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    	Exit 1
    EndIf
    
    $sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    	Exit 2
    EndIf
    
    $iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    	Exit 3
    EndIf
    
    TCPSend($iSocket, $sRequest) ;отправляем сообщение
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    	Exit 4
    EndIf
    
    $sData = ''
    $iTimer = TimerInit() ;запускаем таймер
    
    Do
    	$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    	$iError = @error
    	If Not $sBuffer = '' Then ;если удалось получить сообщение
    		$sData &= $sBuffer ;сохраняем полученное сообщение
    		$iTimer = TimerInit() ;обнуляем таймер
    	EndIf
    Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
    
    TCPCloseSocket($iSocket)
    TCPShutdown()
    
    $aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Полученные данные неверны.')
    	Exit 5
    EndIf
    
    MsgBox(0, 'Data', $aData[1])
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как отправить имя и пароль для HTTP-аутентификации?

Ответ:
  • С помощью InetGet/InetRead
    Код:
    $bData = InetRead('http://name:password@localhost/test/authentication.php', 1)
    
    If Not @error Then
    	MsgBox(0, 'Data', BinaryToString($bData))
    EndIf

  • С помощью WinHTTP через COM-интерфейс (http://msdn.microsoft.com/en-us/library/aa384106%28v=VS.85%29.aspx)
    Код:
    Global Const $HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0
    
    $oRequest = ObjCreate('WinHttp.WinHttpRequest.5.1') ;Создаём COM-объект
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Ошибка при создании объекта "WinHttp.WinHttpRequest.5.1".')
    	Exit 1
    EndIf
    
    $oErrorHandler = ObjEvent('AutoIt.Error', 'ErrorFunc') ;Создаём обработчик ошибок (COM Error Handling http://www.autoitscript.com/autoit3/docs/intro/ComRef.htm)
    
    Func ErrorFunc()
    	MsgBox(16, 'Ошибка', $oErrorHandler.description)
    	Exit 2
    EndFunc
    
    $oRequest.Open('GET', 'http://localhost/test/authentication.php', 0) ;Создаём соеденение, указываем адрес страницы
    $oRequest.SetRequestHeader('User-Agent', 'au3browser') ;Указываем заголовок User-Agent
    $oRequest.SetCredentials('name', 'password', $HTTPREQUEST_SETCREDENTIALS_FOR_SERVER) ;Указываем имя и пароль
    $oRequest.Send() ;отправляем запрос
    $sData = $oRequest.ResponseText
    
    $oErrorHandler = 0 ;выключаем обработчик ошибок
    
    MsgBox(0, 'Data', $sData)

  • С помощью WinHttp.au3 (WinHTTP через DllCalls) (http://www.autoitscript.com/forum/topic/84133-winhttp-functions/)
    Код:
    #include "WinHttp.au3"
    
    $hOpen = _WinHttpOpen('au3browser') ;инициализируем использование WinHTTP-функций, указываем заголовок User-Agent
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось инициализировать использование WinHttp-функций.')
    	Exit 1
    EndIf
    
    $hConnect = _WinHttpConnect($hOpen, 'localhost') ;создаём соеденение, указываем только домен/ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось создать соеденение.')
    	_WinHttpCloseHandle($hOpen)
    	Exit 2
    EndIf
    
    $hRequest = _WinHttpOpenRequest($hConnect, 'GET', 'test/authentication.php') ;формируем запрос
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось сформировать запрос.')
    	_WinHttpCloseHandle($hConnect)
    	_WinHttpCloseHandle($hOpen)
    	Exit 3
    EndIf
    
    _WinHttpSetCredentials($hRequest, $WINHTTP_AUTH_TARGET_SERVER, $WINHTTP_AUTH_SCHEME_BASIC, 'name', 'password') ;указваем имя и пароль
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось указать имя и пароль для аутентификации.')
    	_WinHttpCloseHandle($hRequest)
    	_WinHttpCloseHandle($hConnect)
    	_WinHttpCloseHandle($hOpen)
    	Exit 4
    EndIf
    
    _WinHttpSendRequest($hRequest) ;отправляем запрос
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    	_WinHttpCloseHandle($hRequest)
    	_WinHttpCloseHandle($hConnect)
    	_WinHttpCloseHandle($hOpen)
    	Exit 5
    EndIf
    
    _WinHttpReceiveResponse($hRequest) ;ждём ответа
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось получить ответ сервера.')
    	_WinHttpCloseHandle($hRequest)
    	_WinHttpCloseHandle($hConnect)
    	_WinHttpCloseHandle($hOpen)
    	Exit 6
    EndIf
    
    If Not _WinHttpQueryDataAvailable($hRequest) Then ;проверяем наличие ответа
    	MsgBox(16, 'Ошибка', 'Не удалось получить ответ сервера.')
    	_WinHttpCloseHandle($hRequest)
    	_WinHttpCloseHandle($hConnect)
    	_WinHttpCloseHandle($hOpen)
    	Exit 7
    EndIf
    
    $sData = _WinHttpReadData($hRequest, 1)
    
    _WinHttpCloseHandle($hRequest)
    _WinHttpCloseHandle($hConnect)
    _WinHttpCloseHandle($hOpen)
    
    MsgBox(0, 'Data', $sData)

  • С помощью TCP-функций AutoIt
    Код:
    #include "Encoding.au3" ;http://autoit-script.ru/index.php/topic,510.0.html
    
    $sDomain = 'localhost' ;домен или ip-адрес
    $iPort = 80 ;порт
    
    ;Запрос, который будет отправлен серверу
    $sRequest = 'GET /test/authentication.php HTTP/1.1' & @CRLF ;Request-строка, параметры GET-запроса
    $sRequest &= 'Connection: close' & @CRLF ;Заголовки
    $sRequest &= 'Accept: */*' & @CRLF
    $sRequest &= 'User-Agent: au3browser' & @CRLF
    $sRequest &= 'Host: localhost' & @CRLF
    $sRequest &= 'Authorization: Basic ' & StringRegExpReplace(_Encoding_Base64Encode('name:password'), '\r|\n', '') & @CRLF & @CRLF ;имя и пароль зашифрованные Base64, _Encoding_Base64Encode может добавлять @CRLF в конец строки, пустая строка между заголовками чревата ошибками!
    
    If TCPStartup() = 0 Then ;запускаем TCP/UDP-службы
    	MsgBox(16, 'Ошибка', 'Не удалось запустить TCP/UDP-службы.')
    	Exit 1
    EndIf
    
    $sIP = TCPNameToIP($sDomain) ;получаем ip-адрес
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось получить ip-адрес сервера.')
    	Exit 2
    EndIf
    
    $iSocket = TCPConnect($sIP, $iPort) ;соединяемся с сервером
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось соедениться с сервером.')
    	Exit 3
    EndIf
    
    TCPSend($iSocket, $sRequest) ;отправляем сообщение
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Не удалось отправить запрос.')
    	Exit 4
    EndIf
    
    $sData = ''
    $iTimer = TimerInit() ;запускаем таймер
    
    Do
    	$sBuffer = TCPRecv($iSocket, 1024) ;получаем часть сообщения сервера
    	$iError = @error
    	If Not $sBuffer = '' Then ;если удалось получить сообщение
    		$sData &= $sBuffer ;сохраняем полученное сообщение
    		$iTimer = TimerInit() ;обнуляем таймер
    	EndIf
    Until $iError <> 0 Or TimerDiff($iTimer) > 5000 ;если при получении сообщения произошла ошибка (данные получены, соединение закрыто) или в течении 5 секунд ничего не было получено, выход из цикла
    
    TCPCloseSocket($iSocket)
    TCPShutdown()
    
    $aData = StringRegExp($sData, '(?s)(.*?)\r\n\r\n(.*)', 3) ;отделяем http-заголовки от тела сообщения ('заголовки' & @CRLF & @CRLF & 'тело')
    
    If @error Then
    	MsgBox(16, 'Ошибка', 'Полученные данные неверны.')
    	Exit 5
    EndIf
    
    MsgBox(0, 'Data', $aData[1])
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вопрос:
Как заставить FileInstall работать с каталогами?

Ответ:
FileInstall предназначен строго для файлов.

Однако можно использовать следующий код, который в не скомпилированный скрипт добавит список FileInstall'ов с файлами указанного каталога:

Код:
_FileDirInstall(@ScriptDir & '\Resources', @TempDir)

;===== YOUR SCRIPT CONTENT GOES HERE =====



;===== YOUR SCRIPT CONTENT GOES HERE =====


Func _FileDirInstall($sDirPath, $sDest, $nFlag = 0, $sMask = '*', $iSubDirs = 0, $sIncludeName = -1)
	Local $aList, $aMacros, $sMacros, $sData, $sReadScript, $hFile
	
	If @Compiled Then
		Return SetError(-1)
	EndIf
    
	If StringStripWS($sIncludeName, 8) = '' Then
		$sIncludeName = 'InstalledDir'
	ElseIf $sIncludeName = -1 Then
		$sIncludeName = 'InstalledDir_' & StringRegExpReplace($sDirPath, '^.*\\', '')
	EndIf
	
	$sIncludeName &= '.fdi'
	
	$aList = __FileSearch($sDirPath, $sMask, 1, $iSubDirs, 0)
	
	If @error Then
		Return SetError(1)
	EndIf
	
	$aMacros = _
		StringSplit( _
			'AppDataCommonDir|DesktopCommonDir|DocumentsCommonDir|FavoritesCommonDir|ProgramsCommonDir|StartMenuCommonDir|' & _
			'StartupCommonDir|AppDataDir|DesktopDir|MyDocumentsDir|FavoritesDir|ProgramsDir|StartMenuDir|StartupDir|UserProfileDir|' & _
			'HomeDrive|HomePath|HomeShare|ProgramFilesDir|CommonFilesDir|WindowsDir|SystemDir|TempDir', _
		'|')
	
	For $i = 1 To $aMacros[0]
		$sMacros = Execute('@' & $aMacros[$i])
		
		If $sDest = $sMacros Then
			$sDest = StringReplace($sDest, $sMacros, '@' & $aMacros[$i])
		EndIf
	Next
	
	For $i = 1 To $aList[0]
		If $iSubDirs = 1 Then
			$sData &= 'FileInstall("' & $aList[$i] & '", ' & $sDest & ' & "\' & StringRegExpReplace($aList[$i], '^.*\\', '') & '", ' & $nFlag & ')' & @CRLF
		Else
			$sData &= 'FileInstall("' & $sDirPath & '\' & $aList[$i] & '", ' & $sDest & ' & "\' & $aList[$i] & '", ' & $nFlag & ')' & @CRLF
		EndIf
	Next
	
	If $sData = '' Then
		Return SetError(2)
	EndIf
	
	$hFile = FileOpen(@ScriptDir & '\' & $sIncludeName, 2)
	FileWrite($hFile, '#include-once' & @CRLF & @CRLF & $sData)
	FileClose($hFile)
	
	$sReadScript = FileRead(@ScriptFullPath)
	
	If Not StringInStr($sReadScript, '#include "' & $sIncludeName & '"' & @CRLF) Then
		$hFile = FileOpen(@ScriptFullPath, 2)
		FileWrite($hFile, '#include "' & $sIncludeName & '"' & @CRLF & $sReadScript)
		FileClose($hFile)
	EndIf
	
    Return 1
EndFunc

Func __FileSearch($sPath, $sFileMask = "*", $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles
	
	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf
	
	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf
	
	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf
	
	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2 
			$sAttrib &= ' /AD'
		Case Else 
			$sAttrib &= ' /A'
	EndSwitch
	
	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')
	
	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf
		
		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'
		
		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next
	
	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)
	
	While 1
		$sRead = StdoutRead($hDir, False, True)
		
		If @error Then
			ExitLoop
		EndIf
		
		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	Wend
	
	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)
	
	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf
	
	$aOut[0] = UBound($aOut)-1
	Return $aOut
EndFunc


Запустите данный скрипт до компиляции.
Рядом с вашим скриптом появится файл «InstalledDir_ИмяУказаннойПапки.fdi», а в сам скрипт будет прописана строчка #include "InstalledDir_ИмяУказаннойПапки.fdi".
 
Статус
Закрыто для дальнейших ответов.
Верх