Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 10 của 10
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Dẫn nhập vào lập trình Win32 api

    Dẫn nhập lập trình C trên Windows

    Hôm nay, langman – x quyết định ngồi viết 1 tut nhằm mục đích đưa ra 1 cách tiếp cận với lập trình C trên windows, hy vọng có thể đơn giản hóa vấn đề 1 cách tốt nhất. Chắc là còn nhiều chỗ sai sót lắm, mong được các bạn giúp đỡ sửa lỗi

    I. Một vài kiến thức

    a. Từ khóa
    Thật ra thì đây vẫn là C chỉ khác cái platform thôi.
    + Trước đây chúng ta học ngôn ngữ C với IDE là Borland C ( hoặc Turbo C ) trên nền ntvdm -> 1 sảm phẩm con trong gói sảm phẩm : MS Windows XP

    + Bây giờ chúng ta học C trên platform là windows, chúng ta sẽ tạo ra các chương trình giao tiếp trực tiếp với nhân của hệ điều hành windows chứ ko phải qua thằng ntvdm nữa.

    Các bạn chú ý là platform thay đổi chứ ngôn ngữ vẫn thế ( giống như là bạn nói tiếng anh ở nước anh, tiếng anh ở nước mĩ và tiếng anh ở việt nam vậy )
    Và vì thế, toàn bộ từ khóa vẫn như thế, ko có từ khóa nào mới cả.

    b. Quy ước đặt tên của microsoft
    Sẽ thật là khó nắm bắt, thật là hoa mắt nếu bạn ko hiểu được quy tắc đặt tên của ms. Bạn hãy để ý kĩ, chúng có quy tắc đấy, và nó như sau:

    _ Tất cả các kiểu dữ liệu mở rộng của windows , tên class, tên struct, tên hằng số định sẵn đều được viết in hoa
    Ví dụ :
    tên kiểu dữ liệu : UINT , ATOM , HANDLE, HWND, BYTE,….
    tên cấu trúc : MSG, PAINSTRUCT, WNDCLASS ,.... (đây là C nên chưa có class)
    tên hằng số định sẵn : NULL, IDI_APPLICATION, CS_VREDRAW,…..

    _ Tất cả các method (các hàm, các phương thức) đều được viết hoa (pascal notation).
    Ví dụ :
    LoadIcon(…)
    LoadCursor(…)
    SomeOtherName(…)

    _ Tất cả các tên biến, tên đối tượng đều được viết theo camel notation : ( chữ cái đầu viết thường, còn đoạn sau thì được viết theo chuẩn của pascal)
    Ví dụ:
    hWnd; // cá nhân tôi thì thích đặt là hwnd hơn cho nó gọn gàng
    msg;
    wParam
    hInstance
    someOtherName

    ồ, nếu bạn nắm được quy tắc này, nhìn vào các source sẽ thấy nó đỡ hoa mắt hơn rồi đó, ta đã thấy được nó đơn giản hơn 1 chút rồi !!!
    Nhân tiện , nói về ms, chúng ta , người vn có lẽ nên tự hào vì đại diện cho ms tại đông nam á chính là 1 tiến sĩ hói đầu người việt nam. He he he…….

    c. Handle
    Đây là 1 từ rất hay gặp trong tin học, khuyên chân thành đừng có dùng google để tra nó và cũng ko nên nên tra nó làm gì, từ này ko nên dịch, x sẽ giải thích nó cho bạn ngay giờ đây, ( trình độ tiếng anh của mình hơi lùn, có gì mong được bỏ qua cho)
    + Số hiệu : xuất phát từ ý tưởng như này, trong ngành công an có rất nhiều người, có nhiều người trùng cả tên lẫn họ , nhưng mỗi đồng chí công an đều có 1 số hiệu riêng, đó là ID của mỗi người, và khi cần tra về 1 ai đó, tất nhiên là tra bằng số hiệu này rồi,..
    + File handle : đối với file , chương trình của bạn làm sao để hiểu rằng bạn đang làm việc với file nào ? nằm ở đâu ? chả lẽ mỗi lần bạn mở file để ghi thì tạo 1 biến kiểu xâu kí tự để lưu trữ đường dẫn của file à như thế quá dài dòng, loằng ngoằng.
    Hệ thống có cung cấp cho chúng ta 1 file table, nó tồn tại trong ổ cứng của bạn với cái tên là FAT table. Mỗi file có 1 số hiệu riêng, và cái chúng ta dùng để định danh nên các file chính là số hiệu này.
    Ví dụ dễ hiểu 1 cái table nha : (tất nhiên là trên thực tế nó lôm côm hơn nhiều như này)

    Mã nguồn PHP:
    Số hiệu Tên file Đường dẫn007 a.mp3 D:\\Music\\008 b.avi D:\\Setup009 a.mp3 C:\\  
    + Window handle : trong màn hình chúng ta có rất nhiều cửa sổ với các cái tên khác nhau, vậy OS nắm bắt các cửa sổ này thế nào ? Mỗi cửa số có 1 số hiệu riêng, nó chính là handle của 1 cửa sổ. và OS sẽ thông qua thông số đó để hiểu từng cửa sổ

    Vậy handle là 1 số nguyên, nó dùng để định danh lên 1 object cụ thể. Số này được ánh xạ qua handle table để chỉ ra đối tượng đó. Trong windows 32bit nó là 1 số nguyên 4byte
    Trong các tên do ms định ra, thì từ h được viết tắt của handle
    Ví dụ : HWND, HINSTANCE, hPrevInstance


    d. Một số từ khó hiểu
    + WINAPI , CALLBACK : từ này đặt trước hàm main, ở 1 số tài liệu khác còn có các từ như APIENTRY, PASCAL , APIPRIVATE
    Thật là khủng bố khi mà có quá nhiều từ đáng sự như thế với nhưng bạn hãy bình tĩnh, sau 1 hồi mở các file .h lên tôi tìm được mấy dòng này :
    #define CALLBACK __stdcall
    #define WINAPI __stdcall
    #define APIENTRY WINAPI
    #define APIPRIVATE __stdcall
    #define PASCAL __stdcall
    Chúng đều là 1, thật tuyệt vời , chúng là 1 cả thôi, google tôi thấy chúng là calling convention. Tuyệt. Vậy chúng thuộc vào nhóm compiler to compiler. Những từ này thêm vào trước tên hàm nhằm mục đích chỉ rõ cho compiler hàm này có cách tổ chức phục vụ cho việc gọi đến như thế nào....
    Nói tóm lại, bạn chỉ cần biết :
    _ chúng thuộc loại “compiler to compiler” và chúng đều là 1
    _ Đừng viết lẫn lộn nó để tránh nguy cơ…. bị thầy giáo chém

    + LRESULT : nói 1 cách đơn giản thế này , đây chính là kiểu dữ liệu nguyên 4byte, và 1 cái nhìn đơn giản : nó là 1 số nguyên. Bạn cũng chỉ cần nhớ thế thôi,


    (còn nữa)

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Trích dẫn Gửi bởi langman
    + LRESULT : nói 1 cách đơn giản thế này , đây chính là kiểu dữ liệu 8 byte,
    Tuy bài này chưa hoàn thiện, nhưng anh muốn bổ sung về vấn đề này!

    Langman nói nó là một số long 8 byte thì chỉ đúng với môi trường 64 bit thôi; chứ khi mọi người (đa phần) dùng 32 bit thì LRESULT là kiểu trả về tương ứng với số nguyên 4 byte.....


    Còn vấn đề về Handle thì cũng có nhiều bàn cãi, tuy nhiên anh cũng phân tích thế này (bởi vì ngoài Handle ra còn có một cái là Instance nữa): Mỗi một cửa sổ khi được tạo ra thì nó giống như một công dân bắt đầu nhập cộng đồng; để Nhà nước quản lý được công dân này thì Công dân này phải được cấp quyền công dân thông qua Chứng minh thư; chứng minh thư là một loại thẻ mà không thể có 2 (hoặc nhiều hơn) công dân nào trùng nhau! Windows cũng vậy; nó quản lý các cửa sổ thông qua một địa chỉ (số nguyên) đã được cấp cho cửa sổ, số nguyên này để Windows nhận dạng và điều hành cửa sổ, vậy tất cả các cửa sổ khi tạo ra đều được cấp loại địa chỉ này!
    Cũng phải mở rộng cái nào được gọi là cửa sổ? Cái nào không được gọi là cửa sổ?.... Cửa sổ bao giờ cũng có Handle, còn một "đối tượng" nào đó khi khởi tạo mà không có Handle thì không được gọi là cửa sổ! Vậy Label trong VB6 (hoặc Static trong MFC,...) đều không được gọi là cửa sổ; còn lại đa phần các đối tượng khác đều được coi là cửa sổ (Button, EditBox,....)...
    Thêm một cái nữa là Instance (thể hiện): Mỗi cửa sổ được tạo ra nó lại được cung cấp một "địa chỉ" kiểu Handle để quản lý các thể hiện của mình, ví dụ như khi ta mở một chương trình (app), sau đó lại mở chương trình đó một lần nữa; như vậy cùng một chương trình (app) mà có 2 thể hiện khác nhau! Như vậy các bạn cũng cần phân biệt Handle và Instance!.....

  3. #3
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Em bổ sung thêm vào ý anh peter . Định nghĩa LRESULT trong MSDN thế này .
    typedef LONG_PTR LRESULT

    và LONG_PTR
    #if defined(_WIN64)
    typedef __int64 LONG_PTR;
    #else
    typedef long LONG_PTR;
    #endif

    Mong sẽ nhận được các bài tút khác của langman [IMG]images/smilies/biggrin.png[/IMG] .

  4. #4
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    anh pt ơi, với vs2010 và vs2008 đều là 8byte hết, e chạy os windows7 32bit mà

    hôm trước, e test máy thầy giáo chạy os windows 7 64 bit, thấy int vẫn là 4byte,( trên borland và dev-C ), tuần sau đề nghị thầy giáo test hộ trên VS xem có khác ko

    @HTT90 : mình ôn thi nốt tuần nữa được nghỉ hè sẽ tập trung toàn bộ sức mạnh nhỏ mọn của bản thân vào C việt

  5. #5
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ừ, vậy chắc anh mới chỉ thấy nó là 4 byte; cũng không sao mà, chú tiếp tục đi, chủ đề này hay đó...

  6. #6
    Mấy bác cho một chương trình demo thử!

  7. #7
    Ngày tham gia
    Sep 2015
    Đang ở
    24 Rạch Bùng Binh , P10,Q3 , HCM
    Bài viết
    0
    Trích dẫn Gửi bởi peterdrew
    Ừ, vậy chắc anh mới chỉ thấy nó là 4 byte; cũng không sao mà, chú tiếp tục đi, chủ đề này hay đó...
    a để e đính chính lại

    Trích dẫn Gửi bởi richtran
    Mấy bác cho một chương trình demo thử!
    nốt vụ ôn thi nầy rồi viết tiếp sẽ đưa demo lên

  8. #8
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Handle: em thấy dịch là "thẻ quản" là hay nhất. cho em góp lửa chút nhe.

  9. #9
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    cám ơn anh pt, em đã check. đúng như a nói, nó chỉ là 8b trong môi trường 64bit
    em test máy thầy windows7 64bit và vs2010 cho chính tay e cài, lúc cài chọn 64 bit

  10. #10
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    hix, bài viết này cũng khá lâu rùi, nhưng mình mới học vc++ nên đọc đc bài này rất bổ ích, chủ topic có thể tiếp tục chủ đề được không?

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •