질문과 답변

윈도우즈 API 정복 1권 998p~999p 질문있습니다. 날짜:2024-10-7 11:01:31 조회수:1199
작성자 : 황금가물치
포인트 : 86
가입일 : 2022-05-06 15:33:18
방문횟수 : 69
글 12개, 댓글 13개
소개 : 안녕하세요. 윈도우즈api를 공부하기위하여 가입했습니다. 잘 부탁드립니다.
작성글 보기
쪽지 보내기
#include "pch.h"
#include "framework.h"
#include "Ex_998p_FreeSpace.h"

#include<stdio.h>
#include<commctrl.h>

HWND hProg[24]{}, hStatic[24]{};
#define MEGA (1048576)


LPCTSTR MyClassName = TEXT("FreeSpace");
HINSTANCE g_hInst{};
HWND hWndMain{};

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

int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) {
    HWND hWnd{};
    MSG msg{};
    WNDCLASSEXW wndclassexw{};

    g_hInst = hInstance;

    wndclassexw.lpfnWndProc = WndProc;
    wndclassexw.hInstance = hInstance;
    wndclassexw.lpszClassName = MyClassName;
    wndclassexw.hIconSm = NULL;
    wndclassexw.cbSize = sizeof(WNDCLASSEXW);
    wndclassexw.cbClsExtra = 0;
    wndclassexw.cbWndExtra = 0;
    wndclassexw.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclassexw.hIcon = LoadIconW(NULL, IDI_APPLICATION);
    wndclassexw.hCursor = LoadCursorW(NULL, IDC_ARROW);
    wndclassexw.lpszMenuName = NULL;
    wndclassexw.style = CS_VREDRAW | CS_HREDRAW;

    RegisterClassExW(&wndclassexw);

    hWnd = CreateWindowExW(NULL, MyClassName, MyClassName, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL, hInstance, NULL);

    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while (GetMessageW(&msg, NULL, 0, 0)) {
        TranslateMessage(&msg);
        DispatchMessageW(&msg);
    }
    return((int)msg.wParam);
}

void ReScan() {
    int i{};
    UINT Type{};
    TCHAR Drive[MAX_PATH]{};
    TCHAR Caption[MAX_PATH + 128]{};
    TCHAR Volume[MAX_PATH]{};
    ULARGE_INTEGER Avail{}, Total{};
    double nTotal{}, nAvail{};
    int Find = 0;

    for (i = 0; i < 24; i++) {
        if (hProg[i] != NULL) {
            DestroyWindow(hProg[i]);
            DestroyWindow(hStatic[i]);
            hProg[i] = NULL;
            hStatic[i] = NULL;
        }
    }
    for (i = 'C'; i <= 'Z'; i++) {
        wsprintf(Drive, TEXT("%c\\"), i);
        Type = GetDriveType(Drive);
    
        if (Type == DRIVE_FIXED) {
            hProg[Find] = CreateWindow(PROGRESS_CLASS, NULL,
                WS_CHILD | WS_VISIBLE | WS_BORDER, 10,
                Find * 40 + 50, 300, 25, hWndMain, NULL, g_hInst, NULL);
            hStatic[Find] = CreateWindow(TEXT("static"), NULL,
                WS_CHILD | WS_VISIBLE, 320, Find * 40 + 50, 500, 25, hWndMain, (HMENU)-1, g_hInst, NULL);

            GetDiskFreeSpaceEx(Drive, &Avail, &Total, NULL);
            nTotal = int(Total.QuadPart / MEGA) / 1024.0;
            nAvail = int(Avail.QuadPart / MEGA) / 1024.0;
            GetVolumeInformation(Drive, Volume, MAX_PATH, NULL, NULL, NULL, NULL, 0);

            sprintf(Caption, "%c(%s): 총 %.2fG중 %.2fG사용, %.2fG사용가능", i, Volume, nTotal, (nTotal - nAvail), nAvail);
            SetWindowText(hStatic[Find], Caption);

            SendMessage(hProg[Find], PBM_SETRANGE, 0, MAKELPARAM(0, 100));
            SendMessage(hProg[Find], PBM_SETPOS, int((nTotal - nAvail) * 100 / nTotal), 0);
            Find++;
        }
    }
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {

    switch (iMessage) {
    case WM_CREATE:
        hWndMain = hWnd;
        InitCommonControls();
        CreateWindow(TEXT("button"), TEXT("다시 조사"),
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            20, 15, 150, 25, hWnd, (HMENU)100, g_hInst, NULL);
        ReScan();
        return(0);
    case WM_COMMAND:
        switch (LOWORD(wParam)){
        case 100:
            ReScan();
            break;
        }
        return(0);
    case WM_DESTROY:
        PostQuitMessage(0);
        return(0);
    }
    return(DefWindowProcW(hWnd, iMessage, wParam, lParam));
}

-----------------------------------------------------------------------------------------------------------------------------------------
밑줄 친 sprintf에서 에러가 계속 발생하는데 해결책이 무엇인지 궁금합니다.
인터넷 뒤지다 보니 TCHAR형식의 변수는 sprintf함수에서 사용 못 한다고 나와있는데 맞는지요?
해결책이 있다면 어떻게 수정해야하는지 궁금합니다.



김민수
error code: 522

목록보기 삭제 수정 신고 스크랩

꿀꿀이호떡 11월18일 9:31:29  

char 형은 sprintf를 쓰고 TCHAR 형은 wsprintf 함수를 씁니다.

올리신 소스에도 wsprintf(Drive, TEXT("%c\"), i);
형태로 사용된 부분이 있네요


로그인하셔야 댓글을 달 수 있습니다.