VSCode 环境中发生winmain@16错误

winmain@16 error occurs in vscode environment

提问人:backpack 提问时间:3/13/2023 更新时间:3/13/2023 访问量:56

问:

我正在使用 msvc 编译器来创建窗口。发生链接错误,但由于我不熟悉 vscode,因此问题难以解决。

#include <windows.h>

#pragma comment(linker, "/entry:wWinMainCRTStartup /subsystem:console")

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PWSTR pCmdLine, int nCmdShow) {

    MSG msg;
    HWND hwnd;
    WNDCLASSW wc;

    wc.style         = CS_HREDRAW | CS_VREDRAW;
    wc.cbClsExtra    = 0;
    wc.cbWndExtra    = 0;
    wc.lpszClassName = L"Window";
    wc.hInstance     = hInstance;
    wc.hbrBackground = GetSysColorBrush(COLOR_3DFACE);
    wc.lpszMenuName  = NULL;
    wc.lpfnWndProc   = WndProc;
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);
    wc.hIcon         = LoadIcon(NULL, IDI_APPLICATION);

    RegisterClassW(&wc);
    hwnd = CreateWindowW(wc.lpszClassName, L"Window",
                WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                100, 100, 350, 250, NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0)) {

        DispatchMessage(&msg);
    }

    return (int) msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg,
    WPARAM wParam, LPARAM lParam) {

    switch(msg) {

      case WM_DESTROY:

          PostQuitMessage(0);
          break;
    }

    return DefWindowProcW(hwnd, msg, wParam, lParam);
}


我已经确认在使用 g++ 时编译而不保存时会发生类似的错误,但就我而言,它是 msvc。 对于 msvc,它将在 2019 年通过开发人员 Power shell 使用。

WinAPI 可视化 C++ LNK2019

评论


答:

0赞 Michael Chourdakis 3/13/2023 #1

您与控制台 sybsystem 选项链接,但缺少该功能。控制台应用以 .mainmain

创建一个函数或与“Windows”子系统链接,以以 .mainWinMain

也许根本不需要。/entry:wWinMainCRTStartup

评论

0赞 backpack 3/13/2023
那么,我应该如何将子系统转换为Windows呢?
0赞 backpack 3/13/2023
在 Visual Studio 环境中,此代码在控制台模式下也能正常工作。我猜这可能是因为我通过编译指示将入口点更改为 winmain。
0赞 IInspectable 3/14/2023
@backpack 设置函数的入口点会绕过 CRT 的启动代码(顺便说一句,这做了很多)。最好永远不要改变这一点。就 -指令而言,不支持提供的任何选项。您需要将该选项显式传递给链接器。构建环境的手册应说明如何设置它。或者,使用 Visual Studio,并获取一个实际上有用的调试器作为奖励。#pragma/SUBSYSTEM:WINDOWS