运行情况如何?



简介

Visual Basic 6 可通过“App.LogEvent”写入事件日志。但是,此 API 有许多严格的限制。首先,不能为事件定义来源(在事件查看器中始终显示为“VBRuntime”),而且不能指定事件 ID 或事件类别。还限制您只能写入应用程序事件日志,不能创建自己的自定义来源和日志。

通过使用 .NET Framework 免费提供的类,可以克服所有这些限制,这样可以使您有效地编写应用程序,以便用户、管理员或其他支持人员都可以查看日志来诊断问题。

.NET Framework EventLog 类

.NET Framework 提供了一个强大的 EventLog 类,用它可以轻松地处理事件日志。不过您不能直接从 VB6 访问此类,依照 VB Fusion(英文)系列文章中的精神,可以通过创建封装 .NET 类的 COM 包装从 VB6 中访问此功能。

我还创建了一个练习此事件日志功能的示例 VB6 应用程序。

图 1:使用事件日志功能的 VB6 应用程序

创建包装类时,大部分工作只是将 .NET 类型转换为 VB6 可以理解的类型。GetEventLogs 方法通常返回一组 EventLog 对象,不过不能直接从 VB6 中使用这些 EventLog 对象。但是,下列 VB.NET 函数将计算机上的所有事件日志的列表转换为一组字符串,VB6 很容易就可以使用这些字符串。通常,您拥有系统事件日志、安全性事件日志和应用程序事件日志,但是某些应用程序还会创建自己的自定义事件日志,而此方法还可以显示这些事件日志:

清单 1:使用 VB.NET 列出计算机上的所有事件日志

Public Function GetEventLogs() As String()
Dim logs(EventLog.GetEventLogs.Length - 1) As String
Dim i As Integer = 0
For Each el As EventLog In EventLog.GetEventLogs()
logs(i) = el.Log
i += 1
Next
Return logs
End Function

您可以看到,EventLog 类使您能够通过 GetEventLogs 函数访问所有事件日志。调用此函数后,它就会遍历结果,并将所有事件日志名称转换为一组字符串。然后,可以将此 VB.NET 代码作为 COM 对象进行公开,从而允许从 VB6 中调用它。

从 VB6 中调用此代码以及(例如)用结果填充列表框就像下面这样简单:

清单 2:使用 VB6 在列表框中显示日志名称

Dim eventLog As NetFrameworkWrappers.EventLogWrapper
Set eventLog = New NetFrameworkWrappers.EventLogWrapper

lstEventLogs.Clear
    
Dim logs() As String
logs = eventLog.GetEventLogs
    
Dim log As Variant
For Each log In logs
lstEventLogs.AddItem log
Next

方法

由于各种原因,您可能希望应用程序能够写入事件日志。当然,应该将任何灾难性错误都记录到事件日志中,因为此信息以后可以用来诊断问题。您可能经常希望将不适合显示给用户的详细信息写入该事件日志中。

首先需要选择使用哪个日志。可以从系统事件日志、安全性事件日志或应用程序事件日志中进行选择。应用程序事件日志几乎总是正确的选择,但是,如果需要,也可以创建自己的自定义事件日志。事件日志包装中的下列 VB.NET 代码使您能够创建自己的自定义日志:

清单 3:使用 VB.NET 创建自定义事件日志

Public Sub CreateEventSource(ByVal source As String, ByVal logName As String)
If EventLog.SourceExists(source) Then
EventLog.DeleteEventSource(source)
End If
EventLog.CreateEventSource(source, logName)
End Sub

您可以看到,使用 .NET Framework 可以轻松创建事件日志。.NET CreateEventSource 方法帮您完成了所有工作。此方法只提供了该功能,以便可以从 VB6 中轻松调用。

清单 4:使用包装类从 VB6 创建事件日志

Dim eventLog As NetFrameworkWrappers.EventLogWrapper
Set eventLog = New NetFrameworkWrappers.EventLogWrapper
eventLog.CreateEventSource "MyApplication", "MyCustomLog" 

向事件日志写入条目同样很简单。WriteEntry VB.NET 方法可以实现该事件日志功能并提供该功能,以便可以从 VB6 中调用该方法:

清单 5:在 VB.NET 中向事件日志写入条目

Public Sub WriteEntry(ByVal source As String, _
ByVal message As String, _
Optional ByVal type As String = "Information", _
Optional ByVal eventID As Integer = 0, _
Optional ByVal category As Short = 0)

Dim typeEnum As EventLogEntryType = _
System.Enum.Parse(GetType(EventLogEntryType), type)
m_eventLog.WriteEntry(source, message, typeEnum, eventID, category)
End Sub

此包装方法提供了许多可选参数,因此从 VB6 中调用该方法时,您可以仅传递事件日志来源和消息,也可以传递消息类型、事件 ID 和/或事件类别。

可以使用下列代码从 VB6 中调用此方法:

清单 6:在 VB6 中写入事件日志条目

Dim eventLog As NetFrameworkWrappers.EventLogWrapper
Set eventLog = New NetFrameworkWrappers.EventLogWrapper
eventLog.WriteEntry cboLog.Text, txtMessage, cboType.Text, _
txtID, txtCategory

读取日志

从事件日志中读取信息只是稍微有些复杂。.NET Framework EventLog 类有一个 GetEntries 方法,它可以返回给定(应用程序、系统等)事件日志的所有日志条目。问题是每个条目都是作为 EventLogEntry 对象返回的,不能将它们直接传递回 VB6。但是,我可以简单地创建自己的 EventLogEntryInfo 类,用于将每个事件日志条目复制到其中。它是一个完整的 COM 类,可以返回到 VB6,并且提供了条目来源、消息、类型、ID 和类别属性。然后,VB.NET 代码将使用事件日志条目数据填充这些属性,并将其返回,以便可以从 VB6 中使用。

清单 7:在 VB.NET 中读取并转换事件日志条目:

Public Sub GetEntries(ByRef entries() As EventLogEntryInfo)
ReDim entries(m_eventLog.Entries.Count - 1)

For i As Integer = 0 To m_eventLog.Entries.Count - 1
Dim ent As EventLogEntry = m_eventLog.Entries(i)
entries(i) = New EventLogEntryInfo
entries(i).Category = ent.CategoryNumber
entries(i).Message = ent.Message
entries(i).Source = ent.Source
entries(i).EventID = ent.EventID
entries(i).EntryType = ent.EntryType
Next
End Sub

完成此函数后,VB6 便可以完全访问事件日志条目了。

清单 8:在 VB6 中获取事件日志条目

Dim eventLog As NetFrameworkWrappers.EventLogWrapper
Set eventLog = New NetFrameworkWrappers.EventLogWrapper
eventLog.Init logName

Dim entries() As NetFrameworkWrappers.EventLogEntryInfo
eventLog.GetEntries entries

结论

我相信您不需要重写现有的 VB6 应用程序便可利用 .NET F ramework 提供的扩展功能。正如 VB Fusion 系列文章中所说的,使用这些简单的包装类,便可以通过 COM 对象提供 .NET Framework 的功能,该 COM 对象可以用于 VB6、VBA、ASP 或可以访问 COM 对象的任何环境。在本文中,您看到了如何将功能丰富的事件日志功能添加到现有的 VB6 应用程序中。欢迎下载相关的示例代码以便将事件日志添加到现在的应用程序中。

代码下载地址: https://pan.quark.cn/s/bc087ffa872a "测控电路课后习题详解"文件.pdf是一份极具价值的学术资料,其中系统地阐述了测控电路的基础理论、系统构造、核心特性及其实际应用领域。 以下是对该文献的深入解读和系统梳理:1.1测控电路在测控系统中的核心功能测控电路在测控系统的整体架构中扮演着不可或缺的角色。 它承担着对传感器输出信号进行放大、滤除杂音、提取有效信息等关键任务,并且依据测量与控制的需求,执行必要的计算、处理与变换操作,最终输出能够驱动执行机构运作的指令信号。 测控电路作为测控系统中最具可塑性的部分,具备易于放大信号、转换模式、传输数据以及适应多样化应用场景的优势。 1.2决定测控电路精确度的关键要素影响测控电路精确度的核心要素包括:(1)噪声与干扰的存在;(2)失调现象与漂移效应,尤其是温度引起的漂移;(3)线性表现与保真度水平;(4)输入输出阻抗的特性影响。 在这些要素中,噪声干扰与失调漂移(含温度效应)是最为关键的因素,需要给予高度关注。 1.3测控电路的适应性表现测控电路在测控系统中展现出高度的适应性,具体表现在:* 具备选择特定信号、灵活实施各类转换以及进行信号处理与运算的能力* 实现模数转换与数模转换功能* 在直流与交流、电压与电流信号之间进行灵活转换* 在幅值、相位、频率与脉宽信号等不同参数间进行转换* 实现量程调整功能* 对信号实施多样化的处理与运算,如计算平均值、差值、峰值、绝对值,进行求导数、积分运算等,以及实现非线性环节的线性化处理、逻辑判断等操作1.4测量电路输入信号类型对电路结构设计的影响测量电路的输入信号类型对其电路结构设计产生显著影响。 依据传感器的类型差异,输入信号的形态也呈现多样性。 主要可分为...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值