调用 TaskDialogIndirect 加载程序说找不到序号 345

calling TaskDialogIndirect loader says ordinal 345 not found

我为 TaskDialogIndirect 构建了简单的 MS 示例(参见 https://msdn.microsoft.com/en-us/library/windows/desktop/bb760544(v=vs.85).aspx

当我 运行 它时,我得到 "The ordinal 345 could not be located in the dynamic link library COMCTL32.dll"

上面的页面说它需要 ComCtl32.DLL 版本 6,但是 C:\Windows\System32\ComCtl32.DLL 是 5.82.7601.18201,我在磁盘上的任何地方都找不到版本 6。

我 运行宁 Windows 7 使用 VS2012。 TaskDialog 已添加到 Vista 中,为什么我没有正确版本的 ComCtl32.DLL???

ComCtl32.dll 在 Windows XP 和更高版本 (SxS) 上有两个版本。 v5.8x 是默认设置,您需要 opt-in 才能获得 v6,因为可能与新的 Themes/Visual 样式不兼容。大多数新功能和控件仅添加到 v6。

要获得 v6,您必须 add a manifest 到您的应用程序。建议您将清单嵌入到应用程序资源中,但您也可以使用外部清单;只需将 XML 文件命名为 yourappname.exe.manifest.

这是一个常用且有用的代码块,应该有助于加载正确的常用控件comctl32.dll

#if defined _M_IX86
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker, "/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif

您可以运行sfc /scannow解决这个问题。 [Reference].