Настройка и получение маркера журнала для потока
Ведение журнала SetupAPI поддерживает механизм, который устанавливает контекст журнала для потока. Этот контекст устанавливается путем установки маркера журнала для потока. SetupAPI предоставляет этот механизм, чтобы код, вызываемый потоком, может записывать записи журнала в контексте журнала вызывающего потока.
Например, поток может задать маркер журнала для контекста журнала перед вызовом установщика класса или совместного установщика. Установщик, в свою очередь, может получить маркер журнала вызывающего потока и использовать его для записи записей журнала в текстовый журнал и раздел, связанные с контекстом журнала вызывающего потока.
Настройка маркера журнала для потока
Функция SetupSetThreadLogToken задает маркер журнала для потока, из которого была вызвана эта функция. Маркер журнала может быть системным маркером журнала или маркером журнала, который был получен путем вызова метода SetupGetThreadLogToken.
Ниже приведены примеры того, как можно установить контекст журнала для потока.
Приложение установки может вызвать SetupSetThreadLogToken , чтобы установить контекст журнала для другого кода установки, выполняемого в том же потоке. При установке контекста журнала для потока приложение должно использовать определенный системой маркер журнала, например LOGTOKEN_SETUPAPI_APPLOG, в вызове SetupSetThreadLogToken.
Примечание Если контекст журнала задается с помощью определяемого системой маркера журнала, последующие вызовы функции ведения журнала SetupAPI , выполняемые из этого контекста журнала, записывают записи журнала в текстовый журнал установки, который не является частью текстового раздела журнала.
Если установщик класса или совместный установщик запускает новый поток, установщик может задать для этого потока контекст журнала, который будет таким же, как и родительский поток. Это делается следующим образом:
- Прежде чем родительский поток запустит новый поток, он получает текущий маркер журнала путем вызова SetupGetThreadLogToken.
- Родительский поток запускает новый поток и передает текущий маркер журнала через метод, зависящий от реализации, например сохранение маркера в глобальной переменной.
- Новый поток вызывает SetupSetThreadLogToken с текущим маркером журнала. В результате новый поток "наследует" контекст журнала родительского потока.
Примечание Если поток установщика класса или совместного установщика задает контекст журнала с помощью этого метода, последующие вызовы функции ведения журнала SetupAPI , выполненные из этого контекста журнала, записывают записи журнала в текстовый журнал установки, который может быть частью текстового раздела журнала. Это происходит только в том случае, если раздел текстового журнала был создан операцией установки SetupAPI, которая вызвала установщик.
Ниже приведен пример вызова метода SetupSetThreadLogToken , который задает контекст журнала текущего потока в текстовом журнале установки устройства (SetupAPI.app.log), указывая системный маркер журнала LOGTOKEN_SETUPAPI_APPLOG. Последующий вызов функции ведения журнала SetupAPI , которая использует этот контекст журнала, запишет запись журнала в текстовый журнал установки устройства, но не в раздел текстового журнала.
SP_LOG_TOKEN LogToken = LOGTOKEN_SETUPAPI_APPLOG;
SetupSetThreadLogToken(LogToken);
Получение маркера журнала для потока
Функция SetupGetThreadLogToken извлекает маркер журнала для потока, из которого была вызвана эта функция.
Например, установщик класса может вызвать SetupGetThreadLogToken , чтобы получить маркер журнала, который применяется к операции SetupAPI, которая вызвала установщик класса. Затем установщик класса может использовать полученный маркер журнала для записи в текстовом журнале, который применяется к соответствующей операции SetupAPI.
Примечание Если контекст журнала потока ранее не был задан вызовом SetupSetThreadLogToken, вызов SetupGetThreadLogToken возвращает маркер журнала со значением LOGTOKEN_UNSPECIFIED.
Ниже приведен пример вызова Метода SetupGetThreadLogToken , который получает маркер журнала для текущего потока.
SP_LOG_TOKEN LogToken = SetupGetThreadLogToken();