我正在尝试在应用程序中启用常用控件。我按照this MSDN article中给出的步骤,特别是Using ComCtl32.dll Version 6 in an Application That Uses Only Standard Extensions部分。但我无法让它发挥作用。
我与文章的不同之处在于我在项目属性页面中添加了清单信息配置属性|链接器|清单文件|额外的清单依赖性。这就是我在文本框中输入的内容:
“type ='Win32'name ='Microsoft.Windows.Common-Controls'version ='6.0.0.0'processorArchitecture ='*'publicKeyToken ='6595b64144ccf1df'language ='*'xmlns ='{{ 3}}'“;%(AdditionalManifestDependencies)
当我检查生成的清单(MyApp.exe.intermediate.manifest)时,它看起来是正确的。
我还在项目属性|中向ComCtl32.lib添加了链接依赖项配置属性|链接器|输入|其他依赖性。我还在启动时调用InitCommonControlsEx,并将INITCOMMONCONTROLSEX结构初始化为:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
但是对InitCommonControlsEx的调用总是返回FALSE(这意味着它失败了)。经过一番调查后,我发现GetLastError返回的错误代码是ERROR_FILE_NOT_FOUND。可能是什么问题?
更新:我注意到可能与“找不到文件错误”相关的内容。当我从调试器运行应用程序时,“输出”窗口中的一行是:
'MyApp.exe':已加载'C:\ Windows \ winsxs \ x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6002.18305_none_88f3a38569c2c436 \ comctl32.dll',无法找到或打开PDB文件
但是,对于一些更标准的库,如kernel32.lib,user32.lib等,有许多类似的行:
'MyApp.exe':已加载'C:\ Windows \ System32 \ ntdll.dll',无法找到或打开PDB文件
'MyApp.exe':已加载'C:\ Windows \ System32 \ kernel32.dll',无法找到或打开PDB文件
'MyApp.exe':已加载'C:\ Windows \ System32 \ msvcrt.dll',无法找到或打开PDB文件
'MyApp.exe':已加载'C:\ Windows \ System32 \ user32.dll',无法找到或打开PDB文件
这些行总是出现在任何应用程序中,并且不会导致任何问题。它可能与ComCtl32.dll不同吗?
答案 0 :(得分:12)
行。我做了一些关于此的功课,并发现了一些新的东西。我最终如何使用它几乎你正在尝试做什么:
输入以下文字逐字(表示所有单引号和双引号完全如下)。这一切都在一条线上,顺便说一句。
"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"
保存您的设置,执行完整项目(如果不是解决方案)重建以强制清单和PCH重新生成。
在执行此操作之前,以下内容位于我的加载列表中:
加载 ' C:\的Windows \ WINSXS \ x86_microsoft.windows.common-controls_6595b64144ccf1df_的 5.82.7601.17514 强> _none_ec83dffa859149af \ COMCTL32.DLL'
在手工处理公共控件的清单版本之后,加载列表现在包含了这个(并且正确地回答了InitCommonControlsEx()
的TRUE,这是所有这一切的重点):
加载 ' C:\的Windows \ WINSXS \ x86_microsoft.windows.common-controls_6595b64144ccf1df_的 6.0.7601.17514 强> _none_41e6975e2bd6f2b2 \ COMCTL32.DLL'
注意:您也可以使用源代码#pragma,最好是在stdafx.h头文件中,但我更喜欢这样。
希望它有所帮助。
答案 1 :(得分:9)
不,有关PDB文件的警告只是告诉您没有Windows系统DLL的调试信息。从InitializeCommonControlsEx()获得FALSE返回当然是关键问题。
您使用的Additional Manifest Dependencies字符串有问题。我纠结了一段时间,但找不到这个缺陷。在源代码中指定链接器选项通常更容易。当我使用时,一切都运作良好:
#include <CommCtrl.h>
#pragma comment(lib,"comctl32.lib")
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
只需将上面的代码段复制并粘贴到您的某个源文件中即可。