Lập trình C trên Windows

202 1.7K 7
Lập trình C trên Windows

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Lập trình C trên Windows

L P TRÌNH L P TRÌNH C TRÊN WINDOWS ch L P TRÌNH C TRÊN WINDOWS Te NGƠN NG Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Chương T NG QUAN L P TRÌNH C TRÊN WINDOWS 1.1 M ð U ð l p trình Microsoft Windows®, c n n m ñư c ñ c ñi m b n nh t c a h ñi u hành Chương s gi i thi u khái quát ñ c ñi m h ñi u hành Microsoft Windows, v n ñ liên quan ñ n l p trình b ng ngơn ng C, đ ng th i đưa m t chương trình m u làm sư n cho chương trình đư c vi t sau Trong ph n ñ u, tìm hi u sơ lư c l ch s phát tri n c a h u hành Microsoft Windows® nh ng ñ c ñi m n n t ng c a Windows Ph n ti p theo s trình bày nh ng khái ni m yêu c u b n c a vi c l p trình C Windows Ngồi ra, ph n gi i thi u ch công c mà h ñi u hành cung c p cho ngư i l p trình hay ngư i phát tri n ng d ng Windows ch Cu i chương ph n xây d ng m t chương trình đơn gi n nh t Windows Chương trình đư c xem khn m u c a m t chương trình ng d ng n hình, h u h t ño n chương trình ñư c vi t minh h a sách đ u l y chương trình làm khung sư n ñ phát tri n cho phù h p v i t ng yêu c u Thêm vào đó, m t s ki u d li u m i ñư c ñ nh nghĩa Windows nh ng qui c v cách ñ t tên bi n ñư c gi i thi u ph n Te Ph n chi ti t chuyên sâu c a vi c l p trình b ng ngôn ng C môi trư ng Windows s đư c trình bày chương ti p theo 1.2 H ðI U HÀNH MICROSOFT WINDOWS 1.2.1 Gi i thi u Gi a th p niên 80, công ty ph n m m máy tính Microsoft cơng b phiên b n đ u tiên c a dịng h ñi u hành Windows Microsoft Windows® 1.0 ðây h ñi u hành dùng giao di n ñ h a khác v i giao di n ký t (text hay console) c a MS-DOS Tuy nhiên ph i ñ n phiên b n th hai (Windows 2.0 - tháng 11 năm 1987) m i có bư c c i ti n đáng k , s m r ng giao ti p gi a bàn phím thi t b chu t giao di n ñ h a (GUI-Graphic User Interface) trình đơn (menu) h p tho i (dialog) Trong phiên b n Windows ch yêu c u b vi x lý Intel 8086 hay 8088 ch y real-mode ñ truy xu t megabyte b nh Tháng năm 1990, Microsoft công b phiên b n ti p theo Windows 3.0 S thay ñ i l n phiên b n Windows 3.0 h tr protected-mode 16 bit c a b vi x lý 286, 386, 486 c a Intel S thay ñ i cho phép ng d ng Windows truy xu t 16 megabyte b nh Ti p bư c v i s phát tri n phiên b n Windows 3.1 đ i năm 1992, Microsoft đưa cơng ngh Font TrueType, âm nh c (multimedia), liên k t nhúng ñ i tư ng (OLE- Object Linking and Embedding), ñưa h p tho i chung ñã đư c chu n hóa Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trong s phát tri n m nh m c a nh ng th p niên 90, Microsoft cơng b ti p dịng h ñi u hành Windows v i ng d ng cơng ngh m i (1993) H u hành l y tên Windows® NT® (Windows New Technology), phiên b n h ñi u hành ñ u tiên c a Windows h tr 32 bit cho b x lý 386, 486 Pentium Trong h ñi u hành ng d ng ph i truy xu t b nh v i ñ a ch 32-bit t p l nh hay ch th 32-bit Ngồi Windows NT đư c thi t k ñ ch y b vi x lý (CPU) khác ngồi Intel có th ch y máy tr m (workstation) H ñi u hành Windows 95 ñư c công b năm 1995 m t h ñi u hành 32-bit cho Intel 386 tr v sau Tuy thi u tính b o m t Windows NT vi c thích nghi v i máy tr m công ngh RISC, bù l i h ñi u hành yêu c u ph n c ng không cao Song song v i s phát tri n ph n m m cơng ngh ph n c ng phát tri n không ð t n d ng s c m nh c a ph n c ng th h Windows ti p theo ngày hoàn thi n Như Windows 98 phát tri n t Window 95 có nhi u c i thi n hi u làm vi c, h tr thi t b ph n c ng t t hơn, cu i vi c tích h p ch t ch v i Internet Word Wide Web Windows 2000 h ñi u hành ñư c xem n ñ nh t t c a dòng Windows, phiên b n tăng cư ng tính b o m t thích h p m i trư ng m ng giao di n ñ p 1.2.2 ð c ñi m chung c a h ñi u hành Microsoft Windows Te ch Windows m t h ñi u hành s d ng giao ti p ngư i dùng đ h a (GUI), hay cịn g i h ñi u hành tr c quan (Visual interface) GUI s d ng ñ h a d a hình nh nh phân (Bitmapped video display) Do t n d ng ñư c tài nguyên th c c a hình, cung c p m t mơi trư ng giàu tính tr c quan sinh đ ng Windows khơng đơn u MS-DOS (hay m t s h ñi u hành giao di n console) mà hình đư c s d ng ch đ th hi n chu i ký t , ngư i dùng gõ t bàn phím (keyboard) hay đ xu t thông tin d ng văn b n Trong giao di n ngư i dùng đ h a, hình giao ti p v i ngư i s d ng ña d ng hơn, ngư i dùng có th nh p d li u thông qua chu t b ng cách nh n vào nút nh n (button) hơp ch n (combo box)…thi t b bây gi đư c nh p, có th bàn phím thi t b chu t (mouse device) Thi t b chu t m t thi t b ñ nh v hình, s d ng thi t b chu t ngư i dùng có th nh p d li u m t cách tr c quan b ng cách kích ho t m t nút l nh, hay làm vi c v i ñ i tư ng ñ h a liên quan ñ n t a ñ hình ð giao ti p mơi trư ng ñ h a, Windows ñưa m t s thành ph n g i ñi u n chung (common control), ñi u n chung ñ i tư ng ñư c ñưa vào h p tho i ñ giao ti p v i ngư i dùng Bao g m : h p văn b n (text box), nút nh n (button), nút ch n (check box), h p danh sách (list box), h p ch n (combo box)… Th t m t ng d ng Windows không ph i q ph c t p chúng có hình th c chung Chương trình ng d ng thu ng chi m m t ph m vi hình ch nh t hình g i m t c a s Trên c a m i c a s tiêu ñ (title bar) Các ch c c a chương trình đư c li t kê th c ñơn l a ch n c a chương trình (menu) , hay xu t hi n dư i d ng tr c quan công c (toolbar) Các công c ch a ch c ñư c s d ng thư ng xuyên th c ñơn ñ gi m th i gian cho ngư i dùng ph i m th c đơn Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS ch n Thơng thư ng c n l y thông tin hay cung c p thơng tin cho ngư i dùng m t ng d ng s ñưa m t h p tho i, h p tho i s ch a ñi u n chung ñ giao ti p v i ngư i dùng Windows t o m t s h p tho i chu n Open Files, m t s h p tho i tương t Windows m t h ñi u hành ña nhi m, tùy thu c vào b nh mà ta có th ch y nhi u ng d ng m t lúc, có th đ ng th i chuy n qua l i gi a ng d ng th c thi chúng Trong phiên b n c a Windows® 98 NT® tr v sau, chương trình ng d ng t b n thân chúng chia thành nhi u ti u trình (thread) đ x lý v i t c ñ x lý nhanh t o c m giác nh ng chương trình ng d ng ch y ñ ng th i v i Trong Windows, chương trình ng d ng th c thi ñư c chia s nh ng th t c mà Windows cung c p s n, t p tin cung c p nh ng th t c ñư c g i thư vi n liên k t ñ ng (Dynamic Link Libraries - DLL) Windows có ch liên k t nh ng chương trình ng d ng v i th t c ñư c cung c p thư vi n liên k t ñ ng ch Kh tương thích c a Windows r t cao Các chương trình ng d ng đư c vi t cho Windows không truy xu t tr c ti p ph n c ng c a nh ng thi t b ñ ho hình máy in Mà thay vào ñó, h ñi u hành cung c p m t ngơn ng l p trình đ h a (g i Giao ti p thi t b ñ ho - Graphic Device Interface - GDI) cho phép hi n th nh ng ñ i tư ng ñ h a m t cách d dàng Nh v y m t ng d ng vi t cho Windows s ch y v i b t c thi t b hình hay b t kì máy in, mi n cài đ t trình u n thi t b h tr cho Windows Chương trình ng d ng khơng quan tâm đ n ki u thi t b k t n i v i h th ng Te Như gi i thi u ph n khái ni m liên k t ñ ng thành ph n quan tr ng c a Windows, đư c xem h t nhân c a h ñi u hành, b n thân c a Windows t p thư vi n liên k t ñ ng Windows cung c p r t nhi u hàm cho nh ng chương trình ng d ng đ cài đ t giao di n ngư i dùng hi n th văn b n hay ñ h a hình Nh ng hàm đư c cài đ t thư vi n liên k t ñ ng hay cịn g i DLL ðó t p tin có d ng ph n m r ng *.DLL hay *.EXE, h u h t ñư c ch a thư m c \Windows\System, \Windows\system32 c a Windows® 98 thư m c \WinNT\System, \WinNT\System32 c a Windows® NT® Trong phiên b n sau này, h th ng liên k t ñ ng ñư c t o r t nhi u, nhiên, h u h t hàm ñư c g i thư vi n phân thành ñơn v sau: Kernel, User, GDI Kernel cung c p hàm th t c mà m t h t nhân h ñi u hành truy n th ng qu n lý, qu n lý b nh , xu t nh p t p tin tác v Thư vi n ñư c cài ñ t t p tin KRNL386.EXE 16 bit KERNEL32.DLL 32 bit User qu n lý giao di n ngư i dùng, cài ñ t t t c khung c a s m c lu n lý Thư vi n User ñư c cài ñ t t p tin USER.EXE 16 bit USER32.DLL 32 bit GDI cung c p toàn b giao di n thi t b ñ ho (Graphics Device Interface), cho phép chương trình ng d ng hi n th văn b n ñ ho thi t b xu t ph n c ng hình máy in Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trong Windows 98, thư vi n liên k t ñ ng ch a kho ng vài ngàn hàm, m i hàm có tên đ c t , ví d CreateWindow, hàm dùng đ t o m t c a s cho ng d ng Khi s d ng hàm mà Windows cung c p cho ng d ng ph i khai báo t p tin tiêu ñ h hay hpp (header file) Trong m t chương trình Windows, có s khác bi t ta g i m t hàm c a thư vi n C m t hàm c a Windows hay thư vi n liên k t đ ng cung c p ðó biên d ch mã máy, hàm thư vi n C s ñư c liên k t thành mã chương trình Trong hàm Windows s đư c g i chương trình c n dùng đ n ch khơng liên k t vào chương trình ð th c hi n ñư c l i g i m t chương trình Windows *.EXE ln ch a m t tham chi u ñ n thư vi n liên k t đ ng khác mà c n dùng Khi đó, m t chương trình Windows đư c n p vào b nh s t o tr tham chi u ñ n nh ng hàm thư vi n DLL mà chương trình dùng, n u thư vi n chưa ñư c n p vào b nh trư c bây gi s đư c n p 1.3 L P TRÌNH TRÊN MICROSOFT WINDOWS 1.3.1 ð c ñi m chung Windows h ñi u hành đ h a tr c quan, dó tài nguyên c a h th ng cung c p r t đa d ng địi h i ngư i l p trình ph i nghiên c u r t nhi u ñ phát hay h t s c m nh c a h ñi u hành Te ch Theo nh ng m c đích ti p c n c a nhà l p trình ng d ng Windows ph i h t s c thân thi n v i ngư i dùng thơng qua giao di n đ h a s n có c a Windows V lý thuy t m t ngư i dùng làm vi c ñư c v i m t ng d ng c a Windows có th làm vi c đư c v i nh ng ng d ng khác Nhưng th c t ñ s d ng m t ng d ng cho ñ t hi u qu cao Windows c n ph i có m t s hu n luy n tr giúp hay t i thi u ph i cho bi t chương trình ng d ng làm vi c th ða s ng d ng Windows đ u có chung m t giao di n tương tác v i ngư i dùng gi ng Ví d ng d ng Windows đa s đ u có th c đơn ch a m c : File, Edit, Tool, Help… Và h p tho i thư ng ch a ph n t ñi u n chung : Edit Control, Button Control, Checkbox… 1.3.2 S khác bi t v i l p trình MS-DOS Khi m i bư c vào l p trình Windows ña s ngư i h c r t l l m, nh t nh ng ngư i ñã t ng làm vi c v i MS-DOS Do MS-DOS h ñi u hành ñơn nhi m giao ti p qua giao di n console Nên vi t chương trình khơng ph c t p Cịn đ i v i Windows ngư i l p trình s làm vi c v i b công c l p trình đ h a đa d ng v i cách x lý ña nhi m, ña lu ng c a Windows Vì v y vi c l p trình Windows s giúp cho ngư i l p trình ñ nhàm chán v i giao di n console c a MS-DOS Vi c c g ng phát huy s c m nh tài nguyên c a Windows s làm cho nh ng ng d ng m nh m , ña d ng, thân thi n, d s d ng 1.3.3 M t s yêu c u ñ i v i ngư i l p trình Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS ði u trư c tiên c a ngư i h c l p trình C Windows ph i bi t l p trình C, sách khơng có tham v ng hư ng d n ngư i h c có th thơng th o l p trình C Windows mà chưa qua m t l p hu n luy n C Tuy nhiên, không nh t thi t ph i hồn tồn thơng th o C m i h c ñư c l p trình Windows ð có th l p trình n n Windows yêu c u v vi c s d ng cơng c l p trình, ngư i h c cịn c n ph i có b n v Windows, t i thi u dùng qua m t s ng d ng Windows Th t s u c u khơng q khó khăn ñ i v i ngư i h c hi n t i h u Windows quen thu c v i m i ngư i, nh ng ngư i mà s d ng máy tính Ngồi nh ng u c u trên, đơi ngư i l p trình Windows c n có u th m m , cách trình bày hình nh, ñi u n h p tho i t t s làm cho ng d ng ti n l i, rõ ràng, thân thi n v i ngư i dùng 1.3.4 B công c giao di n l p trình ng d ng API ch H ñi u hành Windows cung c p hàng trăm hàm ñ cho nh ng ng d ng có th s d ng truy c p tài nguyên h th ng Nh ng hàm ñư c g i giao di n l p trình ng d ng API (Application Programming Interface) Nh ng hàm ñư c ch a thư vi n liên k t ñ ng DLL c a h th ng Nh có c u trúc đ ng m i ng d ng đ u có th truy c p đ n hàm Khi biên d ch chương trình, đ n đo n mã g i hàm API chương trình d ch khơng thêm mã hàm vào mã th c thi mà ch thêm tên DLL ch a hàm tên c a hàm Do mã hàm API th c t khơng đư c s d ng xây d ng chương trình, ch đư c thêm vào chương trình đư c n p vào b nh đ th c thi Te Trong API có m t s hàm có ch c trì s ñ c l p thi t b ñ h a, hàm g i giao di n thi t b ñ h a GDI (Graphics Device Interface) Do s ñ c l p thi t b nên hàm GDI cho phép ng d ng có th làm vi c t t v i nhi u ki u thi t b ñ h a khác 1.3.5 Cơ ch thơng p Khơng gi ng ng d ng ch y MS-DOS, ng d ng Win32® x lý theo s ki n (event - driven), theo ch ng d ng ñư c vi t s liên t c ch cho h ñi u hành truy n d li u nh p vào H th ng s ñ m nhi m vi c truy n t t c d li u nh p c a ng d ng vào c a s khác c a ng d ng M i m t c a s s có riêng m t hàm g i hàm x lý c a s thư ng ñư c ñ t tên WndProc, h th ng s g i hàm có b t c d li u nh p ñư c truy n ñ n c a s , hàm s x lý d li u nh p tr quy n ñi u n v cho h th ng H th ng truy n d li u nh p vào th t c x lý c a c a s thơng qua m t hình th c g i thơng p (message) Thơng p ñư c phát sinh t ng d ng h th ng H th ng s phát sinh m t thơng p có m t s ki n nh p vào (input even), ví d ngư i dùng nh n m t phím, di chuy n thi t b chu t, hay kích vào ñi u n (control) cu n,… Ngoài h th ng phát sinh thơng p ñ ph n ng l i m t s thay ñ i c a h th ng m t ng d ng mang ñ n, ñi u x y ng d ng làm c n ki t tài nguyên hay ng d ng t thay ñ i kích thư c c a c a s Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS M t ng d ng có th phát sinh thơng p c n yêu c u c a s c a th c hi n m t nhi m v hay dùng đ thơng tin gi a c a s H th ng g i thơng p vào th t c x lý c a s v i b n tham s : ñ nh danh c a c a s , ñ nh danh c a thơng p, hai tham s cịn l i ñư c g i tham s c a thơng p (message parameters) ð nh danh c a c a s xác ñ nh c a s mà thơng p đư c ch đ nh H th ng s dùng ñ nh danh ñ xác ñ nh c n ph i g i thơng p ñ n th t c x lý c a c a s ð nh danh thơng p m t h ng s th hi n m c đích c a thơng p Khi th t c x lý c a s nh n thơng p s dùng đ nh danh đ bi t hình th c c n th c hi n Ví d , m t thơng p đư c truy n ñ n th t c c a s có đ nh danh WM_PAINT có ý nghĩa r ng c a s vùng làm vi c thay ñ i c n ph i v l i vùng Tham s thơng p lưu giá tr hay v trí c a d li u, đư c dùng b i th t c c a s x lý thơng p Tham s ph thu c vào lo i thơng p đư c truy n đ n, có th s ngun, m t t p bit dùng làm c hi u, hay m t tr ñ n m t c u trúc d li u đó,… Khi m t thơng p khơng c n dùng đ n tham s h th ng s thi t l p tham s có giá tr NULL M t th t c c a s ph i ki m tra xem v i lo i thơng p c n dùng tham s ñ quy t ñ nh cách s d ng tham s Có hai lo i thơng p : ch Thơng p đư c đ nh nghĩa b i h th ng (system-defined messages) : Te D ng thơng p đư c h th ng đ nh nghĩa cho c a s , ñi u n, tài nguyên khác h th ng Thư ng ñư c b t ñ u v i ti n t sau : WM_xxx, LB_xxx, CB_xxx,… Thơng p đư c đ nh nghĩa b i ng d ng (application-defined message) : M t ng d ng có th t o riêng thơng p ñ s d ng b i nh ng c a s c a hay truy n thơng tin gi a c a s ng d ng N u m t ng d ng ñ nh nghĩa thơng p riêng th t c c a s nh n đư c thơng p ph i cung c p hàm x lý tương ng ð i v i thơng p h th ng, đư c cung c p giá tr đ nh danh t 0x0000 ñ n 0x03FF, nh ng ng d ng khơng đư c đ nh nghĩa thơng p có giá tr kho ng Thơng p đư c ng d ng đ nh nghĩa có giá tr ñ nh danh t 0x0400 ñ n 0x7FFF L trình c a thơng p t lúc g i đ n lúc x lý có hai d ng sau: Thơng p đư c g i vào hàng đ i thơng p đ ch x lý (queue message): bao g m ki u thơng p đư c phát sinh t bàn phím, chu t thơng p : WM_MOUSEMOVE, WM_LBUTTONDOWN, WM_KEYDOWN, WM_CHAR Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Thơng p đư c g i tr c ti p ñ n th t c x lý khơng qua hàng đ i (nonqueue message), bao g m thơng p th i gian, thơng p v , thơng p WM_TIMER, WM_PAINT, WM_QUIT X lý thơng p : M t ng d ng ph i xóa x lý nh ng thơng p đư c g i t i hàng đ i c a ng d ng ð i v i m t ng d ng ñơn ti u trình s d ng m t vịng l p thơng p (message loop) hàm WinMain ñ nh n thông ñi p t hàng ñ i g i t i th t c x lý c a s tương ng V i nh ng ng d ng nhi u ti u trình m i m t ti u trình có t o c a s s có m t vịng l p thơng ñi p ñ x lý thông ñi p c a nh ng c a s ti u trình 1.4 CÁCH VI T M T NG D NG TRÊN MICROSOFT WINDOWS 1.4.1 Các thành ph n b n t o nên m t ng d ng 1.4.1.1 C a s Trong m t ng d ng ñ h a 32-bit, c a s (window) m t vùng hình ch nh t hình, nơi mà ng d ng có th hi n th thơng tin nh n thông tin vào t ngư i s d ng Do v y, nhi m v ñ u tiên c a m t ng d ng ñ h a 32-bit t o m t c a s ch M t c a s s chia s hình v i c a s khác m t ng d ng hay ng d ng khác Ch m t c a s m t th i ñi m nh n ñư c thông tin nh p t ngư i dùng Ngư i s d ng có th dùng bàn phím, thi t b chu t hay thi t b nh p li u khác ñ tương tác v i c a s ng d ng Te T t c c a s ñ u ñư c t o t m t c u trúc ñư c cung c p s n g i l p c a s (window class) C u trúc m t t p mơ t thu c tính mà h th ng dùng khn m u đ t o nên c a s M i m t c a s ph i thành viên c a m t l p c a s T t c l p c a s ñ u ñư c x lý riêng bi t 1.4.1.2 H p tho i ñi u n H p tho i (Dialog) dùng ñ tương tác v i ngư i dùng m t chương trình ng d ng M t h p tho i thư ng ch a nhi u đ u n nh p văn b n (edit text), nút b m (button), ghi (static control), h p danh sách (list box)… Nút b m (button): g m có Push Button dùng kích ho t m t thao tác, Check Box dùng ñ ch n m t hai tr ng thái (TRUE hay FALSE), Radio Button gi ng Check Box m t nhóm Radio Button ph i ñư c ch n lo i tr Chú thích (static): dùng đ ch a ghi h p tho i, ngồi n i dung có th thay đ i q trình s d ng h p tho i H p li t kê (list box): Ch n m t hay nhi u d li u ñư c li t kê danh sách, n u h p ch a nhi u dòng h p không hi n th h t m u thơng tin ph i kèm theo m t cu n (scroll bar) Ô nh p văn b n (edit text): Dùng nh p văn b n, n u có nhi u dịng thư ng kèm theo cu n Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Thanh cu n (scroll bar): vi c dùng kèm v i list box hay edit box cu n cịn có th s d ng ñ c l p nh m t o thư c ño… Th c ñơn (menu): m t danh sách ch a thao tác v i m t ñ nh danh mà ngư i dùng có th ch n H u h t ng d ng có c a s khơng th thi u th c đơn Thanh cơng c (toolbar): m t d ng menu ch ch a thao tác c n thi t dư i d ng bi u tư ng đ c trưng Ngồi cịn r t nhi u u n mà cơng c l p trình cung c p cho ngư i l p trình hay t h t o d a nh ng thành ph n ñư c cung c p s n 1.4.1.3 ng d ng n hình Windows 1.4.1.4 Các ki u t p tin ñ xây d ng m t ng d ng Windows Chương trình ngu n Tương t chương trình C chu n, bao g m t p tin tiêu ñ (header) ch a t p tin *.h, *.hpp Còn mã ngu n (source code) ch a t p tin *.c hay *.cpp T p tin ñ nh nghĩa ch T p tin có ph n m r ng *.def, dùng ñ nh nghĩa ñi u n chương trình t o vi t ng d ng t o DLL, ngồi cịn dùng ñ khai báo vùng nh heap ch y chương trình Lúc trư c v n đ tương thích v i Windows 3.1 nên t p tin thư ng đư c dùng, cịn ngày chúng đư c dùng ñ n Te Các file ch a tài nguyên c a ng d ng • Các file *.ico bi u tư ng (icon) ñư c dùng chương trình Thơng thư ng cơng c l p trình Windows đ u có tool đ t o nh • Con tr chu t c a ng d ng có th đư c v l i dư i d ng bi u tư ng lưu ñĩa v i d ng file *.cur • Các file d ng nh bitmap dùng đ minh h a ñư c lưu d ng file *.bmp • T p tin tài nguyên *.rc ph n khai báo tài nguyên th c ñơn, h p tho i, ñ nh danh ch ñ n t p tin d ng *.ico, *.cur, *.bmp, 1.4.1.5 Các ki u d li u m i Các ki u d li u Windows thư ng ñư c ñ nh nghĩa nh toán t typedef t p tin windows.h hay t p tin khác Thơng thư ng t p tin đ nh nghĩa Microsoft vi t ho c công ty vi t trình biên d ch C t o ra, nh t thi t ph i tương thích v i h ñi u hành Windows 98, hay NT d a ki n trúc 32-bit M t vài ki u d li u m i có tên vi t t t r t d hi u UINT m t d li u thư ng ñư c dùng mà ñơn gi n ki u unsigned int, Windows 9x ki u có kích thư c 32-bit ð i v i ki u chu i có ki u PSTR ki u m t tr ñ n m t chu i tương t char* Trang NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Tuy nhiên, có m t s ki u ñư c khái báo tên thi u rõ ràng WPARAM LPARAM Tên đư c đ t có ngu n ng c l ch s sâu xa Khi cịn h u hành Windows 16-bit tham s th c a hàm WndProc ñư c khai báo ki u WORD, v i kích thư c 16-bit , cịn tham s th có ki u LONG 32-bit ðây lý ngư i ta thêm ti n t "W", "L" vào t "PARAM" Tuy nhiên, phiên b n Windows 32-bit, WPARAM đư c đ nh nghĩa UINT LPARAM đư c đ nh nghĩa m t ki u LONG, c hai tham s đ u có giá tr 32-bit ði u m t s nh m l n WORD v n giá tr 16-bit Window 98 Trong th t c x lý c a s WndProc giá tr tr v ki u LRESULT Ki u ñơn gi n ñư c ñ nh nghĩa ki u LONG Ngồi ra, có m t ki u thư ng xuyên dùng ki u HANDLE m t s nguyên 32-bit ñư c s d ng m t ki u ñ nh danh Có nhi u ki u đ nh danh nh t thi t t t c ph i có kích thư c v i HANDLE B ng sau mơ t m t s ki u d li u m i: Ý nghĩa HANDLE S nguyên 32-bit, ñ nh danh HWND S nguyên 32-bit, ñ nh danh BYTE Giá tr 8-bit không d u WORD S nguyên 16-bit không d u ch Te DWORD Ki u S nguyên 32-bit không d u UINT S nguyên không d u 32-bit LONG long 32-bit BOOL Bool LPSTR Con tr chu i LPCSTR H ng tr chu i WPARAM 32-bit LPARAM 32-bit BSTR Giá tr 32-bit tr ñ n kí t LPVOID Con tr 32-bit đ n m t ki u khơng xác đ nh LPTSTR Gi ng LPSTR có th chuy n sang d ng Unicode DBCS Trang 10 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS { fprintf(stderr,"Cannot get 2nd lock at %lp, error = %lu\n", commit, GetLastError()); } else fprintf(stderr,"2nd Lock Achieved at %lp\n",commit); } Chương trình cho k t qu tương t k t qu sau : Committed 512 bytes at address 003F0000 Cannot lock at 003F0000, error = 0x80000001 2nd Lock Achieved at 003F0000 LÝ T P TIN ch 7.3 X Chú ý : L n khoá th nh t th t b i, t o l i ngo i l STATUS_GUARD_PAGE Tuy nhiên, l n khoá th hai, hàm th c hi n thành cơng, h th ng lo i b tình tr ng "lính canh" c a trang Te T p tin m t ñơn v lưu tr b n đ máy tính phân bi t kh i thơng tin khác nhau, đư c lưu tr thi t b lưu tr ph ñĩa, băng t , ñư c t ch c theo nhóm g i thư m c ð x lý t p tin, ta có th dùng hàm C chu n fopen, fclose, fread, fwrite, fseek, … môi trư ng Windows Các hàm ñư c h tr thư vi n stdio.h Chúng ta s khơng bàn v hàm Trong ph n này, s tìm hi u hàm thao tác t p tin c a Win32® cho phép ng d ng t o, m , c p nh t xoá t p tin, tìm hi u thơng s h th ng v t p tin 7.3.1 T o m t p tin Win32® API cung c p hàm CreateFile ñ t o m t t p tin m i ho c m m t t p tin ñã có s n HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); Trang 188 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trư ng lpFileName tr ñ n chu i ký t zero xác ñ nh tên t p tin c n m ho c t o Trư ng dwDesiredAccess xác ñ nh cách th c truy c p ñ i tư ng M t ng d ng có th th c hi n truy c p ñ c, ghi, ñ c-ghi, s d ng m t hay k t h p giá tr sau : Giá tr Ý nghĩa Xác ñ nh truy v n thi t b ñ n m t ñ i tư ng M t ng d ng có th truy v n thu c tính thi t b mà không c n ph i truy c p thi t b GENERIC_READ Xác l p hình th c truy c p đ c D li u có th đ c t t p tin, đ ng th i d ch chuy n tr t p tin ð truy c p ñ c-ghi, ta k t h p v i c GENERIC_WRITE GENERIC_WRITE Xác l p hình th c truy c p ghi D li u có th đư c ghi vào t p tin, ñ ng th i d ch chuy n tr ð có th truy c p đ c-ghi, ta k t h p v i c GENERIC_READ ch B ng 7.4 Trư ng dwDesiredAccess xác ñ nh cách truy c p ñ i tư ng Te Trư ng dwShareMode thi t l p bit c xác ñ nh cách chia s ñ i tư ng (t p tin) N u dwShareMode b ng 0, ñ i tư ng không th chia s Khi đó, ta khơng th thao tác đ i tư ng cho đ n đóng handle ð chia s ñ i tư ng, ta k t h p m t c sau : FILE_SHARE_DELETE S d ng Windows NT : Thao tác ñ i tư ng ch th c hi n n u yêu c u truy c p xố FILE_SHARE_READ Thao tác đ i tư ng ch th c hi n n u yêu c u truy c p ñ c FILE_SHARE_WRITE Thao tác ñ i tư ng ch th c hi n n u yêu c u truy c p ghi B ng 7.5 Trư ng dwShareMode xác ñ nh cách chia s ñ i tư ng Trư ng lpSecurityAttributes tr ñ n c u trúc SECURITY_ATTRIBUTES xác ñ nh handle ñ i tư ng có ñư c chuy n cho ti n trình hay khơng không dùng, thi t l p giá tr NULL Trư ng dwCreationDisposition xác l p thao tác t o t p tin m i hay m t p tin có Dùng m t giá tr sau : Trang 189 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS CREATE_NEW T o m i m t t p tin Hàm th t b i n u t p tin có CREATE_ALWAYS T o m i m t t p tin N u t p tin ñã t n t i, hàm s t o ch ng lên, đ ng th i xố thu c tính hi n hành c a t p tin OPEN_EXISTING M m t t p tin Hàm th t b i n u t p tin chưa có s n OPEN_ALWAYS M m t t p tin n u có s n N u t p tin chưa t n t i, hàm s t o t p tin s d ng c CREATE_NEW TRUNCATE_EXISTING M m t t p tin Khi m , h th ng kh i t o kích thư c t p tin l i v byte Ti n trình g i c n m t p tin nh t v i d ng truy c p GENERIC_WRITE Hàm th t b i n u không t n t i t p tin B ng 7.6 Trư ng dwCreationDisposition xác l p thao tác t p tin Te FILE_ATTRIBUTE_ARCHIVE ch Trư ng dwFlagsAndAttributes xác ñ nh thu c tính c cho t p tin Ta có th k t h p thu c tính sau : T p tin archive ng d ng dùng thu c tính đ đánh d u t p tin có th lưu ho c lo i b FILE_ATTRIBUTE_HIDDEN T p tin n Không hi n th danh sách t p tin thông thư ng thư m c FILE_ATTRIBUTE_NORMAL T p tin thu c tính khác Thu c tính thư ng ñư c dùng nh t FILE_ATTRIBUTE_OFFLINE D li u t p tin khơng có s n D li u ñư c ch ñ nh di chuy n v t lý vào vùng lưu tr offline FILE_ATTRIBUTE_READONLY T p tin ch đ c ng d ng khơng th ghi ho c xoá d li u t p tin FILE_ATTRIBUTE_SYSTEM T p tin m t ph n c a h ñi u hành, ho c ñư c s d ng ñ c bi t h th ng FILE_ATTRIBUTE_TEMPORARY T p tin ñư c dùng cho vùng lưu tr t m Sau ng d ng k t thúc, t p tin s đư c xóa B ng 7.7 Trư ng dwFlagsAndAttributes xác ñ nh thu c tính c cho t p tin Trang 190 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Các c xác ñ nh t p tin ph c t p, khơng bàn k Trư ng cu i hTemplateFile xác ñ nh handle truy c p GENERAL_READ ñ n t p tin t m T p tin t m có vai trị h tr thu c tính t p tin thu c tính m r ng cho t p tin ñư c t o Trong Windows 95, giá tr hTemplateFile c n ñư c gán b ng NULL N u thành công hàm tr v handle c a t p tin xác ñ nh Ngư c l i, giá tr tr v INVALID_HANDLE_VALUE Lưu ý, vi c thi t l p giá tr dwDesiredAccess cho phép ng d ng có th truy v n thu c tính thi t b mà không th c s truy c p thi t b ði u r t h u d ng, ví d trư ng h p ng d ng mu n xác đ nh kích thư c ñ nh d ng ñĩa m m mà khơng c n ph i có đĩa đĩa Khi t o m t t p tin, hàm CreateFile th c hi n ch c sau: • K t h p c thu c tính t p tin đư c xác đ nh b i c dwFlagsAndAttributes v i giá tr FILE_ATTRIBUTE_ARCHIVE • Thi t l p kích thư c t p tin b ng • Chép thu c tính m r ng c a t p tin t m vào t p tin m i n u bi n hTemplateFile xác ñ nh Khi m m t t p tin có s n, hàm CreateFile th c hi n ch c sau : Te ch • K t h p c xác ñ nh b i dwFlagsAndAttributes v i thu c tính c a t p tin hi n có Hàm CreateFile s b qua thu c tính c a t p tin xác đ nh b i c dwFlagsAndAttributes • Thi t l p kích thư c t p tin d a vào giá tr c a dwCreationDisposition • B qua giá tr c a bi n hTemplateFile N u hàm t o m t t p tin ñĩa m m khơng có đĩa m m, ho c CD-ROM khơng có đĩa CD, h th ng s đưa m t h p tho i thơng p (message box) yêu c u ngư i dùng ñưa ñĩa m m ho c đĩa CD vào ð h th ng khơng th c hi n thao tác trên, c n thi t l p giá tr uMode hàm SetErrorMode SEM_FAILCRITICALERRORS UINT SetErrorMode(UINT uMode); Trong ví d sau, hàm CreateFile m m t t p tin có đ đ c : HANDLE hFile; hFile = CreateFile("MYFILE.TXT", // m t p tin MYFILE.TXT GENERIC_READ, // m ñ ñ c FILE_SHARE_READ, // chia s đ đ c NULL, // khơng b o m t Trang 191 L P TRÌNH L P TRÌNH C TRÊN WINDOWS OPEN_EXISTING, // ch m t p tin có FILE_ATTRIBUTE_NORMAL, //T p tin thư ng NULL); // khơng có th c tính t m if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open file."); // l i x lý } ð xoá t p tin trên, trư c h t ta đóng t p tin l i CloseHandle(hFile); DeleteFile("MYFILE.TXT"); ch đ ghi Trong ví d sau, hàm t o m t t p tin m i m HANDLE hFile; GENERIC_WRITE, // t o ñ ghi 0, // không chia s NULL, // không b o m t ch hFile = CreateFile("MYFILE.TXT", // t p tin MYFILE.TXT Te NGÔN NG CREATE_ALWAYS, // ghi ch ng n u có FILE_ATTRIBUTE_NORMAL | // t p tin bình thư ng FILE_FLAG_OVERLAPPED, // khơng đ ng b I/O NULL); // khơng thu c tính t m if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open file."); // l i x lý } 7.3.2 T o t p tin t m Trang 192 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Các ng d ng có th nh n m t t p tin nh t cho t p tin t m b ng cách s d ng hàm GetTempFileName ð xác ñ nh ñư ng d n ñ n thư m c ch a t p tin t m ñư c t o, ta dùng hàm GetTempPath Hàm GetTempFileName t o tên m t t p tin t m Tên t p tin ñ y ñ g m ñư ng d n n i v i m t chu i ký t s th p l c phân th hi n tên t p tin, ph n m r ng TMP UINT GetTempFileName(LPCTSTR lpPathName, LPCTSTR lpPrefixString, UINT uUnique, LPTSTR lpTempFileName); Trư ng lpPathName tr ñ n m t chu i ký t (k t thúc b ng ký t NULL) xác ñ nh ñư ng d n c a t p tin, dùng ký t ANSI N u trư ng b ng NULL, hàm th t b i Trư ng lpPrefixString tr ñ n m t chu i ký t (k t thúc b ng ký t NULL) Hàm s d ng ký t ñ u tiên c a chu i ph n ti n t c a t p tin Các ký t s d ng ph i ky t ANSI Trư ng uUnique xác ñ nh m t s nguyên không d u (mà) hàm chuy n thành chu i ký t th p l c phân s d ng vi c t o t p tin t m Trư ng lpTempFileName tr ñ n vùng nh ñ m ch a tên t p tin t m Trư ng m t chu i ký t k t thúc NULL ký t ANSI ð dài vùng nh ñ m ñư c xác ñ nh b i giá tr MAX_PATH c a thư m c tương ng Te path\preuuuu.TMP ch T p tin t o đư c s có d ng sau : Trong path đư ng d n, xác ñ nh b i giá tr lpPathName; pre ký t ñ u c a chu i lpPrefixString; uuuu giá tr th p l c phân c a uUnique Khi thoát kh i h ñi u hành (t t máy ch ng h n), t p tin t m t o b ng hàm s t đ ng b xố ð tránh l i chuy n chu i ANSI, ng d ng c n g i hàm CreateFile trư c ñ t o t p tin t m N u giá tr uUnique b ng 0, hàm GetTempFileName xác l p m t s nh t d a th i ñi m hi n t i c a h th ng N u t p tin ñã có, h th ng t tăng lên m t s m i cho đ n có m t tên nh t N u th c hi n thành công, hàm tr v s nh t xác ñ nh trư ng uUnique Ngư c l i, giá tr tr v ð thu nh n ñư ng d n t p tin t m, ta dùng hàm GetTempPath DWORD GetTempPath(DWORD nBufferLength, LPTSTR lpBuffer); Trang 193 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Trư ng nBufferlength xác đ nh kích thư c vùng ñ m chu i ký t xác ñ nh b i lpBuffer Trư ng lpBuffer tr ñ n vùng ñ m nh n chu i ký t xác ñ nh ñư ng d n t p tin t m Chu i ký t k t th c b ng ký t ‘\’, ví d : C:\TEMP\ N u thành cơng, hàm tr v đ l n xác đ nh kích thư c chu i zero N u giá tr tr v l n nBufferLength, giá tr tr v s kích thư c vùng đ m c n ñ ch a ñư ng d n Ngư c l i, giá tr tr v n u hàm th t b i 7.3.3 Sao chép di chuy n t p tin ð chép (copy) m t t p tin, ta c n m chép vào m t t p tin m i ch ñ ch ñ c Sau dùng hàm CopyFile đ BOOL CopyFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName, BOOL bFailIfExists); Trư ng lpExistingFileName lpNewFileName tr ñ n chu i (k t thúc NULL) xác ñ nh tên t p tin ñã có tên t p tin m i Trư ng bFialIfExists xác ñ nh cách t o t p tin v i tên m i N u trư ng ñư c thi t l p TRUE, t p tin có tên lpNewFileName ñã t n t i, hàm th t b i N u trư ng ñư c thi t l p FALSE t p tin ñã t n t i, hàm s t o t p tin m i ch ng lên t p tin cũ ch N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v Te ð di chuy n (move) m t t p tin, trư c h t c n ph i đóng t p tin l i (n u m ) Ta dùng hàm MoveFile Hàm th c hi n thao tác ñ i tên m t t p tin hay thư m c (bao g m c t p tin thư m c) BOOL MoveFile(LPCTSTR lpExistingFileName, LPCTSTR lpNewFileName); Hai trư ng l n lư t tr ñ n tên t p tin (thư m c) hi n có tên t p tin (thư m c) m i Tên t p tin (thư m c) m i c n ph i chưa có đư ng d n c a Tên t p tin m i có th m t h th ng hay ñĩa khác, tên thư m c m i ph i ñĩa v i thư m c cũ N u thành công, giá tr tr v khác Ngư c l i, giá tr tr v Ví d sau minh h a vi c t o s d ng t p tin t m ñ copy m t t p tin ð u tiên ng d ng m t p tin ORIGINAL.TXT b ng cách s d ng hàm CreateFile Sau ng d ng s d ng hàm GetTempFileName CreateFile ñ t o t p tin t m ng d ng ñ c t ng kh i 4K d li u vào vùng ñ m, chuy n n i dung vùng ñ m sang ch hoa, vi t chúng xu ng t p tin t m Sau chuy n toàn b t p tin sang t p tin t m, ta ñ i t p tin t m thành ALLCAPS.TXT b ng cách dùng hàm MoveFile HANDLE hFile; HANDLE hTempFile; DWORD dwBytesRead, dwBytesWritten, dwPos; Trang 194 L P TRÌNH L P TRÌNH C TRÊN WINDOWS char szTempName[MAX_PATH]; char buffer[4096]; /* M t p tin có s n */ hFile = CreateFile("ORIGINAL.TXT", // tên t p tin GENERIC_READ, // m đ đ c 0, // khơng chia s NULL, // không b o m t OPEN_EXISTING, // t p tin có s n FILE_ATTRIBUTE_NORMAL, // t p tin thông thư ng NULL); // không thu c tính t m if (hFile == INVALID_HANDLE_VALUE) { ch ErrorHandler("Could not open file."); // x lý l i } /* T o t p tin t m */ Te NGÔN NG GetTempFileName("\\TEMP", // thư m c ch a t p tin t m "NEW", // ph n ñ u t p tin t m 0, // t o tên nh t szTempName); // vùng ñ m tên hTempFile = CreateFile((LPTSTR) szTempName, // tên t p tin GENERIC_READ | GENERIC_WRITE, // m d ng ñ c-ghi 0, // không chia s NULL, // không b o m t CREATE_ALWAYS, // t o ch ng n u t p tin có FILE_ATTRIBUTE_NORMAL, // t p tin thơng thư ng NULL); // khơng thu c tính t m Trang 195 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS if (hTempFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not create temporary file."); } /* ð c kh i 4K vào vùng ñ m Chuy n t t c ký t vùng ñ m sang d ng ch hoa Vi t vùng ñ m vào t p tin t m */ { if (ReadFile(hFile, buffer, 4096, &dwBytesRead, NULL)) { CharUpperBuff(buffer, dwBytesRead); WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL); } CloseHandle(hFile); Te /* ðóng c hai t p tin */ ch } while (dwBytesRead == 4096); CloseHandle(hTempFile); /* Chuy n t p tin t m vào t p tin m i ALLCAPS.TXT */ if (!MoveFile(szTempName, "ALLCAPS.TXT")) { ErrorHandler("Could not move temp file."); } Hàm CloseHandle đóng m t t p tin ñang m Xem ph n 7.3.6 7.3.4 ð c ghi d li u vào t p tin M i t p tin ñang m có m t tr t p tin xác đ nh byte k ti p s ñư c ñ c ho c ghi Khi m t t p tin m l n ñ u tiên, h th ng thi t l p tr t p tin t i v trí đ u t p tin M i đ c ho c ghi vào m t byte, tr t p tin t ñ ng d ch chuy n ð thay đ i v trí này, ta dùng hàm SetFilePointer Trang 196 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); Trư ng hFile handle c a t p tin ch a tr t p tin c n di chuy n Handle c n ñư c t o dư i d ng truy c p GENERIC_READ ho c GENERIC_WRITE Trư ng lDistanceToMove lpDistanceToMoveHigh xác ñ nh s byte tr c n d ch chuy n N u lpDistanceToMoveHigh b ng NULL, 32-bit th p c a lDistanceToMove xác ñ nh s byte c n di d i tr Ngư c l i, hai trư ng thi t l p m t giá tr 64-bit (không d u) th hi n s byte c n di d i tr Trư ng dwMoveMethod xác ñ nh ñi m g c mà tr c n di d i N u trư ng b ng FILE_BEGIN, ñi m g c ñi m ñ u tiên (byte th 0) c a t p tin N u FILE_CURRENT, ñi m g c v trí hi n t i c a tr Và FILE_END xác ñ nh ñi m g c v trí cu i hi n t i c a t p tin N u thành công, lpDistanceToMoveHigh b ng NULL, giá tr tr v DWORD th p c a tr t p tin N u lpDistanceToMoveHigh khác NULL, hàm tr v DWORD th p c a tr t p tin, tr trư ng ñ n DWORD cao c a tr t p tin ch N u hàm th t b i lpDistanceToMoveHigh b ng NULL, giá tr tr v 0xFFFFFFFF ð bi t thêm thông tin l i, ta dùng hàm GetLastError N u hàm tr v 0xFFFFFFFF lpDistanceToMoveHigh, có th hàm thành công ho c th t b i, c n ph i g i hàm GetLastError ñ xác ñ nh ðo n chương trình sau trình bày v n đ : Te /* Trư ng h p 1: G i hàm v i lpDistanceToMoveHigh == NULL */ /* C g ng di chuy n tr t p tin c a hFile m t ño n */ dwPtr = SetFilePointer(hFile, lDistance, NULL, FILE_BEGIN); if (dwPtr == 0xFFFFFFFF) // Ki m tra th t b i { dwError = GetLastError() ; // Nh n mã l i // X lý l i } // Cu i ph n x lý l i /* Trư ng h p 2: G i hàm v i lpDistanceToMoveHigh != NULL */ /* C g ng di chuy n tr t p tin hFile m t ño n dài */ dwPtrLow = SetFilePointer(hFile, lDistLow, & lDistHigh, FILE_BEGIN); /* Ki m tra th t b i */ Trang 197 NGÔN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS if (dwPtrLow==0xFFFFFFFF&&(dwError=GetLastError())!=NO_ERROR) { // X lý l i // } // Cu i ph n x lý l i ð di chuy n ti n, ta thi t l p ñ d ch chuy n m t giá tr dương Ngư c l i, thi t l p giá tr âm ñ di chuy n lùi tr t p tin N u giá tr tr t p tin sau d ch chuy n âm, hàm th t b i, mã l i mà hàm GetlastError tr v ERROR_NEGATIVE_SEEK N u mu n di chuy n tr ñ n cu i t p tin ñ ghi ti p, ta có th dùng hàm SetEndOfFile BOOL SetEndOfFile(HANDLE hFile); Trư ng hFile handle c a t p tin c n di chuy n tr ñ n cu i t p tin c n ñư c t o v i d ng truy c p GENERAL_WRITE N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v ch Hàm ReadFile ñ c d li u t m t t p tin, t ñi m xác ñ nh b i tr t p tin Sau ñ c, tr t p tin d ch chuy n m t ño n ng v i s byte th t s ñ c ñư c Tương t , ñ ghi vào t p tin ta dùng hàm WriteFile Te BOOL ReadFile(HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped); BOOL WriteFile(HANDLE hFile, LPCVOID lpBuffer, DWORD nNumberOfBytesToWrite, LPDWORD lpNumberOfBytesWritten, LPOVERLAPPED lpOverlapped); Handle t p tin hFile c n ñư c t o v i d ng truy c p GENERAL_READ ho c GENERAL_WRITE Trư ng lpBuffer tr ñ n vùng nh ñ m nh n d li u ñ c t t p tin, hay ch a d li u c n ghi Trư ng nNumberOfBytesToRead xác ñ nh s byte c n ñ c Trư ng lpNumberOfBytesRead tr ñ n byte ñ c ñư c Hàm ReadFile thi t l p giá tr b ng trư c th c hi n thao tác khác ñ ki m tra l i Trư ng nNumberOfBytesToWrite xác ñ nh s byte c n ghi N u trư ng b ng 0, hàm không ghi d li u, v n ñư c g i th c hi n Trư ng lpNumberOfBytesWritten xác ñ nh s byte ghi ñư c, trư ng ñư c hàm WriteFile thi t l p v trư c th c hi n thao tác khác ñ ki m tra l i Trang 198 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS Cu i cùng, trư ng lpOverlapped tr ñ n c u trúc OVERLAPPED N u t p tin ñư c m v i c FILE_FLAG_OVERLAPPED, giá tr ph i khác NULL ð ñơn gi n ta thi t l p giá tr b ng NULL, hàm s ñ c (ghi) t p tin t v trí tr hi n t i hàm ch tr k t qu v sau ñ c (ghi) xong Hàm ReadFile s d ng v i m t s lý sau : thao tác ghi hoàn t t cu i ñư ng ng ghi, ñã ñ c h t s byte yêu c u, ho c x y l i ñ c N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v b ng 7.3.5 Khoá m khoá t p tin M c dù h th ng cho phép nhi u ng d ng có th m ghi vào m t t p tin, ng d ng không nên th c hi n song song ð ngăn ch n ng d ng khác ghi vào ph n d li u c a mình, ta có th s d ng hàm LockFile ð m khoá t p tin, cho phép ng d ng khác truy c p vùng d li u, ta dùng hàm UnlockFile BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh); ch BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh); Te Trư ng hFile handle c a t p tin ñư c m dư i d ng GENERAL_READ ho c GENERAL_WRITE, ho c c hai Trư ng dwFileOffsetLow dwFileOffsetHigh xác ñ nh word th p cao c a byte offset đ u tiên c n khố hay m khoá Trư ng nNumberofBytesToLockLow (nNumberofBytesTo UnlockLow) nNumberOfBytesToLockHigh (nNumberOf BytesToUnlockHigh) xác ñ nh word th p cao ñ dài kho ng byte c n khoá hay m khóa N u thành cơng, hàm tr v giá tr khác Ngư c l i, giá tr tr v Ví d sau n i m t t p tin vào m t t p tin khác ng d ng s d ng hàm CreateFile m t p tin ONE.TXT ñ ñ c, TWO.TXT ñ vi t Sau ng d ng n i ph n d li u c a t p tin ONE.TXT vào cu i t p tin TWO.TXT b ng cách ñ c (dùng hàm ReadFile) ghi (dùng hàm WriteFile) t ng kh i 4K d li u Trư c vi t vào t p tin th hai, ng d ng d ch chuy n tr ñ n cu i t p tin b ng cách dùng hàm SetFilePointer, sau khóa vùng c n ghi dùng hàm LockFile Sau th c hi n thao tác ghi xong, ta m khố, dùng hàm UnlockFile, đ ng d ng khác có th s d ng t p tin HANDLE hFile; HANDLE hAppend; Trang 199 L P TRÌNH L P TRÌNH C TRÊN WINDOWS DWORD dwBytesRead, dwBytesWritten, dwPos; char buff[4096]; /* M m t t p tin ñã có */ hFile = CreateFile("ONE.TXT", // m t p tin ONE.TXT GENERIC_READ, // m đ đ c 0, // khơng chia s NULL, // không b o m t OPEN_EXISTING, // ch m t p tin ñã t n t i FILE_ATTRIBUTE_NORMAL, // t p tin bình thư ng NULL); // khơng có thu c tính t m if (hFile == INVALID_HANDLE_VALUE) { ch ErrorHandler("Could not open ONE."); // x lý l i } /* M t p tin có N u chưa có, t o t p tin m i */ Te NGÔN NG hAppend = CreateFile("TWO.TXT", // m t p tin TWO.TXT GENERIC_WRITE, // m đ ghi 0, // khơng chia s NULL, // không b o m t OPEN_ALWAYS, // m t p tin cũ ho c t o m i FILE_ATTRIBUTE_NORMAL, // t p tin bình thư ng NULL); // khơng có thu c tính t m if (hAppend == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open TWO."); // x lý l i } Trang 200 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS /* N i t p tin th nh t vào cu i t p tin th hai Khố t p tin th hai đ ngăn ch n ti n trình khác truy c p ghi M khoá sau ghi xong */ { if (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) { dwPos= SetFilePointer(hAppend, 0, NULL, FILE_END); LockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); WriteFile(hAppend, buff, dwBytesRead, &dwBytesWritten, NULL); UnlockFile(hAppend, dwPos, 0, dwPos+dwBytesRead, 0); } } while (dwBytesRead == 4096); /* ðóng c hai t p tin */ Te CloseHandle(hAppend); ch CloseHandle(hFile); 7.3.6 ðóng xoá t p tin ð s d ng hi u qu tài nguyên h th ng, ng d ng c n đóng t p tin khơng c n dùng n a b ng cách g i hàm CloseHandle N u ng d ng b ng t t p tin v n ñang m , h th ng s t đ ng đóng t p tin BOOL CloseHandle(HANDLE hObject); N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v ð bi t thông tin l i m r ng, ta dùng hàm GetLastError ð xoá m t t p tin, ta dùng hàm DeleteFile Lưu ý r ng t p tin c n ph i đóng trư c b xóa BOOL DeleteFile(LPCTSTR lpFileName); Trư ng lpFileName tr ñ n chu i (k t thúc b ng ký t NULL) xác ñ nh t p tin c n xố N u thành cơng, hàm tr v tr khác Ngư c l i, giá tr tr v Hàm th t b i n u t p n u Trang 201 NGƠN NG L P TRÌNH L P TRÌNH C TRÊN WINDOWS t p tin c n xố khơng t n t i Trong Windows NT, hàm khơng th xố t p tin ñang m Tuy nhiên, Windows 95, t p tin m v n có th b xoá 7.3.7 X lý thư m c Khi ng d ng t o m t t p tin m i, h ñi u hành s thêm t p tin vào m t thư m c xác ñ nh ð t o xoá m t thư m c, ta dùng hàm CreateDirectory RemoveDirectory BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); BOOL RemoveDirectory(LPCTSTR lpPathName); Trư ng lpPathName tr ñ n chu i (k t thúc b ng ký t NULL) xác ñ nh ñư ng d n thư m c c n t o (hay c n xố) Kích thư c chu i m c ñ nh gi i h n cho ñư ng d n MAX_PATH ký t Trong trư ng h p xoá thư m c, ñư ng d n c n xác ñ nh thư m c thư m c r ng Trư ng lpSecurityAttributes tr ñ n c u trúc SECURITY_ATTRIBUTES ch a trư ng lpSecurityDescriptor xác đ nh mơ t m t c a thư m c m i ð ñơn gi n, ta gán giá tr lpSecurityAttributes b ng NULL, thư m c m i nh n giá tr mơ t m t m c đ nh N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v Te ch Thư m c cu i c a ñư ng d n ñang s d ng g i thư m c hi n hành ð xác ñ nh thư m c hi n hành, ng d ng g i hàm GetCurrentDirectory ð thay ñ i thư m c hi n hành, ng d ng g i hàm SetCurrentDirectory DWORD GetCurrentDirectory(DWORD nBufferLength, LPTSTR lpBuffer); Trư ng nBufferLength xác đ nh kích thư c vùng đ m c a chu i ký t th hi n thư m c hi n hành Vùng ñ m ph i dài ñ ñ ch a c ký t NULL cu i chu i Trư ng lpBuffer s ch a chu i ký t N u thành công, hàm tr v giá tr xác ñ nh s ký t đư c ghi vào vùng đ m, khơng ch a ký t NULL Ngư c l i, giá tr tr v N u vùng ñ m lpBuffer khơng đ l n, giá tr tr v xác đ nh kích thư c c n thi t c a vùng ñ m, g m c byte NULL ñáng d u k t thúc chu i BOOL SetCurrentDirectory(LPCTSTR lpPathName); Trư ng lpPathName tr ñ n chu i ký t (k t thúc b ng NULL) xác ñ nh ñư ng d n m i N u thành công, hàm tr v giá tr khác Ngư c l i, giá tr tr v Trang 202 ... bar) C? ?c ch c c a chương trình đư c li t kê th c ñơn l a ch n c a chương trình (menu) , hay xu t hi n dư i d ng tr c quan c? ?ng c (toolbar) C? ?c công c ch a ch c ñư c s d ng thư ng xuyên th c ñơn... crColor[iColor-IDC_BLACK]); if(iBrush == IDC_HS_CROSS) hbrush=CreateHatchBrush(HS_CROSS, crColor[iColor - IDC_BLACK]); if(iBrush == IDC_HS_DIAGCROSS) hbrush=CreateHatchBrush(HS_DIAGCROSS, crColor[iColor... WM_COMMAND: switch (LOWORD (wParam)) { case IDC_BLACK: case IDC_RED: case IDC_GREEN: case IDC_YELLOW: case IDC_BLUE: case IDC_MAGENTA: case IDC_CYAN: iColor = LOWORD (wParam) ; ch case IDC_WHITE: Te

Ngày đăng: 16/08/2012, 15:29

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan