记录模式:利用 OutputDebugString 、 DebugView

在本文中,我们将了解一种在 Excel VBA 中使用 Windows API OutputDebugString 和 DebugView 实用程序的有效日志记录方法。

1. 基本日志模式

Excel VBA教程(九):Excel VBA How-To

上述的 4.3.如何使用立即窗口工具 在目录中,“3。检查输出消息“被覆盖了。

직접 실행 창 도구 활용 방법
如何使用立即窗口工具

这是一种在立即执行窗口中检查 Debug.Print 输出内容的方法。虽然此方法具有非常简单的优点,但它具有以下缺点。

  • VBE (Visual Basic Editor) 无法在 Excel 进程停止时检查输出日志的内容。
  • 在上述使用方法中,“2.如果与“在执行过程中检查变量值”一起使用,日志和变量值会在中间混合,这会干扰日志验证。
  • 超过 200 行的消息将被删除。也就是说,只维护最后 200 行。

替换 Debug.Print 的更好方法是使用 Windows API OutputDebugString 和实用程序 DebugView。

2. OutputDebugString 使用模式

2.1.使用 OutputDebugString 的 VBA 代码

在下面的文章中,我介绍了如何使用 Windows API OutputDebugString。

使用一维装箱算法优化工作分配_4.附件

5.1.4. modUtil模块源码 稍微修改一下引入的代码,全部必要的内容写成如下。

Option Explicit
Public Const LOG_PREFIX As String = "[VBA] " 'DebugView에서 로그 메시지를 필터링하기 위한 Prefix 지정

Private Declare PtrSafe Sub OutputDebugString Lib "kernel32" Alias "OutputDebugStringA" (ByVal lpOutputString As String)

'OutputDebugString API를 이용한 Debug Message 출력
'DebugView등을 이용하여 메시지 View 가능함
Public Sub DoLog(aMsg As String)
    OutputDebugString LOG_PREFIX + aMsg
End Sub

'Log 예시 프로시져
Public Sub TestLog()
    Dim lIdx As Long
    For lIdx = 1 To 1000
        DoLog "Log[" + CStr(lIdx) + "]"
    Next
End Sub
  • 第 2 行:指定用于在 DebugView 中过滤日志消息的前缀。下面介绍过滤方法。
  • 第 4 行:导入 Windows API OutputDebugString 并将其声明为函数。
  • 第9行:结合LOG_PREFIX和log message,作为参数传递给第4行导入的函数,并执行。使这个过程成为一个 DoLog 函数。
  • 第16行:在需要输出日志信息的地方调用DoLog函数。

至此,VBA 代码中需要完成的所有工作就完成了。接下来,让我们看看 DebugView 实用程序。

2.2. DebugView 实用程序的介绍和使用

2.2.1. DebugView 实用程序简介

调试视图 系统内部套件它是包含在 .

DebugView – Windows Sysinternals |微软文档

DebugView v4.90 소개
引入 DebugView v4.90

调试视图版本 4.90

马克·鲁西诺维奇
发表于:2019 年 4 月 23 日
下载调试视图 (1.3 MB)

介绍
Debugview 是一个应用程序,它允许您监视本地系统或可通过 tcp/ip 访问的网络上的任何计算机上的调试输出。它可以显示内核模式和 Win32 调试输出,因此您不需要调试器来捕获您的应用程序或设备驱动程序生成的调试输出,并且您不必修改您的应用程序或驱动程序以使用非标准调试输出 API。

捕获调试视图
在 Windows 2000、XP、Server 2003 和 Vista 上 debugview 捕获:
  – Win32 输出调试字符串
  – 内核模式 DbgPrint
  – 在 Windows XP 和 Server 2003 中实现的 DbgPrint 的所有内核模式变体

简而言之,“DebugView 是一个实用工具,它捕获在调用 OutputDebugString(一种 Windows API)时传递的字符串,并将其显示在屏幕上”。

DebugView 示例屏幕如下。

DebugView 예시 화면
DebugView 示例屏幕

* 资源: https://docs.microsoft.com/ko-kr/sysinternals/downloads/debugview#installation-and-use

2.2.2.使用 DebugView 实用程序

下载并运行 DebugView,然后运行 Filter/Highlight 菜单。

DebugView Filter/Highlight 메뉴
DebugView 过滤器/突出显示菜单

执行上述菜单时,会显示以下画面。

DebugView Filter/Highlight 화면
DebugView 过滤器/高亮屏幕
  • 包含:输入包含在要显示的消息中的字符串。使用 * 作为通配符(例如 [VBA]*),如果为空则输出所有消息。输入多个字符串时,用分号(;)分隔。
  • 排除:输入不输出的消息中包含的字符串。输入多个字符串时,用分号(;)分隔。
  • 突出显示:选择过滤器 1 到 20,然后选择要突出显示的字符串和颜色。可以设置前景色和背景色

需要注意的一点是,如果不在Include中输入字符串进行过滤,不同进程输出的消息会被捕获并混在一起。建议根据需要指定要过滤的字符串。

“2.1。要捕获“VBA 代码”目录中编写的示例 VBA 代码的结果,请在 Include 中输入“[VBA]*”,然后单击“确定”按钮。

如果您执行 VBA 代码,您可以检查 DebugView 中捕获的消息,如下所示。

作为参考,使用 Highlight 函数,您可以输出如下内容:

DebugView의 Highlight 기능 예시
DebugView的高亮功能示例

如果在包含特定字符串时背景颜色和前景色不同,则在视觉上可以很好地查看日志的当前进度。


到目前为止,我们已经了解了在 Excel VBA 中使用 Windows API OutputDebugString 和 DebugView 实用程序的有效日志记录方法。

DebugView 具有许多吸引人的功能,例如突出显示和远程日志记录。稍后将在单独的文章中介绍这些功能。


DA#宏功能演示视频(YouTube) 在帖子中,我记录了在 DebugView 实用程序中捕获消息的情况。

在下面的视频中,右上角是 DebugView。您可以记录该功能如何工作的日志并在以后查看。

注意, DA# 宏(1):DA#、DA# API、DA# 宏概述 中介绍的 DA# 宏,使用 LOG_PREFIX 作为“[DA#]”。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文