Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义“事件检测”的事件检测清单;“基础”;符合“客户”需求的项目;“派生”;项目 我正在研究两个不同的C++ DLL项目,它们共享了大部分代码。 因此,我有一个编译到base.lib的基本项目和两个编译到Derived1.dll和Derived2.dll并链接到base.lib的“派生”项目。这些衍生DLL应单独装运。用户甚至不知道它们是相关的_C++_Visual Studio_Wix_Instrumentation_Etw - Fatal编程技术网

自定义“事件检测”的事件检测清单;“基础”;符合“客户”需求的项目;“派生”;项目 我正在研究两个不同的C++ DLL项目,它们共享了大部分代码。 因此,我有一个编译到base.lib的基本项目和两个编译到Derived1.dll和Derived2.dll并链接到base.lib的“派生”项目。这些衍生DLL应单独装运。用户甚至不知道它们是相关的

自定义“事件检测”的事件检测清单;“基础”;符合“客户”需求的项目;“派生”;项目 我正在研究两个不同的C++ DLL项目,它们共享了大部分代码。 因此,我有一个编译到base.lib的基本项目和两个编译到Derived1.dll和Derived2.dll并链接到base.lib的“派生”项目。这些衍生DLL应单独装运。用户甚至不知道它们是相关的,c++,visual-studio,wix,instrumentation,etw,C++,Visual Studio,Wix,Instrumentation,Etw,现在我希望我的两个DLL都是。我想要记录的所有事件都发生在Base.lib中。因此,我向该项目添加了一个Instrumentation.man,并将其作为构建的一部分。 其内容大致如下: <?xml version="1.0" encoding="UTF-16"?> <instrumentationManifest xsi:schemaLocation="http://schemas.microsoft.com/win/2004/08/events eventman.xsd"

现在我希望我的两个DLL都是。我想要记录的所有事件都发生在
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和消息的相同提供程序

所以,我的实际问题是: 如何使
Instrumentation.man
中的
provider
元素可自定义,以使我的DLL项目可以填写自己的
名称
guid
消息
属性

我正在使用WiX创建我的安装工具包。WiX允许我在目标系统上部署DLL时自定义
provider
元素的
resourceFileName
messageFileName
属性(两者都指向原始文件中的虚拟对象),以便正确引用它们。然而,WIX并没有提供类似的方法(至少我不这么认为)来平滑地改变其他属性,这正是我想要的


我还注意到WiX提供了定制
parameterFileName
属性的功能。不幸的是,我找不到这些参数如何工作的任何信息。我知道我可以将
%%n
放入清单中的字符串中,然后插入标识符为
n
的参数。但是我不知道在哪里以及如何声明这些参数,另外,我不知道是否可以在我想要自定义的属性中使用它们,这样它们就不会对我有任何帮助。

我最终编写了自己的XML修改工具(如前所述,使用C语言,但任何其他语言也可以)它接受清单文件和解决方案名称,并相应地替换属性值

为了使这项工作自动进行,我向基础项目添加了一个预构建事件,该事件调用此工具并将清单文件和
$(SolutionName)
传递给它

这个解决方案既不美观,也不容易扩展,但它可以工作