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

2023-11-27

我正在尝试在应用程序中启用通用控件。我按照中给出的步骤进行操作这篇 MSDN 文章,特别是该部分在仅使用标准扩展的应用程序中使用 ComCtl32.dll 版本 6。但我无法让它发挥作用。

我做的唯一与本文不同的事情是我将清单信息添加到项目属性页|配置属性|链接器|清单文件 |附加清单依赖项。这是我在文本框中输入的内容:

“类型='Win32'名称='Microsoft.Windows.Common-Controls'版本='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'语言='*'xmlns='http://schemas.microsoft.com/developer/msbuild/2003'";%(附加清单依赖项)

当我检查生成的清单(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。可能是什么问题呢?

UPDATE:我注意到一些可能与“文件未找到错误”相关的内容。当我从调试器运行应用程序时,输出窗口中的一行是:

'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 会有所不同吗?


好的。我对此做了一些功课,并自己发现了一些新东西。我最终如何让它发挥作用的是almost你想做什么:

  1. Go to 项目/属性/链接器/清单文件/其他清单依赖项
  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_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll'

在手动更改公共控件的清单版本后,加载列表现在包含此内容(并正确回答 TRUEInitCommonControlsEx(),这首先是这一切的重点):

已加载 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.7601.17514_none_41e6975e2bd6f2b2\comctl32.dll'

注意:您也可以使用源内 #pragma 来执行此操作,最好在 stdafx.h 标头中,但我更喜欢这种方式。

希望能帮助到你。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Windows 应用程序中启用常用控件 的相关文章