在 Visual C++ 2005 中,我们可以通过 #pragma 指令来生成你想要的清单信息,这项功能可以简化新版本通用控件的使用。
例如,下面的代码可以指示链接器,将通用控件的新版本(6.0.0.0)链接到应用程序中。
================================================================
// do not use – see discussion below
#pragma comment(linker, \
“\”/manifestdependency:type=’Win32′ “\
“name=’Microsoft.Windows.Common-Controls’ “\
“version=’6.0.0.0′ “\
“processorArchitecture=’X86′ “\
“publicKeyToken=’6595b64144ccf1df’ “\
“language=’*’\””)
================================================================
请注意,在上面的代码中,我们使用了硬编码的方式来指定处理器架构,我们指定了 x86 架构。
这意味着,如果你的目标平台是 x64 架构,则会生成错误的清单信息。
为了修正此问题,可以使用如下的代码:
================================================================
#if defined(_M_IX86)
#define MANIFEST_PROCESSORARCHITECTURE “x86”
#elif defined(_M_AMD64)
#define MANIFEST_PROCESSORARCHITECTURE “amd64”
#elif defined(_M_IA64)
#define MANIFEST_PROCESSORARCHITECTURE “ia64”
#else
#error Unknown processor architecture.
#endif
#pragma comment(linker, \
“\”/manifestdependency:type=’Win32′ “\
“name=’Microsoft.Windows.Common-Controls’ “\
“version=’6.0.0.0′ “\
“processorArchitecture='” MANIFEST_PROCESSORARCHITECTURE “‘ “\
“publicKeyToken=’6595b64144ccf1df’ “\
“language=’*’\””)
================================================================
更新:之前我没有意识到,我们可以在清单指令中直接使用 * 来代表任意架构,这就方便很多了,如下所示:
================================================================
#pragma comment(linker, \
“\”/manifestdependency:type=’Win32′ “\
“name=’Microsoft.Windows.Common-Controls’ “\
“version=’6.0.0.0′ “\
“processorArchitecture=’*’ “\
“publicKeyToken=’6595b64144ccf1df’ “\
“language=’*’\””)
================================================================
总结
我是一个 #pragma 的重度使用者,因为我倾向于在代码中(而不是在开发环境中)指定所有的设定。
这样,你的东西就不再依赖开发环境,而是依赖你自己的代码。是不是更加有安全感?
居安,思危。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Visual C++ 2005 will generate manifests for you》