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