C++如何解析Manifest.xml清单文件

阿明大大_3482

阿明大大_3482

2026-09-13

854人浏览

原创

manifest.xml是windows应用使用的符合xml 1.0规范的清单文件,c++中推荐使用轻量无依赖的tinyxml2库解析,因其头文件即用、支持链式节点查找、对结构固定的清单文件高效可靠。

c++如何解析manifest.xml清单文件

Manifest.xml 是什么格式,C++ 里该用什么库解析

Manifest.xml 不是标准格式,而是 Windows 应用(尤其是 UWP、Win32 桌面应用启用 SxS 或高 DPI 适配时)使用的 XML 清单文件,结构符合 XML 1.0 规范。C++ 本身不带 XML 解析器,必须依赖第三方库或系统 API。msxml6.dll(Windows 原生 COM 组件)和 tinyxml2 是最常用选择:前者无需额外分发但需 COM 初始化且 C++ 调用繁琐;后者轻量、头文件即用、无依赖,适合大多数场景。

推荐优先用 tinyxml2——它不强制要求 DOM 完整加载,支持只读遍历,对 Manifest.xml 这类结构固定的小文件非常高效。

用 tinyxml2 读取并提取 assemblyIdentitydependency

典型 Manifest.xml 中关键节点如 <assemblyidentity></assemblyidentity>(声明应用/组件 ID)、<dependency></dependency>(依赖的 Side-by-Side 组件)常需提取。tinyxml2 的 XMLElement 链式查找简洁可靠:

C++ 算法竞赛自动化测试数据生成与校验框架
C++ 算法竞赛自动化测试数据生成与校验框架

根据原题生成新题面、验证器及完整测试数据,自动套用 testlib 模板,用于用户要求生成测试数据时。

下载
#include "tinyxml2.h"
using namespace tinyxml2;
<p>XMLDocument doc;
XMLError err = doc.LoadFile("app.manifest");
if (err != XML_SUCCESS) {
// 注意:错误码不是 errno,是 tinyxml2::XMLError 枚举
return;
}</p><p>XMLElement* root = doc.RootElement();
if (!root || strcmp(root->Name(), "assembly") != 0) return;</p><p>// 查找 assemblyIdentity(通常在第一层子节点)
XMLElement<em> identity = root->FirstChildElement("assemblyIdentity");
if (identity) {
const char</em> name = identity->Attribute("name");        // 如 "myapp.exe"
const char<em> version = identity->Attribute("version");  // 如 "1.0.0.0"
const char</em> type = identity->Attribute("type");        // 如 "win32"
}</p><p>// 查找所有 dependency(可能有多个)
for (XMLElement<em> dep = root->FirstChildElement("dependency"); 
dep; 
dep = dep->NextSiblingElement("dependency")) {
XMLElement</em> dependentAssembly = dep->FirstChildElement("dependentAssembly");
if (dependentAssembly) {
XMLElement<em> depIdentity = dependentAssembly->FirstChildElement("assemblyIdentity");
if (depIdentity) {
const char</em> depName = depIdentity->Attribute("name");
// ...
}
}
}</p>

用 MSXML6 解析时 COM 初始化和命名空间陷阱

如果项目已依赖 COM 或需严格遵循 Windows 平台规范(例如验证清单签名),可用 IXMLDOMDocument2。但必须注意两点硬性约束:

  • CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED) 必须在解析前调用,否则 CoCreateInstance 失败返回 RPC_E_CHANGED_MODE
  • Manifest.xml 默认含命名空间:xmlns="urn:schemas-microsoft-com:asm.v1"。不处理命名空间会导致 selectSingleNode 返回 null —— 必须用 setProperty("SelectionNamespaces", "xmlns:asm='urn:schemas-microsoft-com:asm.v1'") 并在 XPath 中显式使用前缀,例如 //asm:assemblyIdentity
  • MSXML6 默认不加载 DTD,若 Manifest 含 ..> 且未禁用验证,会触发网络请求(访问微软 DTD URL),导致超时或失败;应设 put_validateOnParse(VARIANT_FALSE)put_resolveExternals(VARIANT_FALSE)

常见解析失败原因与快速排查点

Manifest.xml 解析失败往往不是代码逻辑问题,而是环境或文件细节被忽略:

  • 路径错误:LoadFile() 接收的是本地绝对路径或相对于当前工作目录的路径 —— GUI 程序当前目录通常是系统目录(如 C:\Windows\System32),不是 EXE 所在目录;建议用 GetModuleFileName() + PathRemoveFileSpec() 拼出 manifest 同级路径
  • 编码问题:Manifest.xml 必须是 UTF-8(无 BOM)或 UTF-16 LE;tinyxml2 默认按 UTF-8 解码,若文件是 UTF-16 且无 BOM,会直接解析失败(静默返回 XML_ERROR_PARSING_TEXT);可用 doc.LoadFile(fp, XML_ENCODING_UTF16) 强制指定
  • 权限限制:UWP 应用沙盒中无法直接读取任意路径,Manifest 通常由系统加载,C++ 代码不应手动读取;仅 Win32 桌面应用适用上述方法
  • 节点大小写敏感:<assemblyidentity></assemblyidentity> 不等于 <assemblyidentity></assemblyidentity>;XML 全部区分大小写,不要靠肉眼猜名

Manifest.xml 的结构看似简单,但 Windows 对其语法、命名空间、编码、加载上下文的要求极细;绕过系统 API 自行解析时,错一个字符、少一行初始化、路径差一级,都会让整个逻辑静默失效。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.14

2068

9

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

939

6

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

2024.03.14

367

5

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

307

5

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

346

5

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.03.14

560

5

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2024.03.21

1389

9

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

2024.03.22

1177

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1305

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Valgrind Quick Start Guide
Valgrind Quick Start Guide

共0课时 | 0人学习

CLion CMake 快速入门教程
CLion CMake 快速入门教程

共0课时 | 0人学习