8

我正在尝试在应用程序中启用常用控件。我遵循了这篇 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)时,它看起来是正确的。

我还在项目属性 |中添加了对 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 会有所不同吗?

4

2 回答 2

14

好的。我对此做了一些功课,并自己发现了一些新东西。我最终如何让这个工作几乎是你想要做的:

  1. 转到项目/属性/链接器/清单文件/附加清单依赖项
  2. 逐字输入以下文本(表示所有单引号和双引号,如下所示)。顺便说一句,这一切都在一条线上。

    "type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'"

  3. 保存您的设置并重新构建完整的项目(如果不是解决方案)以强制清单和 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 标头中,但我更喜欢这种方式。

希望能帮助到你。

于 2012-12-20T19:46:06.733 回答
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='*'\"")

只需将上面的代码片段复制并粘贴到您的源文件之一中即可。

于 2012-12-20T19:43:10.783 回答