New in Visual C++ 2005 is the ability to
specify a manifest
dependency via a #pragma directive.
This greatly simplifies using version 6 of the shell
common controls.
You just have to drop the line
// 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='*'\"")
into your program and the linker will do the rest.
Note that the processor architecture is hard-coded into the above directive, which means that if you are targetting x64, you’ll get the wrong manifest. To fix that, we need to do some preprocessor munging.
#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='*'\"")
Update: I didn’t know that * is allowed here to indicate “all architectures”. That simplifies matters greatly.
#pragma comment(linker, \
"\"/manifestdependency:type='Win32' "\
"name='Microsoft.Windows.Common-Controls' "\
"version='6.0.0.0' "\
"processorArchitecture='*' "\
"publicKeyToken='6595b64144ccf1df' "\
"language='*'\"")
Nitpicker’s corner
* That wasn’t a footnote marker.
0 comments