You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编译生成的manifest.h未包含ProviderGuid值的技术问询

编译Windows Event Log清单未生成预期ProviderGuid符号的问题

我正尝试编译instrumentation manifest以构建基于清单的Windows Event Log provider,预期编译后的manifest.h文件会包含ProviderGuid符号(如微软官方示例所示)。

我的manifest.xml内容如下:

<?xml version="1.0" encoding="utf-8"?>
<instrumentationManifest xmlns="http://schemas.microsoft.com/win/2004/08/events"
                         xmlns:win="http://manifests.microsoft.com/win/2004/08/windows/events"
                         xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <instrumentation>
    <events>
      <provider name="MySampleProvider"
                guid="{e585d1ba-488c-4adc-b752-f360e410d365}"
                symbol="MyProvider"
                resourceFileName="%SystemRoot%\System32\MySampleProvider.dll"
                messageFileName="%SystemRoot%\System32\MySampleProvider.dll">

        <events>
          <event symbol="EVENT_MY_EVENT" value="1"
                 version="0" level="win:Informational"
                 template="MyEventTemplate"
                 message="$(string.MyEvent.Message)"/>
        </events>

        <templates>
          <template tid="MyEventTemplate">
            <data name="Message" inType="win:UnicodeString" outType="xs:string"/>
          </template>
        </templates>

        <keywords>
          <keyword name="MyKeyword" mask="0x1"/>
        </keywords>

        <tasks>
          <task name="MyTask" eventGUID="{642836ec-9270-4b16-aacb-b971bcf357ae}" value="1"/>
        </tasks>

        <opcodes>
          <opcode name="MyOpcode" value="10"/>
        </opcodes>

        <levels>
          <level name="MyLevel" value="16" symbol="Informational"/>
        </levels>

        <channels>
          <channel name="MyChannel" chid="MySampleProvider/Operational" type="Operational" enabled="true"/>
        </channels>

      </provider>
    </events>
  </instrumentation>

  <localization>
    <resources culture="en-US">
      <stringTable>
        <string id="MyEvent.Message" value="This is a sample event message."/>
      </stringTable>
    </resources>
  </localization>
</instrumentationManifest>

我使用命令:

"C:\Program Files (x86)\Windows Kits\10\bin\10.0.19041.0\x64\mc.exe" -h . -r . manifest.xml

进行编译,控制台未显示任何错误或警告。但生成的manifest.h文件中未找到任何ProviderGuid相关内容,请问这是预期情况吗?我是否误解了官方示例的用途?


解答

这不是预期情况,但问题出在你对符号命名规则的误解上:

  • mc.exe生成的Provider GUID宏名称,是由你在manifest中指定的provider的symbol字段值加上Guid后缀组成的。你的provider符号是MyProvider,所以生成的宏应该是MyProviderGuid,而不是通用的ProviderGuid。
  • 检查你生成的manifest.h文件,应该能找到类似如下的定义:
    DEFINE_GUID(MyProviderGuid, 0xe585d1ba, 0x488c, 0x4adc, 0xb7, 0x52, 0xf3, 0x60, 0xe4, 0x10, 0xd3, 0x65);
    

官方示例中之所以出现ProviderGuid,是因为示例里的provider符号被设为了Provider,而非你这里的MyProvider。

解决办法

  1. 如果你一定要ProviderGuid这个名称,只需将manifest中provider的symbol属性值改为Provider即可;
  2. 直接使用生成的MyProviderGuid宏,这是符合当前配置的正确符号。

内容的提问来源于stack exchange,提问作者Shane Bishop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:43:24