powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / запись сообщений в EventLog ?
3 сообщений из 3, страница 1 из 1
запись сообщений в EventLog ?
    #34058130
Ant-ON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть вопрос. хочу, чтобы софтина писала события в системный EventLog. знаю об WinAPI ReportEvent. знаю о том, что для коректного отображения событий нужно прописывать в реестре пути к файлам с ресурсами, содержащими категории и сообщения (и их коды). что расписанный в msdn способ писать с помощью объекта App работает только с компиленным экзешником (естессно, а как же, - в реестре же не пропишешь путь к еще не откомпилированному файлу, содержащему коды и описания сообщений.
я даже компилировал res-файлы с помощью mc.exe rc.exe, и в этих res-файлах писал всё, как рекомендуют в многочисленных статьях в рунете (одинаковых слово в слово, но на разных ресурсах).

а получалось только одно: прописывались только категории сообщений. сами сообщения по кодам в EventLog не прописывались.

поможите, люди добрые. расскажите, что нужно писать в res-файл. как нужно вызывать ReportEvent. где размещать ресурсы - действительно в отдельной DLL или всё-таки можно и в самом экзешнике. в общем, что нужно делать, чтобы сообщение в EventLog'е имело нормальный вид, а не такой:
-----
Не найдено описание для события с кодом ( 0 ) в источнике ( MyApplication ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL сообщений для отображения сообщений удаленного компьютера. В записи события содержится следующая информация [skipped]
-----
поиск курил.
...
Рейтинг: 0 / 0
запись сообщений в EventLog ?
    #34058196
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
Private Declare Function RegisterEventSource Lib "advapi32.dll" Alias "RegisterEventSourceA" (ByVal lpUNCServerName As String, ByVal lpSourceName As String) As Long
Private Declare Function DeregisterEventSource Lib "advapi32.dll" (ByVal hEventLog As Long) As Long
Private Declare Function ReportEvent Lib "advapi32.dll" Alias "ReportEventA" (ByVal hEventLog As Long, ByVal wType As Integer, ByVal wCategory As Integer, ByVal dwEventID As Long, ByVal lpUserSid As Any, ByVal wNumStrings As Integer, ByVal dwDataSize As Long, plpStrings As Long, lpRawData As Any) As Boolean
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long

Enum EventTypeEnum
  EVENTLOG_SUCCESS =  0 
  EVENTLOG_ERROR_TYPE =  1 
  EVENTLOG_WARNING_TYPE =  2 
  EVENTLOG_INFORMATION_TYPE =  4 
  EVENTLOG_AUDIT_SUCCESS =  8 
  EVENTLOG_AUDIT_FAILURE =  10 
End Enum

Public Sub LogNTEvent(EventString As String, Optional EvenType As EventTypeEnum = EVENTLOG_INFORMATION_TYPE)
Const EVT_PATH = "SYSTEM\CurrentControlSet\Services\EventLog\Application\"
Dim hEventLog As Long
Dim hMsgs As Long
Dim cbStringSize As Long
  
  On Error GoTo ErrorHandler
  
  Dim EventID As Long
  Select Case EvenType
    Case EVENTLOG_SUCCESS:          EventID = &H0
    Case EVENTLOG_ERROR_TYPE:       EventID = &HC0000001
    Case EVENTLOG_WARNING_TYPE:     EventID = &H80000002
    Case EVENTLOG_INFORMATION_TYPE: EventID = &H40000004
  End Select
  
  ' Register application
  Dim EventMessageFile As String

  EventMessageFile = App.Path & "\" & App.EXEName & ".DLL" 'или .EXE
  If RegGetKeyValue(HKEY_LOCAL_MACHINE, EVT_PATH & App.EXEName, "EventMessageFile") <> EventMessageFile Then
    RegSetKeyValue HKEY_LOCAL_MACHINE, EVT_PATH & App.EXEName, "EventMessageFile", App.Path & "\" & App.EXEName & ".DLL"
  End If
  
  ' Write to event log
  hEventLog = RegisterEventSource("", App.EXEName)
  If hEventLog =  0  Then 
      Err.Raise  13 , "LogNTEvent", "RegisterEventSource failed " & Err.LastDllError
  end if
  cbStringSize = Len(EventString) +  1 
  hMsgs = GlobalAlloc(&H40, cbStringSize)
  If hMsgs =  0  Then Err.Raise  13 
  CopyMemory ByVal hMsgs, ByVal EventString, cbStringSize
  Call ReportEvent(hEventLog, EvenType,  0 , EventID,  0 &,  1 ,  0 , hMsgs,  0 )
  Call GlobalFree(hMsgs)
  Call DeregisterEventSource(hEventLog)
  
  Exit Sub
ErrorHandler:
  If hMsgs <>  0  Then Call GlobalFree(hMsgs)
  If hEventLog <>  0  Then Call DeregisterEventSource(hEventLog)
End Sub
...
Рейтинг: 0 / 0
запись сообщений в EventLog ?
    #34071904
Ant-ON
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
поместил приведенный выше код в отдельный модуль.
вызываю так:
Код: plaintext
log.LogNTEvent "my first",  1 ,  1 

получаю в EventViewer:
авторНе найдено описание для события с кодом ( 1 ) в источнике ( Project1 ). Возможно, на локальном компьютере нет нужных данных в реестре или файлов DLL сообщений для отображения сообщений удаленного компьютера. Попробуйте использовать ключ /AUXSOURCE= для получения этого описания, - дополнительные сведения об этом содержатся в справке. В записи события содержится следующая информация: my first.

попробовал откомпилировать экзешник - та же ботва.
именно обо всём этом я говорил в первом сообщении ветки.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / запись сообщений в EventLog ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]