【总结】manifest常见用法总结
acmilan2015/11/19软件综合 IP:四川
manifest是win32程序内嵌的xml格式的配置文件,它可以使用以下语句嵌入到rsrc资源段中:
<code class="lang-cpp">// RT_MANIFEST=24
1 24 "myprog.manifest"</code>

manifest在Windows XP中被引进,本来是用于配置并行版本DLL的调用,防止版本冲突的。然而因为使用起来不太方便,因此现在微软已经淡化了这个用法,大多数情况下我们并不需要它。只有comctl32.dll版本6.0/6.1因为历史原因需要这个配置,如果没有这个配置,系统会加载5.82版的comctl32.dll,控件被显示为win2000样式。

除此之外,Vista以后manifest文件有了更多的功能,可以设置兼容性选项(如是否需要管理员权限、是否支持DPI、支持的操作系统等)。

1.xml头部+assembly根元素+一个assemblyIdentity
<code class="lang-xml"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0">
 <assemblyidentity type="win32" name="myprog" version="1.0.0.0">
 
</assemblyidentity></assembly></code>

2.开启Common Controls 6.0/6.1(新版公用控件)
<code class="lang-xml"><dependency>
 <dependentassembly>
  <assemblyidentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorarchitecture="*" publickeytoken="6595b64144ccf1df" language="*">
 </assemblyidentity></dependentassembly>
</dependency></code>

3.启动时要求管理员权限
level可取asInvoker(不要求)、highestAvailable(尽可能高)、requireAdministrator(要求管理员)三个值,uiAccess指是否要求关闭安全桌面,建议使用false。
<code class="lang-xml"><trustinfo xmlns="urn:schemas-microsoft-com:asm.v2">
 <security>
  <requestedprivileges>
   <requestedexecutionlevel level="requireAdministrator" uiaccess="false">
  </requestedexecutionlevel></requestedprivileges>
 </security>
</trustinfo></code>

4.设置系统兼容性
已知Windows版本对应的GUID如下,如果以后有更新版本参考MSDN:
{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a} -> Windows 10
{1f676c76-80e1-4239-95bb-83d0f6d0da78} -> Windows 8.1
{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38} -> Windows 8
{35138b9a-5d96-4fbd-8e2d-a2440225f93a} -> Windows 7
{e2011457-1546-43c5-a5fe-008deee3d3f0} -> Windows Vista
<code class="lang-xml"><compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
 <application>
  <supportedos id="{程序所支持Windows版本的GUID}">
 </supportedos></application>
</compatibility></code>

5.设置DPI兼容性
dpiAware的值可取false(不兼容DPI)、true(兼容系统级DPI)、true/pm(兼容Win8.1+的显示器级DPI)。
程序不读取DPI,只按像素建立窗口布局,设为false。
程序启动时使用GetDeviceCaps读取DPI数值,按DPI建立窗口布局,设为true。
使用GetDpiForMonitor读取DPI,并使用WM_DPICHANGE消息动态调整布局,设为true/pm。
<code class="lang-xml"><application xmlns="urn:schemas-microsoft-com:asm.v3">
 <windowssettings xmlns:ws="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
  <ws:dpiaware>true</ws:dpiaware>
 </windowssettings>
</application></code>

除了这些以外,exe的manifest还可以使用noInherit、file、autoElevate、disableTheming、disableWindowFiltering、highResolutionScrollingAware、magicFutureSettings、printerDriverIsolation、ultraHighResolutionScrollingAware等选项,具体用法参考MSDN:XXXXXXXXXXXXXXXXXXXXXXXXXX/en-us/library/windows/desktop/aa374191(v=vs.85).aspx

[修改于 8年6个月前 - 2015/11/20 07:53:39]

来自:计算机科学 / 软件综合
13
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
acmilan 作者
8年6个月前 IP:四川
797888
一个可以直接使用的manifest
<code class="lang-xml"><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestversion="1.0">
 <assemblyidentity type="win32" name="xxx" version="1.0.0.0">
 
 <dependency>
  <dependentassembly>
   <assemblyidentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorarchitecture="*" publickeytoken="6595b64144ccf1df" language="*">
  </assemblyidentity></dependentassembly>
 </dependency>
 
 <trustinfo xmlns="urn:schemas-microsoft-com:asm.v2">
  <security>
   <requestedprivileges>
    <requestedexecutionlevel level="asInvoker" uiaccess="false">
   </requestedexecutionlevel></requestedprivileges>
  </security>
 </trustinfo>
 
 <application xmlns="urn:schemas-microsoft-com:asm.v3">
  <windowssettings xmlns:ws="http://schemas.microsoft.com/SMI/2005/WindowsSettings">
   <ws:dpiaware>true</ws:dpiaware>
  </windowssettings>
 </application>
 
 <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
  <application>
   
   <supportedos id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}">
   
   <supportedos id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}">
   
   <supportedos id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}">
   
   <supportedos id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}">
   
   <supportedos id="{e2011457-1546-43c5-a5fe-008deee3d3f0}">
  </supportedos></supportedos></supportedos></supportedos></supportedos></application>
 </compatibility>
</assemblyidentity></assembly></code>
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
797898
使用某些选项可能使得程序的兼容性降低,此时某些选项可用动态启动代码代替,如设置DPI兼容性为true可用以下代码:
<code class="lang-cpp">// 关闭DPI缩放
FARPROC spdpia = GetProcAddress(GetModuleHandle(TEXT("user32")), "SetProcessDPIAware");
if (spdpia != NULL) spdpia();</code>
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
csaaa
8年6个月前 IP:浙江
797976
楼主把论坛当成个人博客了,呵呵。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
phpskycn
8年6个月前 IP:浙江
798029
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
不能这么说,楼主在论坛上发表,是乐于分享和讨论的表现
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
20!Dopaminor
8年6个月前 IP:广东
798052
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
无论分享的内容如何,分享量才是这个论坛发展的根本啊。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
798068
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
主要是发帖的人太少,结果成我刷版了。。。本版发帖水一点没关系的,这一版当年定位算法优先的,所以显得有点高冷,现在扩展到软件技术了,什么东西都可以发一发。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
dome
8年6个月前 修改于 8年6个月前 IP:广东
798083
楼主发的帖子我感觉质量挺高啊
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
csaaa
8年6个月前 IP:浙江
798130
发点让小白用户能参与的吧。小白们打开装了vs后,点来点去也弄不清该从哪里开始, 更别提指针和宏了,最后的结果就是放弃。其实有些人对编程也挺有兴趣的,他们其实就是需要一个简单的操作,像vb一样,点几下做出个小程序很有成就感,然后就慢慢深入了。楼主这些太高大上了,放到csdn的博客中我有时需要时搜索时还能搜到,放此论坛中恐怕就被埋没了。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
798139
引用 csaaa:
发点让小白用户能参与的吧。小白们打开装了vs后,点来点去也弄不清该从哪里开始, 更别提指针和宏了,最后的结果就是放弃。其实有些人对编程也挺有兴趣的,他们其实就是需要一个简单的操作,像vb一样,点几下做出个小程序很有成就感,然后就慢慢深入了。...
c#/vb好久没弄了→_→最近一直在研究vc++
以前我发过mfc写对话框程序的,虽然很简单,但是还是不如c#/vb使用起来简单,win32的编程逻辑对于初学者就是比较难以理解。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
798144
引用 t502187408:
米兰发帖永远都是非常高质量的,关于算法和语法非常详细,也是乐于分享的大神;再一次表示对大神的敬意。
我感觉你可以学习一下XXXXXT下的WPF,我试了一下,智能提示比C#好多了!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
csaaa
8年6个月前 IP:浙江
798212
引用 acmilan:
c#/vb好久没弄了→_→最近一直在研究vc++
以前我发过mfc写对话框程序的,虽然很简单,但是还是不如c#/vb使用起来简单,win32的编程逻辑对于初学者就是比较难以理解。
VC/MFC主要需要理解windows的消息机制,线程的调度,类封装大家基本上都是一致的,只不过vc什么都要自己去画去写,适合做比较基础的开发,比如驱动类的,d3d游戏。如果做一般的应用软件开发还是不建议用vc,用delphi是个不错的选择。现在的delphi xe8 一套代码可以直接做出windows32,安卓,ios等多个系统的应用了。大部分的同学主要还是关注应用和实现的,极少的人真的关注底层的设计和建模。不过如果涉及到操作系统操作类的代码不涉及界面的话,用vc的效率显然是最高的,(看清楚是效率,速度上显然汇编最快),其次是delphi,最差的就是pb,java了.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
acmilan作者
8年6个月前 IP:四川
798217
引用 csaaa:
VC/MFC主要需要理解windows的消息机制,线程的调度,类封装大家基本上都是一致的,只不过vc什么都要自己去画去写,适合做比较基础的开发,比如驱动类的,d3d游戏。如果做一般的应用软件开发还是不建议用vc,用delphi是个不错的选择...
delphi好像一直都没有中文,不知道最新版有没有,如果没有的话还是VB/C#最容易使用→_→
另外汇编其实主要是实现一些特殊技巧比较方便,而不是运行速度快。追求速度的话C语言开优化效果要更好一些。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
acmilan
进士 学者 笔友
文章
461
回复
2934
学术分
4
2009/05/30注册,5年3个月前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}