|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вывод ErrorLogs системы в GUICtrlListView с расшифровкой кодов в отдельном окне формы |
|
||||
|
|
[решено] Вывод ErrorLogs системы в GUICtrlListView с расшифровкой кодов в отдельном окне формы
|
|
Ветеран Сообщения: 904 |
Собственно, проблема:
получить вывод в окно формы логов ошибочных событий системы и, затем, используя полученные в списке GUICtrlListView коды ошибок, получить их расшифровку в отдельном окне GUICtrlEdit. Последовательность действий: 1. получаем в cmd список ErrorLogs (команда CSCRIPT %SYSTEMROOT%\system32\EVENTQUERY.vbs /v /fo TABLE /NH), 2. выводим полученный список ErrorLogs в GUICtrlListView, 3. выделяем любую строку списка в GUICtrlListView, 4. получаем в окне GUICtrlEdit информацию по данной ошибке (используя команду net helpmsg <код ошибки>). Тема является продолжением http://forum.oszone.net/thread-183492.html последний код (спасибо madmasles): Собственно, незакрытый вопрос по этому коду: обнаружено ограничение на длину строки (кол-во выводимых символов) в GUICtrlListView - "не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков)"- (пост http://forum.oszone.net/post-1478325-12.html) |
|
|
Отправлено: 17:04, 21-08-2010 |
|
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
Цитата:
|
|
|
Отправлено: 17:21, 21-08-2010 | #2 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата saavaage:
Строка обрезается (260 символов), однако Item содержит полную строку как она была передана, и её можно извлечь. Я бы делал так: For $i = 1 To UBound($aToList) - 1 If StringLen($aToList[$i]) >= 260 Then $aToList[$i] = StringLeft($aToList[$i], 256) & "..." EndIf _GUICtrlListView_AddItem($hListView, $aToList[$i]) Next |
|
|
------- Отправлено: 17:37, 21-08-2010 | #3 |
|
Ветеран Сообщения: 904
|
Профиль | Отправить PM | Цитировать madmasles, тоже "ходил" на оф. форум и, насколько понял, это ограничение связано с системными делами XP.
|
|
------- Отправлено: 17:45, 21-08-2010 | #4 |
|
Ветеран Сообщения: 904
|
Профиль | Отправить PM | Цитировать Creat0R, у меня особой разницы не получилось... В первом случае - просто обрыв строки, во-втором - обрыв + добавляется "..." (что, в принципе логично, исходя из кода).
madmasles, Creat0R, а возможно ли ее извлечь по принципу расшифровки ошибки по коду, т.е. создать еще одно GUICtrlEdit и тупо выводить туда строку, которую выделяешь в GUICtrlListView, только полностью. Суть - будет 3 окна: 1. список GUICtrlListView, 2. GUICtrlEdit1 с расшифровкой кода выделенной строки GUICtrlListView, 3. GUICtrlEdit2 с полным выводом выделенной строки из GUICtrlListView. |
|
|
------- Отправлено: 18:01, 21-08-2010 | #5 |
|
Ветеран Сообщения: 904
|
Профиль | Отправить PM | Цитировать Вот, что, собственно, у меня вышло:
Аналогично с кодом в шапке: Кстати, есть вопрос по последнему коду: почему-то, при клике на строке в окне GUICtrlCreateListView, происходит ее выделение, а при попытке кликнуть по другой строке не происходит выделение последней. Система кликов-выделений срабатывает через клик. |
|
Последний раз редактировалось saavaage, 21-08-2010 в 19:34. Отправлено: 18:53, 21-08-2010 | #6 |
|
Must AutoIt Сообщения: 3054
|
Профиль | Сайт | Отправить PM | Цитировать Цитата saavaage:
Цитата Creat0R:
Цитата saavaage:
#include <Encoding.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
;Opt('MustDeclareVars', 1)
Global $hForm1, $hButton1, $hInput, $ListView, $hListView, $aErrorsNew, $nMsg
Dim $aToList = __ErrorLog()
$hForm1 = GUICreate("Form1", 620, 445, -1, -1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$hButton1 = GUICtrlCreateButton("Обновить", 16, 120, 65, 57)
$hInput = GUICtrlCreateEdit('', 95, 10, 400, 34, BitOR($ES_READONLY, $ES_MULTILINE))
$hInputAll = GUICtrlCreateEdit('', 95, 385, 400, 55, BitOR($ES_READONLY, $ES_MULTILINE, $WS_VSCROLL))
$ListView = GUICtrlCreateListView('Список событий с ошибками', 95, 60, 400, 320, -1, $LVS_EX_GRIDLINES)
GUICtrlSetState(-1, $GUI_FOCUS)
$hListView = GUICtrlGetHandle($ListView)
_GUICtrlListView_SetColumnWidth($hListView, 0, 2000)
GUICtrlSetTip(-1, "Выделите мышкой строку," & @CRLF & "чтобы получить подсказку.")
If $aToList <> 0 Then
_GUICtrlListView_AddColumn($hListView, '')
For $i = 1 To UBound($aToList) - 1
_GUICtrlListView_AddItem($hListView, $aToList[$i])
Next
_GUICtrlListView_SetItemSelected($hListView, 0)
EndIf
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $hButton1
GUICtrlSetData($hInput, '')
GUICtrlSetData($hInputAll, '')
$aErrorsNew = __ErrorLog()
If $aErrorsNew <> 0 Then
_GUICtrlListView_DeleteAllItems($hListView)
For $i = 1 To UBound($aErrorsNew) - 1
_GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
Next
_GUICtrlListView_SetItemSelected($hListView, 0)
EndIf
GUICtrlSetState($hButton1, $GUI_ENABLE)
GUICtrlSetState($ListView, $GUI_FOCUS)
EndSwitch
WEnd
Func __ErrorLog()
GUICtrlSetState($hButton1, $GUI_DISABLE)
Local $sLog = '', $hError, $aErrorsTemp, $i
Dim $aErrors[1]
$hError = Run('CSCRIPT.exe ' & @SystemDir & '\eventquery.vbs /v /fi "Type eq ERROR" /fo TABLE /NH', '', @SW_HIDE, $STDOUT_CHILD)
While 1
$sLog &= StdoutRead($hError)
If @error Then ExitLoop
;Sleep(10)
WEnd
If Not $sLog Then Return 0
$aErrorsTemp = StringSplit(_Encoding_866To1251($sLog), @LF)
If Not IsArray($aErrorsTemp) Then Return 0
Dim $aErrors[$aErrorsTemp[0]]
For $i = 1 To $aErrorsTemp[0]
If StringInStr($aErrorsTemp[$i], "ошибка") Then
$aErrors[0] += 1
$aErrors[$aErrors[0]] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
EndIf
Next
If $aErrors[0] < 1 Then Return 0
ReDim $aErrors[$aErrors[0]+1]
Return $aErrors
EndFunc ;==>__ErrorLog
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $hFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')
Switch $hFrom
Case $hListView
Switch $ID
Case $LVN_ITEMCHANGED
If (BitAND(DllStructGetData($tNMITEMACTIVATE, 'Changed'), $LVIF_STATE)) And _
(BitAND(DllStructGetData($tNMITEMACTIVATE, 'NewState'), $LVIS_SELECTED)) _
And (Not BitAND(DllStructGetData($tNMITEMACTIVATE, 'OldState'), $LVIS_FOCUSED)) Then
_ErrorHelp($Index)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _ErrorHelp($Index)
Local $iNumberError, $hHelp, $sLog = ''
GUICtrlSetState($hButton1, $GUI_DISABLE)
GUICtrlSetState($hListView, $GUI_DISABLE)
$sItemText = _GUICtrlListView_GetItemText($hListView, $Index)
$iNumberError = StringRegExpReplace($sItemText, "(?s).*?ошибка (.*?)\s+?.*", '\1')
$hHelp = Run('net helpmsg ' & $iNumberError, '', @SW_HIDE, $STDOUT_CHILD)
While 1
$sLog &= StdoutRead($hHelp)
If @error Then ExitLoop
;Sleep(10)
WEnd
$sLog = StringStripWS(StringStripCR(_Encoding_866To1251($sLog)), 7)
GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & ' - ' & $sLog)
GUICtrlSetData($hInputAll, $sItemText)
GUICtrlSetState($hButton1, $GUI_ENABLE)
GUICtrlSetState($hListView, $GUI_ENABLE)
EndFunc ;==>_ErrorHelp
Цитата saavaage:
|
||||
|
------- Отправлено: 19:43, 21-08-2010 | #7 |
|
Ветеран Сообщения: 904
|
Профиль | Отправить PM | Цитировать Creat0R, я имел ввиду последняя - та, по которой кликнул в последний раз! :-) Понял - просто было подвисание, которое вы убрали. Спасибо.
|
|
------- Отправлено: 19:51, 21-08-2010 | #8 |
|
Ветеран Сообщения: 812
|
Профиль | Отправить PM | Цитировать saavaage,
Вот что у меня получилось с полным отображением строк. Строки делятся на части и вставляются в разные колонки одной строки: |
|
Последний раз редактировалось madmasles, 21-08-2010 в 20:33. Причина: поправил код Отправлено: 20:09, 21-08-2010 | #9 |
|
Ветеран Сообщения: 904
|
Профиль | Отправить PM | Цитировать madmasles, работает! Но, имхо, лучше для восприятия информации, вариант - с выводом полной информации в GuiCtrlEdit. Легче считывать инфу.
Посмотрите, кстати, что предложил Creat0R для ускорения скрипта (пост №7). Раньше у меня было небольшое подвисание (иногда клик по строке происходил через раз), теперь все гут. madmasles, Creat0R, Спасибо за Помощь! Тема решена! |
|
------- Отправлено: 20:21, 21-08-2010 | #10 |
|
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| Проблемка окне "Свойства системы" ! | LP92 | Проект WinStyle | 1 | 28-03-2010 03:43 | |
| Delphi - скажите а есть какой то учебник с расшифровкой команд к Delphi? | ShadowMas | Программирование и базы данных | 8 | 18-10-2008 22:24 | |
| Проблема с расшифровкой данных | xDinox | Microsoft Windows NT/2000/2003 | 3 | 17-08-2007 13:32 | |
| Delphi - WinApi||C++Builder(Delphi) SplashScreen в отдельном потоке? | XCodeR | Программирование и базы данных | 4 | 12-03-2007 19:51 | |
| LILO и WinMe на отдельном х-драйве | penguinius | Общий по Linux | 6 | 28-05-2005 21:30 | |
|