Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вывод ErrorLogs системы в GUICtrlListView с расшифровкой кодов в отдельном окне формы

Ответить
Настройки темы
[решено] Вывод ErrorLogs системы в GUICtrlListView с расшифровкой кодов в отдельном окне формы

Ветеран


Сообщения: 904
Благодарности: 162


Конфигурация

Профиль | Отправить PM | Цитировать


Собственно, проблема:
получить вывод в окно формы логов ошибочных событий системы и, затем, используя полученные в списке 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):

читать дальше »
Код: Выделить весь код
#include <Constants.au3>
#include <Encoding.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))
$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, '')
            $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 = '', $j = 0, $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
    For $i = 1 To $aErrorsTemp[0]
        If StringInStr($aErrorsTemp[$i], "ошибка") Then
            ReDim $aErrors[UBound($aErrors) + 1]
            $j += 1
            $aErrors[$j] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
        EndIf
    Next
    $aErrors[0] = UBound($aErrors) - 1
    If UBound($aErrors) < 2 Then Return 0
    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)
    $iNumberError = StringRegExpReplace(_GUICtrlListView_GetItemText($hListView, $Index), "(?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)
    GUICtrlSetState($hButton1, $GUI_ENABLE)
    GUICtrlSetState($hListView, $GUI_ENABLE)
EndFunc   ;==>_ErrorHelp


Собственно, незакрытый вопрос по этому коду:
обнаружено ограничение на длину строки (кол-во выводимых символов) в GUICtrlListView - "не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков)"- (пост http://forum.oszone.net/post-1478325-12.html)

Отправлено: 17:04, 21-08-2010

 

Ветеран


Сообщения: 904
Благодарности: 162

Профиль | Отправить PM | Цитировать


Убрал, имхо, за ненадобностью строки из скрипта (пост 7):

Код: Выделить весь код
GUICtrlSetTip(-1, "Выделите мышкой строку," & @CRLF & "чтобы получить подсказку.")
и в Func _ErrorHelp($Index):
в начале:
Код: Выделить весь код
GUICtrlSetState($hButton1, $GUI_DISABLE)
GUICtrlSetState($hListView, $GUI_DISABLE)
в конце:
Код: Выделить весь код
GUICtrlSetState($hButton1, $GUI_ENABLE)
GUICtrlSetState($hListView, $GUI_ENABLE)
Окончательный код:
читать дальше »
Код: Выделить весь код
#include <Encoding.au3>
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>


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

-------
мы рождены, чтоб сказку сделать былью


Отправлено: 22:59, 22-08-2010 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Вывод ErrorLogs системы в GUICtrlListView с расшифровкой кодов в отдельном окне формы

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Проблемка окне "Свойства системы" ! 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




 
Переход