熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

使用.NET從VB6中訪問事件日志

2022-06-13   來源: .NET編程 

簡介

  Visual Basic 可通過AppLogEvent寫入事件日志但是此 API 有許多嚴格的限制首先不能為事件定義來源(在事件查看器中始終顯示為VBRuntime而且不能指定事件 ID 或事件類別還限制您只能寫入應用程序事件日志不能創建自己的自定義來源和日志

  通過使用 NET Framework 免費提供的類可以克服所有這些限制這樣可以使您有效地編寫應用程序以便用戶管理員或其他支持人員都可以查看日志來診斷問題

NET Framework EventLog 類

  NET Framework 提供了一個強大的 EventLog 類用它可以輕松地處理事件日志不過您不能直接從 VB 訪問此類依照 VB Fusion(英文)系列文章中的精神可以通過創建封裝 NET 類的 COM 包裝從 VB 中訪問此功能

  我還創建了一個練習此事件日志功能的示例 VB 應用程序



  圖 使用事件日志功能的 VB 應用程序


  創建包裝類時大部分工作只是將 NET 類型轉換為 VB 可以理解的類型GetEventLogs 方法通常返回一組 EventLog 對象不過不能直接從 VB 中使用這些 EventLog 對象但是下列 VBNET 函數將計算機上的所有事件日志的列表轉換為一組字符串VB 很容易就可以使用這些字符串通常您擁有系統事件日志安全性事件日志和應用程序事件日志但是某些應用程序還會創建自己的自定義事件日志而此方法還可以顯示這些事件日志

  清單 使用 VBNET 列出計算機上的所有事件日志

  Public Function GetEventLogs() As String() Dim logs(EventLogGetEventLogsLength ) As String Dim i As Integer = For Each el As EventLog In EventLogGetEventLogs() logs(i) = elLog i += Next Return logs End Function

  您可以看到EventLog 類使您能夠通過 GetEventLogs 函數訪問所有事件日志調用此函數後它就會遍歷結果並將所有事件日志名稱轉換為一組字符串然後可以將此 VBNET 代碼作為 COM 對象進行公開從而允許從 VB 中調用它

  從 VB 中調用此代碼以及(例如)用結果填充列表框就像下面這樣簡單

  清單 使用 VB 在列表框中顯示日志名稱

  Dim eventLog As NetFrameworkWrappersEventLogWrapper Set eventLog = New NetFrameworkWrappersEventLogWrapper lstEventLogsClear Dim logs() As String logs = eventLogGetEventLogs Dim log As Variant For Each log In logs lstEventLogsAddItem log Next

方法

  由於各種原因您可能希望應用程序能夠寫入事件日志當然應該將任何災難性錯誤都記錄到事件日志中因為此信息以後可以用來診斷問題您可能經常希望將不適合顯示給用戶的詳細信息寫入該事件日志中

  首先需要選擇使用哪個日志可以從系統事件日志安全性事件日志或應用程序事件日志中進行選擇應用程序事件日志幾乎總是正確的選擇但是如果需要也可以創建自己的自定義事件日志事件日志包裝中的下列 VBNET 代碼使您能夠創建自己的自定義日志

  清單 使用 VBNET 創建自定義事件日志

  Public Sub CreateEventSource(ByVal source As String ByVal logName As String) If EventLogSourceExists(source) Then EventLogDeleteEventSource(source) End If EventLogCreateEventSource(source logName) End Sub

  您可以看到使用 NET Framework 可以輕松創建事件日志NET CreateEventSource 方法幫您完成了所有工作此方法只提供了該功能以便可以從 VB 中輕松調用

  清單 使用包裝類從 VB 創建事件日志

  Dim eventLog As NetFrameworkWrappersEventLogWrapper Set eventLog = New NetFrameworkWrappersEventLogWrapper eventLogCreateEventSource MyApplication MyCustomLog

  向事件日志寫入條目同樣很簡單WriteEntry VBNET 方法可以實現該事件日志功能並提供該功能以便可以從 VB 中調用該方法

  清單 在 VBNET 中向事件日志寫入條目

  Public Sub WriteEntry(ByVal source As String _ ByVal message As String _ Optional ByVal type As String = Information _ Optional ByVal eventID As Integer = _ Optional ByVal category As Short = ) Dim typeEnum As EventLogEntryType = _ SystemEnumParse(GetType(EventLogEntryType) type) m_eventLogWriteEntry(source message typeEnum eventID category) End Sub

  此包裝方法提供了許多可選參數因此從 VB 中調用該方法時您可以僅傳遞事件日志來源和消息也可以傳遞消息類型事件 ID 和/或事件類別

  可以使用下列代碼從 VB 中調用此方法

  清單 在 VB 中寫入事件日志條目

  Dim eventLog As NetFrameworkWrappersEventLogWrapper Set eventLog = New NetFrameworkWrappersEventLogWrapper eventLogWriteEntry cboLogText txtMessage cboTypeText _ txtID txtCategory

讀取日志

  從事件日志中讀取信息只是稍微有些復雜NET Framework EventLog 類有一個 GetEntries 方法它可以返回給定(應用程序系統等)事件日志的所有日志條目問題是每個條目都是作為 EventLogEntry 對象返回的不能將它們直接傳遞回 VB但是我可以簡單地創建自己的 EventLogEntryInfo 類用於將每個事件日志條目復制到其中它是一個完整的 COM 類可以返回到 VB並且提供了條目來源消息類型ID 和類別屬性然後VBNET 代碼將使用事件日志條目數據填充這些屬性並將其返回以便可以從 VB 中使用

  清單 在 VBNET 中讀取並轉換事件日志條目

  Public Sub GetEntries(ByRef entries() As EventLogEntryInfo) ReDim entries(m_eventLogEntriesCount ) For i As Integer = To m_eventLogEntriesCount Dim ent As EventLogEntry = m_eventLogEntries(i) entries(i) = New EventLogEntryInfo entries(i)Category = entCategoryNumber entries(i)Message = entMessage entries(i)Source = entSource entries(i)EventID = entEventID entries(i)EntryType = entEntryType Next End Sub

  完成此函數後VB 便可以完全訪問事件日志條目了

  清單 在 VB 中獲取事件日志條目

  Dim eventLog As NetFrameworkWrappersEventLogWrapper Set eventLog = New NetFrameworkWrappersEventLogWrapper eventLogInit logName Dim entries() As NetFrameworkWrappersEventLogEntryInfo eventLogGetEntries entries

結論

  我相信您不需要重寫現有的 VB 應用程序便可利用 NET F ramework 提供的擴展功能正如 VB Fusion 系列文章中所說的使用這些簡單的包裝類便可以通過 COM 對象提供 NET Framework 的功能該 COM 對象可以用於 VBVBAASP 或可以訪問 COM 對象的任何環境在本文中您看到了如何將功能豐富的事件日志功能添加到現有的 VB 應用程序中歡迎下載相關的示例代碼以便將事件日志添加到現在的應用程序中

  Scott Swigart 傳記

  Scott Swigart 從事合並技術和聚合技術的咨詢寫作和講解工作Scott 在其職業生涯中涉及的技術范圍很廣 歲開始 Commodore 編程工作用 C++ 語言為 UNIX 系統編寫硬件診斷建立 Windows 桌面和 Web 應用程序在這些年裡Scott 涉及了組件開發XML 技術NETWeb 服務以及其他語言平台和模式由於他的這些經歷Scott 已經體會到技術是如何隨著時間而不斷發展進步的他致力於幫助組織從當今的技術中獲得最大利益同時為明天的技術做准備Scott 還是 Microsoft MVP並且是許多書籍和文章的合著者Scott 的聯系方式scott@s

  轉到原英文頁面


From:http://tw.wingwit.com/Article/program/net/201311/12220.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.