编译生成的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。
解决办法
- 如果你一定要
ProviderGuid这个名称,只需将manifest中provider的symbol属性值改为Provider即可; - 直接使用生成的
MyProviderGuid宏,这是符合当前配置的正确符号。
内容的提问来源于stack exchange,提问作者Shane Bishop
相关产品推荐
相关产品推荐

