我正在尝试在应用程序中启用常用控件.我按照本MSDN文章中给出的步骤进行了操作,特别是在仅使用标准扩展的应用程序中使用ComCtl32.dll版本6的部分.但我无法让它发挥作用.
我在文章中做的唯一不同之处是我在Project Property Pages中添加了清单信息 配置属性| 链接器| 清单文件| 额外的清单依赖关系.这是我在文本框中输入的内容:
"type ='Win32'name ='Microsoft.Windows.Common-Controls'version ='6.0.0.0'processorArchitecture ='*'publicKeyToken ='6595b64144ccf1df'language ='*'xmlns =' http://schemas.microsoft. com/developer/msbuild/2003 '";%(AdditionalManifestDependencies)
当我检查生成的清单(MyApp.exe.intermediate.manifest)时,它看起来是正确的.
我还在Project Properties中为ComCtl32.lib添加了一个链接依赖项 配置属性| 链接器| 输入| 额外的依赖关系.我也在启动时调用InitCommonControlsEx,其INITCOMMONCONTROLSEX结构初始化如下:
INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
Run Code Online (Sandbox Code Playgroud)
但是对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不同吗?
Who*_*aig 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'
在手工处理公共控件的清单版本之后,加载列表现在包含了这个(并且正确地回答了TRUE InitCommonControlsEx(),这首先是所有这一点):
已加载'C:\ Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_ 6.0.7601.17514 _none_41e6975e2bd6f2b2\comctl32.dll'
注意:您也可以使用源代码#pragma,最好是在stdafx.h头文件中,但我更喜欢这种方式.
希望能帮助到你.
不,有关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='*'\"")
Run Code Online (Sandbox Code Playgroud)
只需将上面的代码段复制并粘贴到您的一个源文件中即可.