int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE

hPrevInst, LPSTR lpszArgs, int nWinMode){

  HWND hwnd;

  MSG msg;

  WNDCLASS EX wcl; 

  wcl.cbsize = sizeof(WINDCLASSEX);

  wcl.lpszClassName = szWinName;

  wcl.lpfnWndProc = WindowFunc;

  wcl.style = 0;

  wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);

  wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

  wcl.hcursor = LoadCursor(NULL, IDC_ARROW);

  wcl.lpszMenuName = NULL;

  wcl.cbClsExtra = 0;

  wcl.cbWnsExtra = 0;

  wcl.hbrBackground = (HBRUSH)

GetStockOject(WHITE_BRUSH);

    if (!RegisterClassEx(&wc1)) return 0;

    hwnd = CreateWindow(szWinName, "Windows 98

Skeleton", WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

HWND_DESKTOP, NULL, hThisInst, NULL);

    ShowWindow(hwnd, nWinMode);

    UpdateWindow(hwnd);

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

      TranslateMessage(&msg);

      DispatchMessage(&msg);

    }

    return msg.wParam;

}

 

// hiện thực hàm xử lý thông điệp

WindowFunc() {

 swith(message) {

   case WM_DESTROY:

            PosQuitMessage(0);

        break;

   default:

            return DefWindowPro(hwnd, message, wParam,

lParam);

 }

 return 0;

}

" />
  • Thứ Ba, 20/07/2004 16:36 (GMT+7)

    Câu hỏi :

    Tôi có nhập lại một đoạn chương trình trong sách dạy lập trình C++ trên Win98, khi biên dịch trên môi trường WinXP thì có rất nhiều lỗi. Đoạn code chương trình như sau:

    #include <windows.h>

    // prototype của hàm xử lý thông điệp

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

    char szWinName[] = "MyWin";

    int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE

    hPrevInst, LPSTR lpszArgs, int nWinMode){

      HWND hwnd;

      MSG msg;

      WNDCLASS EX wcl; 

      wcl.cbsize = sizeof(WINDCLASSEX);

      wcl.lpszClassName = szWinName;

      wcl.lpfnWndProc = WindowFunc;

      wcl.style = 0;

      wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);

      wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

      wcl.hcursor = LoadCursor(NULL, IDC_ARROW);

      wcl.lpszMenuName = NULL;

      wcl.cbClsExtra = 0;

      wcl.cbWnsExtra = 0;

      wcl.hbrBackground = (HBRUSH)

    GetStockOject(WHITE_BRUSH);

        if (!RegisterClassEx(&wc1)) return 0;

        hwnd = CreateWindow(szWinName, "Windows 98

    Skeleton", WS_OVERLAPPEDWINDOW,

    CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,

    HWND_DESKTOP, NULL, hThisInst, NULL);

        ShowWindow(hwnd, nWinMode);

        UpdateWindow(hwnd);

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

          TranslateMessage(&msg);

          DispatchMessage(&msg);

        }

        return msg.wParam;

    }

     

    // hiện thực hàm xử lý thông điệp

    WindowFunc() {

     swith(message) {

       case WM_DESTROY:

                PosQuitMessage(0);

            break;

       default:

                return DefWindowPro(hwnd, message, wParam,

    lParam);

     }

     return 0;

    }



    Trả lời :

    Trong khi viết 1 ứng dụng mới, bạn có thể gặp các lỗi sau:

    Lỗi về từ vựng, cú pháp. Chương trình dịch sẽ phát hiện các lỗi này và báo sai chi tiết cụ thể của từng lỗi cùng vị trí hàng lệnh bị lỗi. Do đó đây là loại lỗi dễ sửa chữa nhất, thí dụ source code của bạn chủ yếu bị lỗi thuộc loại này. Nếu bạn chú ý rằng ngôn ngữ C, C++ phân biệt chữ hoa và thường thì hàng lệnh:

    wcl.cbsize = sizeof(WINDCLASSEX);

    phải được viết đúng là :

    wcl.cbSize = sizeof(WNDCLASSEX);

    Tóm lại bạn nên cẩn thận để viết chính xác các tên biến, tên thuộc tính của đối tượng, ký tự nào chữ hoa phải viết chữ hoa, ký tự nào chữ thường phải viết chữ thường.

    Ngoài ra hàm xử lý thông điệp (message handler) của chương trình phải có đặc tả đúng với prototype của nó gồm đầy đủ các tham số và kiểu của từng tham số.

    Lỗi run-time. Đây là loại lỗi khó tìm và khó sửa chữa nhất vì chương trình dịch và máy tính không thể phát hiện dùm bạn được, bạn phải tự kiểm lỗi chương trình thông qua sự trợ giúp của công cụ debug. Một trong các lỗi runtime trong chương trình của bạn là khi khởi động record thông tin về class ứng dụng (record wcl), bạn chưa thiết lập thuộc tính "hInstance" của nó nên khi gọi hàm CreateWindow(), hệ thống không thực hiện mà sẽ báo sai.

    Sau đây là chương trình mà chúng tôi đã sửa chữa và chạy được. Lưu ý chương trình này chỉ hiển thị cửa sổ đơn giản và chưa thực hiện được chức năng gì cả.

    #include <windows.h>

    // prototype của hàm xử lý thông điệp

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

    char szWinName[] = "MyWin";

     

    // Điểm nhập của chương trình

    int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode){

    HWND hwnd;

    MSG msg;

    WNDCLASSEX wcl;  // bạn viết WNDCLASS EX wcl;

       wcl.cbSize = sizeof(WNDCLASSEX);          // bạn viết sai thuộc tính cbSize

       wcl.hInstance = hThisInst;       // bạn thiếu lệnh này.

       wcl.lpszMenuName = NULL;

       wcl.lpszClassName = szWinName;

       wcl.lpfnWndProc = WindowFunc;

       wcl.style = 0;

       wcl.hIcon = LoadIcon(NULL, IDI_APPLICATION);

       wcl.hIconSm = LoadIcon(NULL, IDI_WINLOGO);

       wcl.hCursor = LoadCursor(NULL, IDC_ARROW); //bạn viết sai wcl.hcursor = ...

       wcl.cbClsExtra = 0;

       wcl.cbWndExtra = 0;

       wcl.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

       if (!RegisterClassEx(&wcl)) return 0;

       hwnd = CreateWindow(szWinName, "Windows 98 Skeleton", WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT, HWND_DESKTOP, NULL, hThisInst, NULL);

       ShowWindow(hwnd, nWinMode);

       UpdateWindow(hwnd);

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

          TranslateMessage(&msg);

          DispatchMessage(&msg);

       }

       return msg.wParam;

    }

     

    // Hàm xử lý các thông báo của chương trình

    LRESULT CALLBACK WindowFunc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {

     switch(message) {

       case WM_DESTROY:

                PostQuitMessage(0);

            break;

       default:

                return DefWindowProc(hwnd, message, wParam, lParam);

     }

     return 0;

    }

    Chuyên mục: Lập trình