InitCommonControlsEx() 函数无法被编译器识别

问题描述 投票:0回答:2

我试图在窗口程序的主条目中调用 InitCommonControlsEx() ,尽管我包含了标头并链接到 ComCtl32.Lib,但由于某种原因,编译器强调该函数为未定义。以下是代码...

#include <CommCtrl.h>

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
INITCOMMONCONTROLSEX initControls;
initControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
initControls.dwICC = ICC_BAR_CLASSES;
InitCommonControlsEx(&initControls);
}

我知道包含该标头正在做一些事情,因为如果我删除该标头的包含,那么编译器将无法识别类 INITCOMMONCONTROLSEX。

我真的很困惑。我进入 CommCtrl.h 文件,发现许多部分都用红色下划线表示编译器发出警告,包括对 WINAPI 的任何引用。难道是我的头坏了?我知道函数声明在那里,如下图所示...

我已经在谷歌上搜索了几个小时,但无法弄清楚。没有我还需要的 DLL 文件,是吗?正如我所说,我已经链接了 ComCtl32.Lib,有时称为 comctl32.lib(我认为大写字母并不重要)。此外,在我的计算机上,我有 4 个 ComCtl32.Lib 实例,其中两个用于 64 位,两个用于 x86。但是,我的感觉是问题是它只是无法从该标头找到该函数的声明。谢谢。

编辑:感谢 Harry Johnson 我解决了这个问题。我不知道包含标准头文件需要在它们之前包含其他头文件。在这种情况下,编译器无法识别任何内容,因为在 CommCtrl.h 之前未包含 windows.h。对于任何知道自己在做什么的人来说,这是一个明显的错误。你可以完全删除这个问题。我预计,当包含 Windows 提供的标头时,所有相关依赖项都包含在该标头中。

c++ function winapi header controls
2个回答
1
投票

如果您在 Visual Studio 2022 中看到 LNK2019,请添加 #pragma 行。

#include <CommCtrl.h>

#pragma comment( lib, "comctl32.lib" )

int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, int nCmdShow)
{
    INITCOMMONCONTROLSEX initControls;
    initControls.dwSize = sizeof(INITCOMMONCONTROLSEX);
    initControls.dwICC = ICC_BAR_CLASSES;
    InitCommonControlsEx(&initControls);
}

0
投票

将 include 指令语句替换为 #包括 这样问题就解决了。

© www.soinside.com 2019 - 2024. All rights reserved.