Что нового

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

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 174
Репутация
2 331
Этот [acronym=от англ. Frequently Asked Question (или ЧаВо, от рус. Часто задаваемые вопросы)]FAQ[/acronym] будет постепенно расти, по мере появления частых вопросов на форуме.

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



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. Как позволить запуск только одной копии программы?
 
Автор
CreatoR

CreatoR

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

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

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

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

kaster

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

Ответ:
Помимо того, что следуя справке, необходимо вместо нескольких операторов
Код:
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
Репутация
156
Вопрос:
Как создать 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 174
Репутация
2 331
Вопрос:
Как показать прокрутку только после того, когда текст выходит за рамки 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
Репутация
156
Вопрос:
Как установить пароль на запуск скрипта?

Ответ:
Код:
$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 174
Репутация
2 331
Вопрос:
Как сменить иконку у ListView Item?

Ответ:
Тут
 

`p r o x y

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

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

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

CreatoR

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

Ответ:
Код:
#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 174
Репутация
2 331
Вопрос:
Как запустить скрипт вместе с 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 174
Репутация
2 331
Вопрос:
Как включить/выключить локальное сетевое подключение?

Ответ:
Код:
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 174
Репутация
2 331
Вопрос:
Как получить размер изображения?

Ответ:
Код:
#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 174
Репутация
2 331
Вопрос:
Как разделить/соеденить файл?

Ответ:
Код:
#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 174
Репутация
2 331
Вопрос:
Как правильно создавать дочерние окна?

Ответ:
В функций 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 174
Репутация
2 331
Вопрос:
Как “заморозить/разморозить” процесс?

Ответ:
Код:
$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 174
Репутация
2 331
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 174
Репутация
2 331
Вопрос:
Как отправить 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 174
Репутация
2 331
Вопрос:
Как отправить 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 174
Репутация
2 331
Вопрос:
Как отправить имя и пароль для HTTP-аутентификации?

Ответ:
  • С помощью InetGet/InetRead
    Код:
    $bData = InetRead('http://name:[email protected]/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 174
Репутация
2 331
Вопрос:
Как заставить 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".
 
Статус
Закрыто для дальнейших ответов.
Верх