如何在Windows应用程序中启用通用控件

How to enable common controls in a Windows app

本文关键字:启用 控件 应用程序 Windows      更新时间:2023-10-16

我正在尝试在应用程序中启用通用控件。我遵循此MSDN文章中给出的步骤,特别是仅使用标准扩展名的应用程序中使用COMCTL32.DLL版本6的部分。但是我无法正常工作。

我唯一与文章不同的事情是我在项目属性页面中添加了清单信息|配置属性|链接器|清单文件|其他清单依赖关系。这就是我在文本框中输入的内容:

" type ='win32'name ='microsoft.windows.common-controls'版本='6.0.0.0.0'processorrarchitecture ='*'*'publicKeyToken ='6595b64144ccf1df'6595b64144ccf1df'语言='//schemas.microsoft.com/developer/msbuild/2003'";%(额外manifestDepentencies)

当我检查生成的清单(myapp.exe.intermediate.manifest)时,它看起来正确。

我还向项目属性中的comctl32.lib添加了链接依赖关系|配置属性|链接器|输入|其他依赖关系。我还在启动时致电InitCommonControlsex结构,以此为初始化:

INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;

但是呼叫initcommoncontrolsex始终返回false(这意味着失败)。经过一些调查,我发现从getlasterror返回的错误代码是error_file_not_found。有什么问题?

更新:我注意到可能与"未找到错误"有关的东西。当我从调试器运行应用程序时,输出窗口中的一条行是:

'myapp.exe':已加载'c: windows winds x86_microsoft.windows.common-controls_6595b64144ccf1df1df1df_5.82.82.6002.18305_none_none_none_8888f3a3a3a3a3A3A3A3A3A3A3A3A3AC2C2C2C436 co.

但是,对于某些更标准的库,例如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是否有所不同?

好。我对此做了一些作业,发现了一些新事物。我最终如何工作是几乎您要做什么:

  1. 转到项目/properties/linker/清单文件/其他清单依赖关系
  2. 输入以下文本 verbatim (含义完全如下所示)。这一切都在一行,顺便说一句。

    "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_6595b641444ccf1df_ 5.82.7601.17514 _none_ec83dffa5ffa.859149af comctl32.

在手用力后,通用控件的清单版本现在包括此(并正确回答InitCommonControlsEx(),这首先是所有这些的重点):

加载 'c: windows winsxs x86_microsoft.windows.common-controls_6595b6414144ccf1df_ 6.0.7601.17514 p>注意:您也可以使用源源#pragma进行此操作,理想情况下在您的stdafx.h标题中,但我更喜欢这种方式。

希望它有帮助。

不,关于PDB文件的警告只是在那里告诉您,您没有Windows System DLL的调试信息。从initializecommoncontrolsex()获得错误的返回当然是关键问题。

您使用的附加依赖依赖项存在问题。我修补了一段时间,但找不到缺点。通常更容易在源代码中指定链接器选项。当我使用时,一切都很好:

#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='*'"")

只需将上述代码片段复制到您的一个源文件之一。