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

C++ 如何在Windows应用程序中启用常用控件,c++,winapi,C++,Winapi,我正在尝试在应用程序中启用公共控件。我遵循中给出的步骤,特别是本节。但我不能让它工作 与本文不同的是,我在项目属性页|配置属性|链接器|清单文件|其他清单依赖项中添加清单信息。这是我在文本框中输入的内容: “type='Win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'language='*'xmlns='

我正在尝试在应用程序中启用公共控件。我遵循中给出的步骤,特别是本节。但我不能让它工作

与本文不同的是,我在项目属性页|配置属性|链接器|清单文件|其他清单依赖项中添加清单信息。这是我在文本框中输入的内容:

“type='Win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'language='*'xmlns='”;%(其他依赖项)

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

我还向项目属性|配置属性|链接器|输入|其他依赖项中的ComCtl32.lib添加了链接依赖项。我还在启动时调用InitCommonControlsEx,InitCommonControlsEx结构初始化如下:

INITCOMMONCONTROLSEX icex;
icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
icex.dwICC = ICC_STANDARD_CLASSES;
但是对InitCommonControlsEx的调用总是返回FALSE(这意味着它失败)。经过一些调查,我发现GetLastError返回的错误代码是error\u FILE\u NOT\u 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是否会有所不同?

否,关于PDB文件的警告只是告诉您没有Windows系统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='*'\"")
#包括
#pragma注释(lib,“comctl32.lib”)
#pragma注释(链接器,“/manifestdependency:\”type='win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processorArchitecture='*'publicKeyToken='6595b64144ccf1df'language='*'\“”)

只需将上述代码片段复制并粘贴到一个源文件中即可。

确定。我做了一些家庭作业,发现了一些新的东西。我最终是如何做到这一点的,这几乎就是你想要做的:

  • 转到项目/属性/链接器/清单文件/其他清单依赖项
  • 按原样输入以下文本(表示所有单引号和双引号,如下所示)。顺便说一句,这一切都在一条线上

    “type='win32'name='Microsoft.Windows.Common Controls'version='6.0.0.0'processor架构='*'publicKeyToken='6595b64144ccf1df'语言='*'”

  • 保存您的设置并执行完整项目(如果不是解决方案)重建以强制清单和PCH重新生成

  • 在此之前,我的加载列表中包含以下内容:

    装载 'C:\Windows\winsxs\x86_microsoft.Windows.common-controls_6595b64144ccf1df_5.82.7601.17514_none_ec83dffa859149af\comctl32.dll'

    在hand forcnig公共控件的清单版本之后,加载列表现在包括以下内容(并且正确地回答了
    InitCommonControlsEx()
    ,这是所有这些的第一点):

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

    注意:您也可以使用源代码内的#pragma实现这一点,最好是在stdafx.h头中,但我更喜欢这种方式


    希望有帮助。

    所以我要问一个显而易见的问题。在没有手动添加清单信息的情况下,它是否工作?@ WooZrigig尝试了它,没有工作。您是否考虑调用InCuto控件()(而不是Exvon)作为WinMain的第一行。那不管用吗?或者你正在尝试一种新的视觉风格?谢谢,现在可以了!因此,导致错误的唯一原因是“xmlns”属性。我甚至不知道这个属性最初是如何出现的,因为我只是复制并粘贴了MSDN文章中的内容。它一定是VS在我试图获得正确的报价时添加的。