文号
t77963
阅读
15604
回复
13
收藏
5
【总结】manifest常见用法总结
2015/11/19
IP:四川
manifest是win32程序内嵌的xml格式的配置文件,它可以使用以下语句嵌入到rsrc资源段中:
// RT_MANIFEST=24
1 24 "myprog.manifest"

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

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

1.xml头部+assembly根元素+一个assemblyIdentity
<?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>

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

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

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
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
 <application>
  <supportedos id="{程序所支持Windows版本的GUID}">
 </supportedos></application>
</compatibility>

5.设置DPI兼容性
dpiAware的值可取false(不兼容DPI)、true(兼容系统级DPI)、true/pm(兼容Win8.1+的显示器级DPI)。
程序不读取DPI,只按像素建立窗口布局,设为false。
程序启动时使用GetDeviceCaps读取DPI数值,按DPI建立窗口布局,设为true。
使用GetDpiForMonitor读取DPI,并使用WM_DPICHANGE消息动态调整布局,设为true/pm。
<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>

除了这些以外,exe的manifest还可以使用noInherit、file、autoElevate、disableTheming、disableWindowFiltering、highResolutionScrollingAware、magicFutureSettings、printerDriverIsolation、ultraHighResolutionScrollingAware等选项,具体用法参考MSDN:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX。
[ 修改于11年1个月前 - 2015/11/20 07:53:39 ]
acmilan作者
11年1个月前IP:四川
797888
1楼
一个可以直接使用的manifest
<?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>
引用
评论
acmilan作者
11年1个月前IP:四川
797898
2楼
使用某些选项可能使得程序的兼容性降低,此时某些选项可用动态启动代码代替,如设置DPI兼容性为true可用以下代码:
// 关闭DPI缩放
FARPROC spdpia = GetProcAddress(GetModuleHandle(TEXT("user32")), "SetProcessDPIAware");
if (spdpia != NULL) spdpia();
引用
评论
11年1个月前IP:浙江
797976
3楼
楼主把论坛当成个人博客了,呵呵。
引用
评论
11年1个月前IP:浙江
798029
4楼
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
不能这么说,楼主在论坛上发表,是乐于分享和讨论的表现
引用
评论
11年1个月前IP:广东
798052
5楼
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
无论分享的内容如何,分享量才是这个论坛发展的根本啊。
引用
评论
acmilan作者
11年1个月前IP:四川
798068
6楼
引用 csaaa:
楼主把论坛当成个人博客了,呵呵。
主要是发帖的人太少,结果成我刷版了。。。本版发帖水一点没关系的,这一版当年定位算法优先的,所以显得有点高冷,现在扩展到软件技术了,什么东西都可以发一发。。。
引用
评论
11年1个月前修改于 11年1个月前IP:广东
798083
7楼
楼主发的帖子我感觉质量挺高啊
引用
评论
11年1个月前IP:浙江
798130
8楼
发点让小白用户能参与的吧。小白们打开装了vs后,点来点去也弄不清该从哪里开始, 更别提指针和宏了,最后的结果就是放弃。其实有些人对编程也挺有兴趣的,他们其实就是需要一个简单的操作,像vb一样,点几下做出个小程序很有成就感,然后就慢慢深入了。楼主这些太高大上了,放到csdn的博客中我有时需要时搜索时还能搜到,放此论坛中恐怕就被埋没了。
引用
评论
acmilan作者
11年1个月前IP:四川
798139
9楼
引用 csaaa:
发点让小白用户能参与的吧。小白们打开装了vs后,点来点去也弄不清该从哪里开始, 更别提指针和宏了,最后的结果就是放弃。其实有些人对编程也挺有兴趣的,他们其实就是需要一个简单的操作,像vb一样,点几下做出个小程序很有成就感,然后就慢慢深入了。...
c#/vb好久没弄了→_→最近一直在研究vc++
以前我发过mfc写对话框程序的,虽然很简单,但是还是不如c#/vb使用起来简单,win32的编程逻辑对于初学者就是比较难以理解。
引用
评论
acmilan作者
11年1个月前IP:四川
798144
10楼
引用 t502187408:
米兰发帖永远都是非常高质量的,关于算法和语法非常详细,也是乐于分享的大神;再一次表示对大神的敬意。
我感觉你可以学习一下XXXXXX下的WPF,我试了一下,智能提示比C#好多了!
引用
评论
11年1个月前IP:浙江
798212
11楼
引用 acmilan:
c#/vb好久没弄了→_→最近一直在研究vc++
以前我发过mfc写对话框程序的,虽然很简单,但是还是不如c#/vb使用起来简单,win32的编程逻辑对于初学者就是比较难以理解。
VC/MFC主要需要理解windows的消息机制,线程的调度,类封装大家基本上都是一致的,只不过vc什么都要自己去画去写,适合做比较基础的开发,比如驱动类的,d3d游戏。如果做一般的应用软件开发还是不建议用vc,用delphi是个不错的选择。现在的delphi xe8 一套代码可以直接做出windows32,安卓,ios等多个系统的应用了。大部分的同学主要还是关注应用和实现的,极少的人真的关注底层的设计和建模。不过如果涉及到操作系统操作类的代码不涉及界面的话,用vc的效率显然是最高的,(看清楚是效率,速度上显然汇编最快),其次是delphi,最差的就是pb,java了.
引用
评论
acmilan作者
11年1个月前IP:四川
798217
12楼
引用 csaaa:
VC/MFC主要需要理解windows的消息机制,线程的调度,类封装大家基本上都是一致的,只不过vc什么都要自己去画去写,适合做比较基础的开发,比如驱动类的,d3d游戏。如果做一般的应用软件开发还是不建议用vc,用delphi是个不错的选择...
delphi好像一直都没有中文,不知道最新版有没有,如果没有的话还是VB/C#最容易使用→_→
另外汇编其实主要是实现一些特殊技巧比较方便,而不是运行速度快。追求速度的话C语言开优化效果要更好一些。
引用
评论
笔记
{{note.content}}
{{n.user.username}}
{{fromNow(n.toc)}} {{n.status === noteStatus.disabled ? "已屏蔽" : ""}} {{n.status === noteStatus.unknown ? "正在审核" : ""}} {{n.status === noteStatus.deleted ? '已删除' : ''}}
  • 编辑
  • 删除
  • {{n.status === 'disabled' ? "解除屏蔽" : "屏蔽" }}
我也是有底线的