返回

ETW 提供程序中 undefined variable 问题如何解决?

windows

解决 ETW 提供程序中的 undefined variable 问题

引言

在使用事件跟踪 Windows (ETW) API 创建 ETW 提供程序时,使用 mc.exe 从清单中生成的文件可能会导致 undefined variable 错误。本文将探讨此问题的根源并提供详细的解决方案。

问题:undefined variable

从 ETW 清单中生成标头文件时,mc.exe 会包含 undefined 变量。这是因为清单中定义的启用位、和级别数组是外部变量,mc.exe 在生成标头文件时不会为这些变量生成定义。

解决方案:手动定义变量

要解决此问题,需要手动定义这些变量。在项目中添加一个包含以下代码的标头文件:

extern ULONG Hello_World_Metric_ProviderEnableBits[1];
extern const ULONGLONG Hello_World_Metric_ProviderKeywords[1];
extern const UCHAR Hello_World_Metric_ProviderLevels[1];
extern MCGEN_TRACE_CONTEXT HELLO_METRIC_Context;
extern REGHANDLE Hello_World_Metric_ProviderHandle;

将此标头文件包含在使用 ETW API 的源文件中,这将为 undefined 变量提供定义,并消除链接器错误。

示例

例如,如果源文件名为 helloworldmetric.c,则可以在文件开头包含标头文件:

#include "helloworldmetricprovider.h"

结论

通过手动定义清单中定义的启用位、关键字和级别数组,可以解决 ETW 提供程序中出现的 undefined variable 问题。这将为编译器提供所需的定义,从而消除链接器错误并确保 ETW 提供程序正常运行。

常见问题解答

1. 为什么 mc.exe 不会自动生成这些变量的定义?

因为这些变量是外部变量,并且 mc.exe 在生成标头文件时不负责生成它们的定义。

2. 为什么需要在所有使用 ETW API 的源文件中包含标头文件?

因为标头文件包含了 undefined 变量的定义,而这些定义对于编译器正确链接代码是必需的。

3. 可以使用其他方法来解决此问题吗?

也可以使用编译器选项 /external 来手动指定 undefined 变量的定义。然而,使用标头文件的方法通常更方便,因为它提供了一种集中管理变量定义的方式。

4. 我在哪里可以找到有关 ETW API 的更多信息?

有关 ETW API 的更多信息,可以参考 Microsoft 文档。

5. 这是否适用于所有版本的 Windows?

此解决方案适用于所有支持 ETW 的 Windows 版本,包括 Windows Vista 及更高版本。