» AutoIT
Есть текстовый файл, типа статистики, в котором записаны числа от 1 до 26. Мне нужно подсчитать, сколько раз в нем встречается каждое число (это не проблема), и как-то это графически изобразить. Вот как сие можно устроить, желательно в виде гистограммы?
levelxxx 19:13 15-12-2008
Цитата:
Неверные вопросы - Нужно сначала спросить (а точнее в справке посмотреть), как работает FileOpen().
По вопросам...
1) Можно:
Код: #include <Misc.au3>
;Выход из скрипта при нажатии "1"
HotKeySet("1", "MyExit")
Global $sFile = @ScriptDir & "\Test.txt"
;Получеам текущее содержимое б.обмена
Global $sOld_ClipContent = ClipGet()
;Цикл отслеживает изменение б.обмена
While True
$sNew_ClipContent = ClipGet()
;Возврат буфера обмена в переменную $sOld_ClipContent
If $sNew_ClipContent <> $sOld_ClipContent Then
$sOld_ClipContent = $sNew_ClipContent
$iAsk = MsgBox(4, "Вопрос", _
"СОДЕРЖИМОЕ БУФЕРА ОБМЕНА ИЗМЕНИЛОСЬ:" & @CRLF & @CRLF & _
StringLeft($sNew_ClipContent, 1024) & _Iif(StringLen($sNew_ClipContent) > 1024, ".....", "") & @CRLF & @CRLF & _
StringFormat("ЗАПИСАТЬ В ФАЙЛ (%s)?", StringRegExpReplace($sFile, "^.*\\", "")))
If $iAsk = 6 Then FileWriteLine($sFile, $sNew_ClipContent)
EndIf
Sleep(10)
WEnd
Func MyExit()
Exit
EndFunc
Цитата:
Вопросы
Неверные вопросы - Нужно сначала спросить (а точнее в справке посмотреть), как работает FileOpen().
По вопросам...
1) Можно:
Код: #include <Misc.au3>
;Выход из скрипта при нажатии "1"
HotKeySet("1", "MyExit")
Global $sFile = @ScriptDir & "\Test.txt"
;Получеам текущее содержимое б.обмена
Global $sOld_ClipContent = ClipGet()
;Цикл отслеживает изменение б.обмена
While True
$sNew_ClipContent = ClipGet()
;Возврат буфера обмена в переменную $sOld_ClipContent
If $sNew_ClipContent <> $sOld_ClipContent Then
$sOld_ClipContent = $sNew_ClipContent
$iAsk = MsgBox(4, "Вопрос", _
"СОДЕРЖИМОЕ БУФЕРА ОБМЕНА ИЗМЕНИЛОСЬ:" & @CRLF & @CRLF & _
StringLeft($sNew_ClipContent, 1024) & _Iif(StringLen($sNew_ClipContent) > 1024, ".....", "") & @CRLF & @CRLF & _
StringFormat("ЗАПИСАТЬ В ФАЙЛ (%s)?", StringRegExpReplace($sFile, "^.*\\", "")))
If $iAsk = 6 Then FileWriteLine($sFile, $sNew_ClipContent)
EndIf
Sleep(10)
WEnd
Func MyExit()
Exit
EndFunc
Подскажите, пожалуйста, как можно реализовать следующию вещь.
Мне нужно пройтись по всей памяти приложения, чтобы найти адрес переменной по текущему значению для дальнейшего отслеживания значения переменной. Так как менять уже существующее приложение для вывода некоего интерфейса весьма проблематично, так как приложение писалось давно и часть знания утрачено (да и несколько лень туда копать )
Есть такая программа, как ArtMoney, которая для запущенного приложения умеет искать в памяти ячейки с заданным значением.
Собственно вопрос.
Как можно реализовать подобное?
Как я понимаю, эта задача делится на две подзадачи:
1. Определить объем памяти (то есть границы) для данного приложения.
2. Понять, что лежит по конкретному адресу - тип и значение ячейки (int, string, long...)
Какие есть идеи - в какую степь копать? может быть какие-то ключевые слова для поиска, или пример из встроенного хелпа...
Мне нужно пройтись по всей памяти приложения, чтобы найти адрес переменной по текущему значению для дальнейшего отслеживания значения переменной. Так как менять уже существующее приложение для вывода некоего интерфейса весьма проблематично, так как приложение писалось давно и часть знания утрачено (да и несколько лень туда копать )
Есть такая программа, как ArtMoney, которая для запущенного приложения умеет искать в памяти ячейки с заданным значением.
Собственно вопрос.
Как можно реализовать подобное?
Как я понимаю, эта задача делится на две подзадачи:
1. Определить объем памяти (то есть границы) для данного приложения.
2. Понять, что лежит по конкретному адресу - тип и значение ячейки (int, string, long...)
Какие есть идеи - в какую степь копать? может быть какие-то ключевые слова для поиска, или пример из встроенного хелпа...
Нашел глюк в работе со строковыми переменными:
Код: #include <IE.au3>
$ie = _IECreate('http://google.com')
$html = _IEDocReadHTML($ie)
$text = StringReplace($html, '<meta http-equiv="content-type"', '')
$numreplacements = @extended
_IEQuit($ie)
MsgBox(0, '', $numreplacements)
If StringInStr($html, '<meta http-equiv="content-type"') Then MsgBox(0, '', 'String Found')
Код: #include <IE.au3>
$ie = _IECreate('http://google.com')
$html = _IEDocReadHTML($ie)
$text = StringReplace($html, '<meta http-equiv="content-type"', '')
$numreplacements = @extended
_IEQuit($ie)
MsgBox(0, '', $numreplacements)
If StringInStr($html, '<meta http-equiv="content-type"') Then MsgBox(0, '', 'String Found')
theHelg
Цитата:
Ищи на офф. форуме NomadMemory UDF.
timsky
Функцию _INetGetSource пробовал использовать?
Цитата:
Мне нужно пройтись по всей памяти приложения
Ищи на офф. форуме NomadMemory UDF.
timsky
Функцию _INetGetSource пробовал использовать?
timsky
Цитата:
Можно искать регэкспом с опциональными скобками
Цитата:
Оказывается функции _IEBodyReadHTML, _IEDocReadHTML дергают совсем другой текст. Открыл в ИЕ и Опере - текст одинаковый, сдампил Автоитом - нет кавычек в тегах типа этого: <meta http-equiv=content-type
Почему???
Можно искать регэкспом с опциональными скобками
Цитата:
См. функции _IE* в справке.
Как полностью функция называется, а то у меня с анлийским плохо
SNAKE92:
Код: #include <IE.au3>
$IE = ...;Здесь надо будет получить объект браузера с помощью _IEAttach() или _IECreate()
$url = _IEPropertyGet($IE, "locationurl")
Код: #include <IE.au3>
$IE = ...;Здесь надо будет получить объект браузера с помощью _IEAttach() или _IECreate()
$url = _IEPropertyGet($IE, "locationurl")
gal7
Пойдет, спосибо
Пойдет, спосибо
Возможно ли из autoit-скрипта управлять total commander`ом ?
добавлено:
нашёл отличную прогу
http://en.totalcmd.pl/download/add/Add/TC_Multiple_Commands
с её помощью можно програмно посылать тоталу его внутренние комманды
например CM2017 - скопировать имена выделенных файлов в буфер обмена
CM префикс а цифры это номер команды
вот пример:
Код: ShellExecuteWait ( "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\TCMC.exe" _
, "CM2017" , "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\" )
добавлено:
нашёл отличную прогу
http://en.totalcmd.pl/download/add/Add/TC_Multiple_Commands
с её помощью можно програмно посылать тоталу его внутренние комманды
например CM2017 - скопировать имена выделенных файлов в буфер обмена
CM префикс а цифры это номер команды
вот пример:
Код: ShellExecuteWait ( "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\TCMC.exe" _
, "CM2017" , "c:\Program Files\total commander\plugins\_temp\addAdd_TC.Multiple.Commands_0.12\" )
Как получить информацию о нажатии клавиш или кнопки мыши
Неважно в каком приложении, и что куда нажато,
Хочу написать для себя скрипт отслеживающий активность пользователя
P.S. А можно ли проводить поиск по отдельным темам форума. 129 страниц однако.
Неважно в каком приложении, и что куда нажато,
Хочу написать для себя скрипт отслеживающий активность пользователя
P.S. А можно ли проводить поиск по отдельным темам форума. 129 страниц однако.
ViSiToR
Спасибо за скрипты! Буду пробовать.
Спасибо за скрипты! Буду пробовать.
Цитата:
Возможно ли из autoit-скрипта управлять total commander`ом ?
добавлено:
нашёл отличную прогу
http://en.totalcmd.pl/download/add/Add/TC_Multiple_Commands
с её помощью можно програмно посылать тоталу его внутренние комманды
например CM2017 - скопировать имена выделенных файлов в буфер обмена
CM префикс а цифры это номер команды
Имхо, всё это гораздо красивее можно сделать средствами Autoit без костылей в виде внешних файлов. В примере ниже используется функция для получения хэндла активной копии (взял готовую из своего скрипта), но при желании можно получать его другим способом.
Код: $nCommand = 2017
$hWnd = _TCHGetActiveInstance()
DllCall("user32.dll", "hWnd", "SendMessage", "hWnd", $hWnd, "int", 0x433, "int", $nCommand, "int", 0)
; Функция для получения активной копии Тотала
Func _TCHGetActiveInstance()
Local $aList = WinList("[CLASS:TTOTAL_CMD]")
For $i = 1 To $aList[0][0]
If WinActive($aList[$i][1]) Then Return $aList[$i][1]
Next
Return 0
EndFunc
Loopback
Я тоже не люблю связки в стиле игры crazy mashine
главная проблема для меня была из скрипта заставить тотал выполнять внутренние комманды.
А что это за значение, код какой то команды?
Цитата:
Я тоже не люблю связки в стиле игры crazy mashine
главная проблема для меня была из скрипта заставить тотал выполнять внутренние комманды.
А что это за значение, код какой то команды?
Цитата:
DllCall("user32.dll", "hWnd", "SendMessage", "hWnd", $hWnd, "int",0x433, "int", $nCommand, "int", 0)
matanN
Цитата:
Клавиатура
Клавиатура + мышь
Добавлено:
NORIO
Цитата:
Угу, код сообщения:
Google
Цитата:
Как получить информацию о нажатии клавиш
Клавиатура
Клавиатура + мышь
Добавлено:
NORIO
Цитата:
А что это за значение, код какой то команды?
Угу, код сообщения:
Сейчас, когда у меня есть одно запущенное приложение, я его ищу вот так:
Код: $windowHNWD = _WinAPI_FindWindow("Untitled - Notepad", "Notepad")
Код: $windowHNWD = _WinAPI_FindWindow("Untitled - Notepad", "Notepad")
Или может даже такой вопрос,
как по ID процесса - найти его главное окно, точнее указатель на него?
$pid = ProcessExists("calc.exe")
$hwnd = ...($pid)???
как по ID процесса - найти его главное окно, точнее указатель на него?
$pid = ProcessExists("calc.exe")
$hwnd = ...($pid)???
Maza_Faka
Цитата:
Мне необходимо получать сорс внутри веб-интерфейса почтового сервиса, например. Ну, впринципе, теперь я знаю, почему я раньше не мог заставить эти ф-и работать. Теперь просто для пробы заставляю Автоит тупо слить сорс, а потом его уже ковыряю.
KChernov
Цитата:
Вариант, но все-таки интересно знать, почему Автоит так меняет сорс.
Цитата:
Функцию _INetGetSource пробовал использовать?
Мне необходимо получать сорс внутри веб-интерфейса почтового сервиса, например. Ну, впринципе, теперь я знаю, почему я раньше не мог заставить эти ф-и работать. Теперь просто для пробы заставляю Автоит тупо слить сорс, а потом его уже ковыряю.
KChernov
Цитата:
Можно искать регэкспом с опциональными скобками
Вариант, но все-таки интересно знать, почему Автоит так меняет сорс.
theHelg 20:48 17-12-2008
Цитата:
Функцией _ProcessGetWindow():
Код: $sWindow = _ProcessGetWindow("Calc.exe", 1)
ConsoleWrite($sWindow & @CRLF)
Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
Цитата:
как по ID процесса - найти его главное окно, точнее указатель на него?
Функцией _ProcessGetWindow():
Код: $sWindow = _ProcessGetWindow("Calc.exe", 1)
ConsoleWrite($sWindow & @CRLF)
Func _ProcessGetWindow($iPID, $iRet=-1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
У меня вопрос по поводу библиотечной функции _INetSmtpMailCom.
Если возникает ошибка отправки письма то и возникает ошибка компиляции , как сделать чтобы возвращалось значение @error при ошибке, а не завершался скрипт?
Если возникает ошибка отправки письма то и возникает ошибка компиляции , как сделать чтобы возвращалось значение @error при ошибке, а не завершался скрипт?
Luffy3761 00:07 18-12-2008
Цитата:
Скрипт не должен завершаться, какая версия функции используется, эта?
Цитата:
как сделать чтобы возвращалось значение @error при ошибке, а не завершался скрипт?
Скрипт не должен завершаться, какая версия функции используется, эта?
ViSiToR
Нет у меня другая была, спасибо за помощь
Нет у меня другая была, спасибо за помощь
Цитата:
ViSiToR
Функцией _ProcessGetWindow():
Спасибо!
Заработало!
есть скрипт распаковывающий zip архивы он использует udf
от KXM`а
http://www.autoitscript.com/forum/index.php?showtopic=17727&hl=xzip.dll&st=0
но я его немного переработал.
[more=udf]
Код: ; ======================================================================================
; Zip UDFs based on standared fileOpen()/fileClose() system
; Based on other people's work.
;
; Only the more basic function of XZip are represnted (poorly)
;
; Requires: XZip.dll:
; http://xstandard.com/printer-friendly.asp?id=C9891D8A-5390-44ED-BC60-2267ED6763A7
; ======================================================================================
#include-once
#include <array.au3>
#include <file.au3>
Global $oXZip_UDFGlobal, $sZipPath_UDFGlobal, $oComError_UDFGlobal, $sDllLoc_UDFGlobal, $iRegDelay_UDFGlobal
; ============================================================================
; Turned off COM erroring
; I don't think it's needed if the scripter is not directly interacting with
; the object, plus it causes an error with my choosen exit(_ZipClose) method
; ============================================================================
;$oComError_UDFGlobal = ObjEvent("AutoIt.Error", "__XZip_COM_Error")
;===============================================================================
;
; Description: :Open ZIP file, and load XZip.dll as a service
; Parameter(s): :Archive path, (Opt)XZip.dll path (default to @ScriptDir),
; (opt)Delay between regsrv, and objcreate (default 150 ms)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipOpen(ArchivePath, XZipDllPath, Delay in MS)
;
;===============================================================================
;
Func __ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 200)
If $sDllPath = '' Then $sDllPath = @ScriptDir & '\XZip.dll'
;some error checking
If Not FileExists($sDllPath) Then
SetError(1)
Return False
ElseIf Not IsInt($iDelay) Then
SetError(2)
Return False
EndIf
;set the globals
$sZipPath_UDFGlobal = $sNewArchivePath
$sDllLoc_UDFGlobal = $sDllPath
$iRegDelay_UDFGlobal = $iDelay
___DOSStart('regsvr32 /s "' & $sDllLoc_UDFGlobal & '"')
Sleep($iRegDelay_UDFGlobal) ;needs a sec when loaded silent.
$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')
If IsObj($oXZip_UDFGlobal) Then ;make sure it's opened
Return True
Else
SetError(3)
Return False
EndIf
EndFunc ;==>_ZipOpen
;===============================================================================
;
; Description: :List items in given Zip file
; Parameter(s): :None (see _ZipOpen)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :Array contaning archive contents
; User CallTip: :_ZipContents()
;
;===============================================================================
;
Func __ZipContents() ;this func needs some more work
Local $oItem
Local $aRet[1]
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
For $oItem In $oXZip_UDFGlobal.Contents ($sZipPath_UDFGlobal)
_ArrayAdd($aRet, $oItem.Path & $oItem.Name)
Next
$aRet[0] = UBound($aRet)
Return $aRet
EndFunc ;==>_ZipContents
;===============================================================================
;
; Description: :Add items to opened Zip file
; Parameter(s): :Array contaning item paths, (opt)Retain dir structure
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPack(array of item paths, Bool)
;
;===============================================================================
;
Func __ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
Local $x
For $x = 0 To UBound($aItems) - 1
If Not FileExists($aItems[$x]) Then
SetError(2)
SetExtended($aItems[$x])
Return False
EndIf
$oXZip_UDFGlobal.Pack ($aItems[$x], $sZipPath_UDFGlobal, $bKeepPath)
Next
Return True
EndFunc ;==>_ZipPackGroup
;===============================================================================
;
; Description: :Add all items in a dir to opened Zip file
; Parameter(s): :String dir path
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPackDir(DirPath)
;
;===============================================================================
;
Func __ZipPackDir($sDirPath) ;this is the one that I needed, so it works well
Local $aFiles, $x, $i, $aDirs[1], $sStartDir, $sWorkingDir, $sNewDirPath, $iInsert, $sDirInZip
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
ElseIf Not StringInStr(FileGetAttrib($sDirPath), 'D') Then
SetError(2)
Return False
EndIf
$sStartDir = $sDirPath
$aDirs[0] = $sDirPath
$i = 0
; ===========================================================
; This loop might have some unneeded code, because it took a
; lot of trys to get it right. Also some error more checking,
; optimization and clean couldn't hurt. But it works! ;)
; ===========================================================
Do
$sWorkingDir = $aDirs[$i] & '\'
$aFiles = _FileListToArray ($aDirs[$i])
For $x = 1 To UBound($aFiles) - 1
If StringInStr(FileGetAttrib($aFiles[$x]), 'D') Then
$sNewDirPath = $sDirPath & '\' & $aFiles[$x]
$iInsert = $i + 1
_ArrayInsert($aDirs, $iInsert, $sNewDirPath)
Else
$sDirInZip = StringReplace($sWorkingDir, $sDirPath, '')
$oXZip_UDFGlobal.Pack ($sWorkingDir & $aFiles[$x], $sZipPath_UDFGlobal, 1, $sDirInZip)
EndIf
Next
$i = $i + 1
$aFiles = ''
Until UBound($aDirs) = $i
Return True
EndFunc ;==>_ZipPackDir
;===============================================================================
;
; Description: :Unpack a zip file
; Parameter(s): :String: Path to extract Zip file to
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipUnpack(ExtractPath)
;
;===============================================================================
;
Func __ZipUnpack($sDestPath)
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
If Not FileExists($sDestPath) Then DirCreate($sDestPath)
$oXZip_UDFGlobal.UnPack ($sZipPath_UDFGlobal, $sDestPath)
Return True
EndFunc ;==>_ZipUnpack
;===============================================================================
;
; Description: :Close ZIP file, and unload XZip.dll as a service
; Parameter(s): :None, based on _ZipOpen globals
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipClose(XZipDllPath, Delay in MS)
;
;===============================================================================
;
Func __ZipClose()
;some error checking
If Not FileExists($sDllLoc_UDFGlobal) Then
SetError(1)
Return False
EndIf
___DOSStart('regsvr32 /s /u "' & $sDllLoc_UDFGlobal & '"')
Sleep($iRegDelay_UDFGlobal) ;needs a sec when unloaded silently.
; =====================================================
; This way of checking will cause a COM error
; but I like to confirm that the object's been closed
; =====================================================
$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')
If Not IsObj($oXZip_UDFGlobal) Then ;make sure it's closed
;reset globals, for next call
$sZipPath_UDFGlobal = ''
$sDllLoc_UDFGlobal = ''
$iRegDelay_UDFGlobal = 0
$oXZip_UDFGlobal = ''
Return True
Else
SetError(2)
Return False
EndIf
EndFunc ;==>_ZipClose
;helper functions
Func ___XZip_COM_Error()
Local $hNumber = Hex($oComError_UDFGlobal.number, 8)
;blantly stolen from SvenP (We'll call it a 'port')
MsgBox(0, 'XZip Com Error', 'There was COM Error!' & @CRLF & @CRLF & _
'description is: ' & @TAB & $oComError_UDFGlobal.description & @CRLF & _
'windescription:' & @TAB & $oComError_UDFGlobal.windescription & @CRLF & _
'number is: ' & @TAB & $hNumber & @CRLF & _
'lastdllerror is: ' & @TAB & $oComError_UDFGlobal.lastdllerror & @CRLF & _
'scriptline is: ' & @TAB & $oComError_UDFGlobal.scriptline & @CRLF & _
'source is: ' & @TAB & $oComError_UDFGlobal.source & @CRLF & _
'helpfile is: ' & @TAB & $oComError_UDFGlobal.helpfile & @CRLF & _
'helpcontext is: ' & @TAB & $oComError_UDFGlobal.helpcontext _
)
SetError(1)
EndFunc ;==>__XZip_COM_Error
Func ___DOSStart($sStart)
Run(@ComSpec & ' /c start ' & $sStart, '', @SW_HIDE)
WHILE 1
IF RegRead ( 'HKEY_CLASSES_ROOT\CLSID\{13D6BDE3-46AA-4FF2-A622-EBC43110D95C}', "" ) <> "" THEN ExitLoop
Sleep(10)
WEnd
EndFunc ;==>__DOSStart
#cs UserCalltips
_ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 150)
_ZipContents()
_ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
_ZipPackDir(DirPath)
_ZipUnpack($sDestPath)
_ZipClose($sDllPath = '', $iDelay = 150)
#ce
от KXM`а
http://www.autoitscript.com/forum/index.php?showtopic=17727&hl=xzip.dll&st=0
но я его немного переработал.
[more=udf]
Код: ; ======================================================================================
; Zip UDFs based on standared fileOpen()/fileClose() system
; Based on other people's work.
;
; Only the more basic function of XZip are represnted (poorly)
;
; Requires: XZip.dll:
; http://xstandard.com/printer-friendly.asp?id=C9891D8A-5390-44ED-BC60-2267ED6763A7
; ======================================================================================
#include-once
#include <array.au3>
#include <file.au3>
Global $oXZip_UDFGlobal, $sZipPath_UDFGlobal, $oComError_UDFGlobal, $sDllLoc_UDFGlobal, $iRegDelay_UDFGlobal
; ============================================================================
; Turned off COM erroring
; I don't think it's needed if the scripter is not directly interacting with
; the object, plus it causes an error with my choosen exit(_ZipClose) method
; ============================================================================
;$oComError_UDFGlobal = ObjEvent("AutoIt.Error", "__XZip_COM_Error")
;===============================================================================
;
; Description: :Open ZIP file, and load XZip.dll as a service
; Parameter(s): :Archive path, (Opt)XZip.dll path (default to @ScriptDir),
; (opt)Delay between regsrv, and objcreate (default 150 ms)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipOpen(ArchivePath, XZipDllPath, Delay in MS)
;
;===============================================================================
;
Func __ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 200)
If $sDllPath = '' Then $sDllPath = @ScriptDir & '\XZip.dll'
;some error checking
If Not FileExists($sDllPath) Then
SetError(1)
Return False
ElseIf Not IsInt($iDelay) Then
SetError(2)
Return False
EndIf
;set the globals
$sZipPath_UDFGlobal = $sNewArchivePath
$sDllLoc_UDFGlobal = $sDllPath
$iRegDelay_UDFGlobal = $iDelay
___DOSStart('regsvr32 /s "' & $sDllLoc_UDFGlobal & '"')
Sleep($iRegDelay_UDFGlobal) ;needs a sec when loaded silent.
$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')
If IsObj($oXZip_UDFGlobal) Then ;make sure it's opened
Return True
Else
SetError(3)
Return False
EndIf
EndFunc ;==>_ZipOpen
;===============================================================================
;
; Description: :List items in given Zip file
; Parameter(s): :None (see _ZipOpen)
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :Array contaning archive contents
; User CallTip: :_ZipContents()
;
;===============================================================================
;
Func __ZipContents() ;this func needs some more work
Local $oItem
Local $aRet[1]
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
For $oItem In $oXZip_UDFGlobal.Contents ($sZipPath_UDFGlobal)
_ArrayAdd($aRet, $oItem.Path & $oItem.Name)
Next
$aRet[0] = UBound($aRet)
Return $aRet
EndFunc ;==>_ZipContents
;===============================================================================
;
; Description: :Add items to opened Zip file
; Parameter(s): :Array contaning item paths, (opt)Retain dir structure
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPack(array of item paths, Bool)
;
;===============================================================================
;
Func __ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
Local $x
For $x = 0 To UBound($aItems) - 1
If Not FileExists($aItems[$x]) Then
SetError(2)
SetExtended($aItems[$x])
Return False
EndIf
$oXZip_UDFGlobal.Pack ($aItems[$x], $sZipPath_UDFGlobal, $bKeepPath)
Next
Return True
EndFunc ;==>_ZipPackGroup
;===============================================================================
;
; Description: :Add all items in a dir to opened Zip file
; Parameter(s): :String dir path
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipPackDir(DirPath)
;
;===============================================================================
;
Func __ZipPackDir($sDirPath) ;this is the one that I needed, so it works well
Local $aFiles, $x, $i, $aDirs[1], $sStartDir, $sWorkingDir, $sNewDirPath, $iInsert, $sDirInZip
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
ElseIf Not StringInStr(FileGetAttrib($sDirPath), 'D') Then
SetError(2)
Return False
EndIf
$sStartDir = $sDirPath
$aDirs[0] = $sDirPath
$i = 0
; ===========================================================
; This loop might have some unneeded code, because it took a
; lot of trys to get it right. Also some error more checking,
; optimization and clean couldn't hurt. But it works! ;)
; ===========================================================
Do
$sWorkingDir = $aDirs[$i] & '\'
$aFiles = _FileListToArray ($aDirs[$i])
For $x = 1 To UBound($aFiles) - 1
If StringInStr(FileGetAttrib($aFiles[$x]), 'D') Then
$sNewDirPath = $sDirPath & '\' & $aFiles[$x]
$iInsert = $i + 1
_ArrayInsert($aDirs, $iInsert, $sNewDirPath)
Else
$sDirInZip = StringReplace($sWorkingDir, $sDirPath, '')
$oXZip_UDFGlobal.Pack ($sWorkingDir & $aFiles[$x], $sZipPath_UDFGlobal, 1, $sDirInZip)
EndIf
Next
$i = $i + 1
$aFiles = ''
Until UBound($aDirs) = $i
Return True
EndFunc ;==>_ZipPackDir
;===============================================================================
;
; Description: :Unpack a zip file
; Parameter(s): :String: Path to extract Zip file to
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipUnpack(ExtractPath)
;
;===============================================================================
;
Func __ZipUnpack($sDestPath)
If Not IsObj($oXZip_UDFGlobal) Then
SetError(1)
Return False
EndIf
If Not FileExists($sDestPath) Then DirCreate($sDestPath)
$oXZip_UDFGlobal.UnPack ($sZipPath_UDFGlobal, $sDestPath)
Return True
EndFunc ;==>_ZipUnpack
;===============================================================================
;
; Description: :Close ZIP file, and unload XZip.dll as a service
; Parameter(s): :None, based on _ZipOpen globals
; Requirement: :XZip.dll, XZip.au3
; Return Value(s): :True/False (error #)
; User CallTip: :_ZipClose(XZipDllPath, Delay in MS)
;
;===============================================================================
;
Func __ZipClose()
;some error checking
If Not FileExists($sDllLoc_UDFGlobal) Then
SetError(1)
Return False
EndIf
___DOSStart('regsvr32 /s /u "' & $sDllLoc_UDFGlobal & '"')
Sleep($iRegDelay_UDFGlobal) ;needs a sec when unloaded silently.
; =====================================================
; This way of checking will cause a COM error
; but I like to confirm that the object's been closed
; =====================================================
$oXZip_UDFGlobal = ObjCreate('XStandard.Zip')
If Not IsObj($oXZip_UDFGlobal) Then ;make sure it's closed
;reset globals, for next call
$sZipPath_UDFGlobal = ''
$sDllLoc_UDFGlobal = ''
$iRegDelay_UDFGlobal = 0
$oXZip_UDFGlobal = ''
Return True
Else
SetError(2)
Return False
EndIf
EndFunc ;==>_ZipClose
;helper functions
Func ___XZip_COM_Error()
Local $hNumber = Hex($oComError_UDFGlobal.number, 8)
;blantly stolen from SvenP (We'll call it a 'port')
MsgBox(0, 'XZip Com Error', 'There was COM Error!' & @CRLF & @CRLF & _
'description is: ' & @TAB & $oComError_UDFGlobal.description & @CRLF & _
'windescription:' & @TAB & $oComError_UDFGlobal.windescription & @CRLF & _
'number is: ' & @TAB & $hNumber & @CRLF & _
'lastdllerror is: ' & @TAB & $oComError_UDFGlobal.lastdllerror & @CRLF & _
'scriptline is: ' & @TAB & $oComError_UDFGlobal.scriptline & @CRLF & _
'source is: ' & @TAB & $oComError_UDFGlobal.source & @CRLF & _
'helpfile is: ' & @TAB & $oComError_UDFGlobal.helpfile & @CRLF & _
'helpcontext is: ' & @TAB & $oComError_UDFGlobal.helpcontext _
)
SetError(1)
EndFunc ;==>__XZip_COM_Error
Func ___DOSStart($sStart)
Run(@ComSpec & ' /c start ' & $sStart, '', @SW_HIDE)
WHILE 1
IF RegRead ( 'HKEY_CLASSES_ROOT\CLSID\{13D6BDE3-46AA-4FF2-A622-EBC43110D95C}', "" ) <> "" THEN ExitLoop
Sleep(10)
WEnd
EndFunc ;==>__DOSStart
#cs UserCalltips
_ZipOpen($sNewArchivePath, $sDllPath = '', $iDelay = 150)
_ZipContents()
_ZipPackGroup(ByRef $aItems, $bKeepPath = True) ;this func needs some more work
_ZipPackDir(DirPath)
_ZipUnpack($sDestPath)
_ZipClose($sDllPath = '', $iDelay = 150)
#ce
NORIO
Цитата:
А не проще будет спросить у автора этой UDF?
Цитата:
Попробуй отлавливать ошибку:
Пример:
Код: Dim $objWMIService, $objItem, $colItems, $strComputer = "."
$oAutoitError = ObjEvent("AutoIt.Error", "ErrorFunc")
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_DiskDrive ")
For $objItem In $colItems
ConsoleWrite("Availability: " & $objItem.Availability1 & @LF & _
"Caption: " & $objItem.Caption & @LF)
Next
Func ErrorFunc()
MsgBox(0, "COM Error", "Error windescription: " & @TAB & $oAutoitError.windescription)
SetError(1)
EndFunc
Цитата:
Подскажите пожалуйста решение ликвидации этого бага.
А не проще будет спросить у автора этой UDF?
Цитата:
но будет здорово даже если удасться её обработать в скрипте без его завершения
Попробуй отлавливать ошибку:
Пример:
Код: Dim $objWMIService, $objItem, $colItems, $strComputer = "."
$oAutoitError = ObjEvent("AutoIt.Error", "ErrorFunc")
$objWMIService = ObjGet("winmgmts:{impersonationLevel=impersonate}!\\" & $strComputer & "\root\cimv2")
$colItems = $objWMIService.ExecQuery("Select * from Win32_DiskDrive ")
For $objItem In $colItems
ConsoleWrite("Availability: " & $objItem.Availability1 & @LF & _
"Caption: " & $objItem.Caption & @LF)
Next
Func ErrorFunc()
MsgBox(0, "COM Error", "Error windescription: " & @TAB & $oAutoitError.windescription)
SetError(1)
EndFunc
Добрый день!
Подскажите пожалуйста, возможно ли получить ID окна по его заголовку и тексту?
Подскажите пожалуйста, возможно ли получить ID окна по его заголовку и тексту?
Nikkorot
Цитата:
Имеется в виду handle?
WinGetHandle("Title", "Text")
Цитата:
получить ID окна по его заголовку и тексту?
Имеется в виду handle?
WinGetHandle("Title", "Text")
Maza_Faka
Нет, handle при каждом перезапуске программы получается разный. а вот ID,который в AutoIt Info на вкладке control также и обозначается как ID, постоянный.
Нет, handle при каждом перезапуске программы получается разный. а вот ID,который в AutoIt Info на вкладке control также и обозначается как ID, постоянный.
Всем доброго дня
подскажите как получить путь до файла по имени просесса?
в справке не нашел
Блин сорри в шапке не увидел, ведь все есть ))))
подскажите как получить путь до файла по имени просесса?
в справке не нашел
Блин сорри в шапке не увидел, ведь все есть ))))
Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
Предыдущая тема: Quintura Search
Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.