0

I am new to C++ and still trying to learn it. I have some code i copied over from here.

The thing is I follow the instructions very carefully, but still get errors even tough what I do, is exactly what they tell me to do, it doesn't work.

// HelloWindowsDesktop.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c

#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>

// Global variables

// The main window class name.
static TCHAR szWindowClass[] = _T("DesktopApp");

// The string that appears in the application's title bar.
static TCHAR szTitle[] = _T("Windows Desktop Guided Tour Application");

HINSTANCE hInst;

// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int CALLBACK WinMain(
    _In_ HINSTANCE hInstance,
    _In_ HINSTANCE hPrevInstance,
    _In_ LPSTR     lpCmdLine,
    _In_ int       nCmdShow
)
{
    WNDCLASSEX wcex;

    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = szWindowClass;
    wcex.hIconSm = LoadIcon(wcex.hInstance, IDI_APPLICATION);

    if (!RegisterClassEx(&wcex))
    {
        MessageBox(NULL,
            _T("Call to RegisterClassEx failed!"),
            _T("Windows Desktop Guided Tour"),
            NULL);

        return 1;
    }

    // Store instance handle in our global variable
    hInst = hInstance;

    // The parameters to CreateWindow explained:
    // szWindowClass: the name of the application
    // szTitle: the text that appears in the title bar
    // WS_OVERLAPPEDWINDOW: the type of window to create
    // CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
    // 500, 100: initial size (width, length)
    // NULL: the parent of this window
    // NULL: this application does not have a menu bar
    // hInstance: the first parameter from WinMain
    // NULL: not used in this application
    HWND hWnd = CreateWindow(
        szWindowClass,
        szTitle,
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        500, 100,
        NULL,
        NULL,
        hInstance,
        NULL
    );

    if (!hWnd)
    {
        MessageBox(NULL,
            _T("Call to CreateWindow failed!"),
            _T("Windows Desktop Guided Tour"),
            NULL);

        return 1;
    }

    // The parameters to ShowWindow explained:
    // hWnd: the value returned from CreateWindow
    // nCmdShow: the fourth parameter from WinMain
    ShowWindow(hWnd,
        nCmdShow);
    UpdateWindow(hWnd);

    // Main message loop:
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return (int)msg.wParam;
}

//  FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
//  PURPOSE:  Processes messages for the main window.
//
//  WM_PAINT    - Paint the main window
//  WM_DESTROY  - post a quit message and return
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    PAINTSTRUCT ps;
    HDC hdc;
    TCHAR greeting[] = _T("Hello, Windows desktop!");

    switch (message)
    {
    case WM_PAINT:
        hdc = BeginPaint(hWnd, &ps);

        // Here your application is laid out.
        // For this introduction, we just print out "Hello, Windows desktop!"
        // in the top left corner.
        TextOut(hdc,
            5, 5,
            greeting, _tcslen(greeting));
        // End application-specific layout section.

        EndPaint(hWnd, &ps);
        break;
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
        break;
    }

    return 0;
}

These are the errors:

1st error:

Error LNK2019 unresolved external symbol _main referenced in function "int >__cdecl invoke_main(void)" (?invoke_main@@YAHXZ) Learn1 >C:\Users\user\source\repos\Learn1\Learn1\MSVCRTD.lib(exe_main.obj) 1

2nd error:

Error LNK1120 1 unresolved externals Learn1 >C:\Users\user\source\repos\Learn1\Debug\Learn1.exe 1

I suspect the second error follows after the first. So if the first is solved the second will be too.

  • 2
    What kind of project did you chose when you created the project? – NathanOliver Jul 03 '19 at 13:25
  • Nathan's right: you're supplying WinMain and it's expecting to link in main. Note the instructions at the top of the file tell you to compile with `/D_WINDOWS` and if you selected 'Win32 Console App' for your project then you won't have `_WINDOWS`, you'll have `_CONSOLE` or similar. You can probably just change this in your project settings, probably under the preprocessor tab. – Rup Jul 03 '19 at 13:31

3 Answers3

4

/SUBSYSTEM:CONSOLE) is for console based applications. You should define main function in code.

/SUBSYSTEM:WINDOWS) is for GUI applications. You should define WinMain function

You have selected the subsytem as CONSOLE and should be WINDOWS since you have WinMain and message handler.

You can change it under project properties

Project>Properties>Linker>System>Subsystem
SolidMercury
  • 973
  • 6
  • 15
1

Unsure if you ever got an answer, or if you even still need it, but I had this same error and it turned out that it was because I hadn't included an 'int main() {}' function. Hope this helps someone in the future because I had a lot of trouble finding the solution.

  • The other answer here did answer the question correctly: this program is using WinMain not main and so needed to be compiled with /subsystem:windows, which looks for WinMain not main. – Rup Jun 20 '21 at 18:21
0

I also meet this error, not sure your issue is the same as mine. I know what happened in my scenario, I want to generate a DLL file on the x86 platform, but I did not change the configuration correctly. the solution is right click project->propeties->Configuratioin General->modify Platform and Configuration Type(position is like below picture). enter image description here