Я работаю над двумя разными C ++ DLL-проектами, которые делятся большей частью своего кода.Итак, у меня есть один базовый проект, который компилируется в Base.lib
, и два «производных» проекта, которые компилируются в Derived1.dll
и Derived2.dll
и ссылаются на Base.lib
.Эти производные DLL должны быть отправлены независимо.Пользователь даже не знает, что они связаны.
Теперь я хочу, чтобы обе мои библиотеки DLL были провайдерами событий Windows .Все события, которые я хочу зарегистрировать, происходят в Base.lib
.Итак, я добавил Instrumentation.man
к этому проекту и сделал его частью сборки.Его содержимое выглядит примерно так:
<?xml version="1.0" encoding="UTF-16"?>
<instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd" xmlns="http://schemas.microsoft.com/win/2004/08/events" xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:trace="http://schemas.microsoft.com/win/2004/08/events/trace">
<instrumentation>
<events>
<provider name="Company-Provider-Base" guid="{12345678-1234-1234-1234-1234567890ABCD}" symbol="provider" resourceFileName="some/path/to.dll" messageFileName="some/path/to.dll" message="$(string.provider.message)">
<events>
...
</events>
</provider>
</events>
</instrumentation>
<localization>
<resources culture="en-US">
<stringTable>
<string id="provider.message" value="Base Provider" />
...
</stringTable>
</resources>
</localization>
</instrumentationManifest>
Я использую mc.exe
, чтобы скомпилировать его в файл ресурсов и файл заголовка.Заголовочный файл включен в другие исходные файлы моего базового проекта.
Теперь это работает на удивление хорошо!Все события регистрируются правильно для обеих библиотек DLL.
Однако, конечно, обе библиотеки DLL теперь совместно используют одного и того же провайдера с тем же именем, guid и сообщением.
Итак,Мой настоящий вопрос таков: Как я могу сделать элемент provider
в Instrumentation.man
настраиваемым таким образом, чтобы мои DLL-проекты могли заполнять свои собственные атрибуты name
, guid
и message
?
Я использую WiX для создания своих установочных комплектов.WiX позволяет мне настраивать атрибуты resourceFileName
и messageFileName
элемента provider
(оба указывают на пустышки в исходном файле) только тогда, когда библиотеки DLL развернуты в целевой системе, чтобы на них можно было правильно ссылаться.Однако WIX не предлагает аналогичного способа (по крайней мере, я этого не вижу) для изменения других атрибутов столь же плавно, что было бы именно тем, что я хочу.
Я также заметил, что WiX предлагаетнастроить атрибут parameterFileName
.К сожалению, я не могу найти никакой информации, как эти параметры работают.Я понимаю, что могу вставить %%n
в строки манифеста, и тогда будет вставлен параметр с идентификатором n
.Но я не понимаю, где и как объявлять эти параметры, а также не знаю, смогу ли я использовать их в атрибутах, которые я хочу настроить, чтобы они вообще мне не помогли.