본문 바로가기
코드/C++

6개의 버튼을 가진 윈도우 생성 (LNK2019, LNK1120)

by bongin 2023. 6. 20.
728x90
반응형

1. cl opener.cpp 컴파일 : 오류 발생, 내용
opener.obj : error LNK2019: __imp__GetMessageA@16 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__TranslateMessage@4 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__DispatchMessageA@4 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__DefWindowProcA@16 외부 기호(참조 위치: "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__PostQuitMessage@4 외부 기호(참조 위치: "long __stdcall WindowProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WindowProc@@YGJPAUHWND__@@IIJ@Z) 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__RegisterClassExA@4 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__CreateWindowExA@48 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__ShowWindow@8 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__UpdateWindow@4 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__MessageBoxA@16 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__LoadCursorA@8 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.
opener.obj : error LNK2019: __imp__LoadIconA@8 외부 기호(참조 위치: _WinMain@16 함수)에서 확인하지 못했습니다.

opener.obj : error LNK2019: __imp__ShellExecuteA@24 외부 기호(참조 위치: "long __stdcall ButtonClickProc(struct HWND__ *,unsigned int,unsigned int,long)" (?ButtonClickProc@@YGJPAUHWND__@@IIJ@Z) 함수)에서 확인하지 못했습니다.
opener.exe : fatal error LNK1120: 13개의 확인할 수 없는 외부 참조입니다.

2. cl opener.cpp user32.lib 컴파일 : 오류 발생, 내용
opener.obj : error LNK2019: __imp__ShellExecuteA@24 외부 기호(참조 위치: "long __stdcall ButtonClickProc(struct HWND__ *,unsigned int,unsigned int,long)" (?ButtonClickProc@@YGJPAUHWND__@@IIJ@Z) 함수)에서 확인하지 못했습니다.
opener.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.

3. cl opener.cpp user32.lib shell32.lib 컴파일 : 오류 발생, 내용 (동일)
opener.obj : error LNK2019: __imp__ShellExecuteA@24 외부 기호(참조 위치: "long __stdcall ButtonClickProc(struct HWND__ *,unsigned int,unsigned int,long)" (?ButtonClickProc@@YGJPAUHWND__@@IIJ@Z) 함수)에서 확인하지 못했습니다.
opener.exe : fatal error LNK1120: 1개의 확인할 수 없는 외부 참조입니다.

해결 방법
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib의 Shell32.lib파일을
C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib에 복사 (기존에 있던 Shell32.lib는 Shell32_Original.lib로 변경)

cl opener.cpp user32.lib shell32.lib : 컴파일 정상
cl opener.cpp user32.lib : 컴파일 정상

 

 

 

Opener.cpp

ChatGPT에게 C++로 프로그램을 만들거야. 크기는 1024*720이고 클릭할 수 있는 버튼은 6개가 있어. 각 버튼 중 3개는 메모장 열기, 그림판 열기, 크롬 열기 기능을 수행하고 나머지 3개는 비워둘게. 코드를 작성해 줘.

#include <windows.h>
#pragma comment(lib,"user32")
#pragma comment(lib,"gdi32")
#pragma comment(lib,"Shell32")

// 버튼 식별자
#define BUTTON_MEMO 1001
#define BUTTON_PAINT 1002
#define BUTTON_CHROME 1003
#define BUTTON_EMPTY1 1004
#define BUTTON_EMPTY2 1005
#define BUTTON_EMPTY3 1006

// 버튼 클릭 이벤트 핸들러
LRESULT CALLBACK ButtonClickProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (LOWORD(wParam))
    {
        case BUTTON_MEMO:
            // 메모장 열기 기능 수행
            ShellExecute(NULL, "open", "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
            break;
        case BUTTON_PAINT:
            // 그림판 열기 기능 수행
            ShellExecute(NULL, "open", "mspaint.exe", NULL, NULL, SW_SHOWNORMAL);
            break;
        case BUTTON_CHROME:
            // 크롬 열기 기능 수행
            ShellExecute(NULL, "open", "chrome.exe", NULL, NULL, SW_SHOWNORMAL);
            break;
        // 나머지 버튼은 비워둠
    }
    return 0;
}

// 윈도우 프로시저
LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
        case WM_COMMAND:
            return ButtonClickProc(hwnd, message, wParam, lParam);
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        default:
            return DefWindowProc(hwnd, message, wParam, lParam);
    }
    return 0;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // 윈도우 클래스 등록
    WNDCLASSEX wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WindowProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = "MyWindowClass";
    wcex.hIconSm = LoadIcon(NULL, IDI_APPLICATION);

    if (!RegisterClassEx(&wcex))
    {
        //MessageBox(NULL, "Window registration failed!", "Error", MB_ICONERROR | MB_OK);
        return 0;
    }

    // 윈도우 생성
        HWND hwnd = CreateWindow("MyWindowClass", "My Window", WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, 1024, 720, NULL, NULL, hInstance, NULL);

    if (hwnd == NULL)
    {
        //MessageBox(NULL, "Window creation failed!", "Error", MB_ICONERROR | MB_OK);
        return 0;
    }

    // 버튼 생성
    CreateWindow("BUTTON", "메모장 열기", WS_VISIBLE | WS_CHILD, 10, 10, 150, 30, hwnd, (HMENU)BUTTON_MEMO, hInstance, NULL);
    CreateWindow("BUTTON", "그림판 열기", WS_VISIBLE | WS_CHILD, 10, 50, 150, 30, hwnd, (HMENU)BUTTON_PAINT, hInstance, NULL);
    CreateWindow("BUTTON", "크롬 열기", WS_VISIBLE | WS_CHILD, 10, 90, 150, 30, hwnd, (HMENU)BUTTON_CHROME, hInstance, NULL);
    CreateWindow("BUTTON", "", WS_VISIBLE | WS_CHILD, 10, 130, 150, 30, hwnd, (HMENU)BUTTON_EMPTY1, hInstance, NULL);
    CreateWindow("BUTTON", "", WS_VISIBLE | WS_CHILD, 10, 170, 150, 30, hwnd, (HMENU)BUTTON_EMPTY2, hInstance, NULL);
    CreateWindow("BUTTON", "", WS_VISIBLE | WS_CHILD, 10, 210, 150, 30, hwnd, (HMENU)BUTTON_EMPTY3, hInstance, NULL);

    // 윈도우 화면에 표시
    ShowWindow(hwnd, nCmdShow);
    UpdateWindow(hwnd);

    // 메시지 루프
    MSG msg;
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}
728x90
반응형

'코드 > C++' 카테고리의 다른 글

서브시스템  (0) 2023.07.09
128TB를 16진수로 변환  (0) 2023.07.07
버튼 클릭 시 메세지 출력  (0) 2023.05.16
Chapter04_Game programming in c++  (0) 2022.09.17
Chapter03_Game programming in c++  (0) 2022.09.09

댓글