设置和获取线程的日志标记

SetupAPI 日志记录 支持建立线程日志上下文的机制。 此上下文是通过为线程设置 日志令牌 建立的。 SetupAPI 提供此机制,以便线程调用的代码可以将日志条目写入调用线程的日志上下文。

例如,线程可以在调用类安装程序或共同安装程序之前为其日志上下文设置日志令牌。 安装程序反过来可以检索调用线程的日志令牌,并使用该令牌在与调用线程的日志上下文关联的文本日志和节中写入日志条目。

设置线程的日志令牌

SetupSetThreadLogToken 函数为从中调用此函数的线程设置日志标记。 日志令牌可以是系统定义的日志令牌,也可以是通过调用 SetupGetThreadLogToken 检索到的日志令牌。

下面是如何为线程建立日志上下文的示例:

  • 安装应用程序可以调用 SetupSetThreadLogToken ,为在同一线程中运行的其他安装代码建立日志上下文。 在为线程建立日志上下文时,应用程序应在调用 SetupSetThreadLogToken 时使用系统定义的日志令牌(例如LOGTOKEN_SETUPAPI_APPLOG)。

    注意 如果使用系统定义的日志 令牌设置日志上下文,则后续调用从该日志上下文进行的 SetupAPI 日志记录函数 ,请将日志条目写入安装文本日志,这些日志条目不属于 文本日志部分

  • 如果类安装程序或共同安装程序启动新线程,安装程序可以将该线程的日志上下文设置为与父线程相同。 这是通过以下方式完成的:

    1. 在父线程启动新线程之前,它通过调用 SetupGetThreadLogToken 获取当前日志令牌。
    2. 父线程启动新线程,并通过特定于实现的方法传递当前日志令牌,例如将令牌保存在全局变量中。
    3. 新线程使用当前日志令牌调用 SetupSetThreadLogToken 。 因此,新线程“继承”父线程的日志上下文。

    注意 如果类安装程序或共同安装程序的线程使用此方法设置日志上下文,则后续调用从该日志上下文进行的 SetupAPI 日志记录函数 会将日志条目写入可能属于 文本日志节的安装文本日志。 仅当通过调用安装程序的 SetupAPI 安装操作建立文本日志节时,才会发生这种情况。

下面是一个调用 SetupSetThreadLogToken 的示例,该调用通过指定 LOGTOKEN_SETUPAPI_APPLOG 的系统定义的日志标记,将当前线程的日志上下文设置为设备安装文本日志 (SetupAPI.app.log) 。 对使用此日志上下文的 SetupAPI 日志记录函数 的后续调用会将日志条目写入设备安装文本日志,但不作为 文本日志部分的一部分。

SP_LOG_TOKEN LogToken = LOGTOKEN_SETUPAPI_APPLOG;
SetupSetThreadLogToken(LogToken);

获取线程的日志令牌

SetupGetThreadLogToken 函数检索从中调用此函数的线程的日志令牌。

例如,类安装程序可以调用 SetupGetThreadLogToken 来检索适用于调用类安装程序的 SetupAPI 操作的日志令牌。 然后,类安装程序可以使用此检索到的日志令牌来记录应用于相应 SetupAPI 操作的文本日志中的条目。

注意 如果线程的日志上下文之前不是通过调用 SetupSetThreadLogToken 设置的,则对 SetupGetThreadLogToken 的调用将返回值为 LOGTOKEN_UNSPECIFIED 的日志令牌。

下面是对 SetupGetThreadLogToken 的调用示例,该调用会检索当前线程的日志令牌。

SP_LOG_TOKEN LogToken = SetupGetThreadLogToken();