NGÔN NGỮ LẬP TRÌNH WINDOWS

204 24 0
NGÔN NGỮ LẬP TRÌNH 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 NGƠN NGỮ LẬP TRÌNH WINDOWS LẬP TRÌNH c TRÊN WINDOWS Trang NGƠN NGỮ LẬP TRÌNH WINDOWS LẬP TRÌNH c TRÊN Chương TỔNG QUAN LẬP TRÌNH c TRÊN WINDOWS 1.1 M Ở ĐẨU Đ ể lập trình Microsoft Windows®, chứng ta cần nắm đặc điểm hệ điều hành Chương 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 ưình ngơn ngữ c, thời đưa chương trình mẫu làm sườn cho chương trình viết sau Trong phán đầu, tìm hiểu sơ lược lịch sử phát triển hệ điều hành Microsoft Windows® đặc điểm tảng Windows Phần trình bày khái niệm yêu cầu 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 ữiển ứng dụng Windows Cuối chương phần xây dựng chương trình đơn giản Windows Chương trình xem khn mẫu chương ữình ứng dụng điển hình, hầu hết đoạn chương trình viết minh họa sách lấy chương ưình làm khung sườn để phát triển cho phù hợp với yêu cầu Thêm vào đó, sơ kiểu liệu định nghĩa Windows qui ước vể cách đặt tên biến giới thiệu phần Phần chi tiết chuyên sâu việc lập trình ngôn ngữ c môi trường Windows trình bày chương 1.2 HỆ ĐIỂU HÀNH MICROSOFT WINDOWS 1.2.1 Giới th iệ 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 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) MS-DOS Tuy nhiên phải đến phiên thứ hai (Windows 2.0 - tháng 11 năm 1987) có bước cải tiến đáng kể, mở rộng giao tiếp bàn phím thiết bị chuột giao diện đổ họa (GVl-Graphỉc User Interface) trình đơn (menu) hộp thoại (dialog) Trong phiên Windows yêu cầu vi xử lý Intel 8086 hay 8088 chạy real-mode để truy xuất megabyte nhớ Tháng năm 1990, Microsoft công bô phiên Windows 3.0 s ự thay đổi lớn phiên Windows 3.0 hỗ trợ protected-mode 16 bit vi xử lý 286, 386, 486 Intel, s ự thay đổi cho phép ứhg dụng Windows truy xuất 16 megabyte nhớ Tiếp bước với phát triển phiê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 chuẩn hóa Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Trong phát ưiển mạnh mẽ 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ệ (1993) Hệ điều hành lấy tên Windows® NT® (Windows New Technology), phiên hệ điều hành đẳu tiên Windows hỗ trỢ 32 bit cho xử lý 386, 486 Pentium Trong hệ điều hành ứng dụng phải truy xuất nhớ với địa 32-bit tập lệnh hay thị 32-bit Ngoài Windows NT thiết kê để chạy vi xử lý (CPU) khác Intel chạy máy trạm (workstation) Hệ điều hành Windows 95 công bô năm 1995 hệ điều hành 32-bit cho Intel 386 trở 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útig không cao Song song với 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 phán cứng thê hệ Windows 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 eifrig 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 xem ổn định tốt dòng Windows, phiê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 h ệ đ iể u hành Microsoft Windows Windows hệ điểu hành sử dụng giao tiếp người dừng đồ họa (GUI), hay 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 tài ngun thực hình, cung cấp mơi trường giàu tính trực quan sinh động Windows không đơn điệu MS-DOS (hay sô hệ điều hành giao diện console) mà hình sử dụng để thể 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 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 nhập liệu thông qua chuột cách nhấn vào nút nhấn (button) hôp chọn (combo box) thiết bị nhập, bàn phím thiết bị chuột (mouse device) Thiết bị chuột thiết bị định vị hình, sử dụng thiết bị chuột người dùng nhập liệu cách trực quan cách kích hoạt nút lệnh, hay làm việc với đối tượng đổ họa liên quan đến tọa độ txên hình Đ ể giao tiếp môi trường đồ họa, Windows đưa sô thành phẩn gọi điều khiển chung (common control), điều khiể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 (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 ứng dụng Windows phức tạp chúng có hình thức chung Chương trình ứng dụng thuờng chiếm phạm vi hình chữ nhật hình gọi cửa sổ Trên cửa sổ tiêu đề (title bar) Các chức chương Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS trình liệt kê thực đơn lựa chọn chương trình (menu), hay xuất dạng trực quan công cụ (toolbar) Các công cụ chứa chức sử dụng thường xuyên ữong thực đơn để giảm thời gian cho người dùng phải mở thực đơn chọn Thông thường cần lấy thông tin hay cung cấp thơng tín cho người dùng thi ứng dụng đưa hộp thoại, hộp thoại chứa điều khiển chung để giao tiếp với người dùng Windows tạo số hộp thoại chuẩn Open Files, sô hộp thoại tương tự Windows hệ điều hành đa nhiệm, tùy thuộc vào nhớ mà ta chạy nhiều ứng dụng lúc, thời chuyển qua lại ứng dụng thực thi chúng Trong phiên Windows® 98 NT® trở sau, chương trình ứng dụng tự 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 chương trình Lftig dụng chạy đồng thời với Trong Windows, chương trình ứng dụng thực thi chia sẻ nhũhg thủ tục mà Windows cung cấp sẵn, tập tín cung cấp nhŨTag thủ tục Ưên gọi thư viện liên kết động (Dynamic Link Libraries - DLL) Windows có chê liên kết chương trình ứng dụng với thủ tực cung cấp thư viện liên kết động Khả tương thích Windows cao Các chương trình ứng dụng viết cho Windows không truy xuất trực tiếp phần cứng nhũhg thiết bị đồ hoạ hình máy in Mà thay vào đó, hệ điều hành cung cấp 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ị đối tượng đổ họa cách dễ dàng Nhờ ứng dụng viết cho Windows chạy với thiết bị hình hay máy in, miễn cài đặt trình điều khiể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 Như giói thiệu phần khái niệm liên kết động thành phần qnan trọng rủa Windows, xem hạt nhân hệ điều hành, vĩ thân Windows tập thư viện liên kết động Windows cung cấp nhiều hàm cho chương trình ứng dụng để cài đặt giao diện người dùng hiển thị văn hay đổ họa hình Nhũhg hàm cài đặt thư viện liên kết động hay gọi DLL Đó tập tin có dạng phần mở rộng *.DLL hay *.EXE, hầu hết chứa thư mục \Windows\System, \Windows\system32 Windows® 98 thư mục \WinNT\System, \WinNT\System32 Windows® NT® Trong phiên sau này, hệ thống liên kết động tạo nhiều, nhiên, hầu hết hàm 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à hạt nhân hệ điều hành truyền thống quản lý, quản lý nhớ, xuất nhập tập tin tác vụ Thư viện 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 khung cửa sổ mức luận lý Thư viện User cài đặt tập ưn USER.EXE 16 bit USER32.DLL 32 bit Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS GDI cung cấp toàn 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 đổ hoạ thiết bị xuất phẩn cúng hình máy in Trong Windows 98, thư viện liên kết động chứa khoảng vài ngàn hàm, hàm có tên đặc tả, ví dụ CreateWindow, hàm dùng để tạo 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 tín tiêu đề h hay hpp (header file) Trong chương trình Windows, có khác biệt ta gọi hàm thư viện c hàm 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 liên kết thành mã chương trình Trong hàm Windows gọi chương trình cần dùng đến khơng liên kết vào chương ưình Đ ể thực lời gọi chương ưình Windows *.EXE ln chứa tham chiếu đến thư viện liên kết động khác mà cần dùng Khi đó, chương trình Windows nạp vào nhớ tạo trỏ tham chiếu đến hàm thư viện DLL mà chương ưình dùng, thư viện chưa nạp vào nhớ trướ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 hệ thống cung cấp đa dạng đòi hỏi người lập ứình phải nghiên cứa nhiều để phát hay mạnh hệ điều hành Theo mục đích tiếp cận nhà lập trình ứng dụng Windows phải thân thiện với người dùng thông qua giao diện đồ họa sẵn có Windows, v ể lý thuyết người dùng làm việc với ứhg dụng Windows làm việc với ứng dụng khác Nhuhg thực tê đ ể sử dụng úhg dụng cho đạt hiệu cao Windows cần phải có 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 có chung giao diện tương tác với người dùng giống Ví dụ ứng dụng Windows đa sơ có thực đơn chứa mục n h : File, Edit, Tool, Help Và hộp thoại thường chứa phần tử điều khiển chung như: Edit Control, Button Control, Checkbox 1.3.2 S ự khác b iệ t với lập trình MS-DOS Khi bước vào lập trình Windows đa số người học lạ lẫm, người 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 Windows người lập trình làm việc với cơng cụ lập trình đổ họa đa dạng với cách xử lý đa nhiệm, đa luồng Windows Vì việc lập trình Windows giúp cho người lập trình đỡ nhàm chán với giao diện console MS-DOS Việc Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS cô gắng phát huy sức mạnh tài nguyên Windows làm cho ứ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 n gư i lậ p trình Điều trước tiên 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 thơng thạo lập trình c Windows mà chưa qua lớp huấn luyện c Tuy nhiên, không thiết phải hồn tồn thơng thạo c học lập trình Windows Đ ể lập trình ưên Windows ngồi u cầu việc sử dụng cơng cụ lập trình, người học cần phải có Windows, tối thiểu dùng qua sơ ứng dụng Windows Thật yêu cầu không q khó khăn người học Windows quen thuộc với người, người mà sử dụng máy tính Ngồi u cầu ưên, đơi người lập trình ưên Windows cẩn có khiếu thẩm mỹ, cách trình bày hình ảnh, điều khiển hộp thoại tốt 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 d iện lậ p trình ứng dụng API Hệ điều hành Windows cung cấp hàng ưăm hàm đ ể cho ứng dụng sử dụng truy cập tài nguyên hệ thống Những hàm gọi giao diện lập trình ứng dựng API (Application Programming Interface) Những hàm chứa thư viện liên kết động DLL hệ thống Nhờ có cấu trúc động ứng dụng 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à thêm tên DLL chứa hàm tên hàm Do mã hàm API thực tê không sử dụng xây dựng chương trình, thêm vào chương trình nạp vào nhớ để thực thi Trong API có sơ hàm có chức ữì độ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 độc lập thiết bị nên hàm GDI cho phép ứng dụng làm việc tốt với nhiều kiểu thiết bị đổ họa khác 1.3.5 C c h ế thông điệp Không giống ứng dụng chạy MS-DOS, ứng dụng Win32® xử lý theo kiện (event - driven), theo chê ứng dụng viết liên tục chờ cho hệ điều hành truyền liệu nhập vào Hệ thống đảm nhiệm việc truyền tất liệu nhập ứng dụng vào cửa sổ khác ứng dụng Mỗi cửa sổ có riêng hàm gọi hàm xử lý cửa sổ thường đặt tên WndProc, hệ thống gọi hàm có liệu nhập truyền đến cửa sổ, hàm xử lý liệu nhập trả quyền điều khiển cho hệ thống Hệ thống truyền liệu nhập vào thủ tục xử lý cửa sổ thông qua hinh thức gọi thông điệp (message) Thông điệp phát sinh từ ứng dụng hệ thống Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Hệ thống phát sinh thơng điệp có kiện nhập vào (input even), ví dụ người dùng nhấn phím, di chuyển thiết bị chuột, hay kích vào điều khiển (control) cuộn, Ngoài hệ thống phát sinh thông điệp đ ể phản Ú1ng lại thay đổi hệ thống ứ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 sổ Một ứng dụng phát sinh thông điệp cần yêu cầu cửa sổ thực nhiệm vụ hay dùng để thông tin cửa sổ Hệ thống gởi thông điệp vào thủ tục xử lý cửa sổ với bôn tham số: định danh cửa sổ, định danh thơng điệp, hai tham sơ lại gọi tham số thông điệp (message parameters) Định danh cửa sổ xác định cửa sổ mà thông điệp định Hệ thống dùng định danh để xác định cắn phải gởi thông điệp đến thủ tục xử lý cửa số Định danh thơng điệp sơ thể mục đích thông điệp Khi thủ tục xử lý cửa sổ nhận thơng điệp dùng định danh đ ể biết hình thức cắn thực Ví dụ, thông điệp truyền đến thủ tục cửa sổ có định danh WM_PAINT có ý nghĩa cửa sổ vùng làm việc thay đổi cần phải vẽ lại vùng Tham sô thông điệp lưu giá ữị hay vị ữí liệu, dùng thủ tục cửa sổ xử lý thông điệp Tham sô phụ thuộc vào loại thông điệp truyền đến, sơ ngun, tập bit dùng làm cờ hiệu, hay ữỏ đến cấu trúc liệu đó, Khi thơng điệp khơng cần dùng đến tham sơ hệ thống 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 điệp cần dùng tham sô để định rách sử dụng rác tham số Có hai loại thơng điệp : Thơng điệp định nghĩa hệ thống (system-defined messages): Dạng thông điệp hệ thống định nghĩa cho cửa sổ, điều khiển, tài nguyên khác Ưong hệ thống Thường bắt đẩu với tiền tô sau : WM_XXX, LB xxx, CB xxx, Thông điệp định nghĩa ứng dụng (application-defined message) : Một ứng dụng tạo riêng thơng điệp để sử dụng nhũhg cửa sổ hay truyền thơng tin cửa sổ ứng dụng Nêu ứng dụng định nghĩa thơng điệp riêng thủ tục cửa sổ nhận thông điệp phải cung cấp hàm xử lý tương ứng Đối với thông điệp hệ thống, cung cấp giá trị định danh từ 0x0000 đến 0x03FF, ứng dụng không định nghĩa thơng điệp có giá ữị khoảng Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Thơng điệp ứng dụng định nghĩa có giá trị định danh từ 0x0400 đến 0x7FFF LỘ trình thông điệp từ lúc gởi đến lúc xử lý có hai dạng sau: Thơng điệp gởi vào hàng đợi thông điệp đ ể chờ xử lý (queue message): bao gồm kiểu thông điệp phát sinh từ bàn phím, chuột thơng điệp : WM_MOUSEMOVE, WM_LBUTTONDOWN, WMJKEYDOWN, WM CHAR Thông điệp 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 điệp thời gian, thông điệp vẽ, thơng điệp WM_TIMER, WMJPAINT, va WMLQUIT x lý thơng điệp : Một ứng dụng phải xóa xử lý thông điệp gởi tới hàng đợi ứng dụng Đối với ứng dụng đơn tiểu tìn h sử dụng vòng lặp thông điệp (message Innp) 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 ứng dụng nhiều tiểu trình tiểu trình có tạo cửa sổ có vòng lặp thông điệp để xử lý thông điệp 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 p h ầ n b ả n tạ o nên m ộ t ứng dụng 1.4.1.1 c a sổ Trong Lftig dụng đổ họa 32-bit, cửa sổ (window) vùng hình chữ nhật ữên hình, nơi mà Lftig dụng 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ụ ứng dụng đồ họa 32-bit tạo cửa sổ Một cửa sổ chia sẻ hình với cửa sổ khác Lftig dụng hay ứng dụng khác Chỉ cửa sổ thời điểm nhận thơng tin nhập từ người dùng Người sử dụng 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 Tất cửa sổ tạo từ cấu trúc cung cấp sẵn gọi lớp cửa sổ (window class), c ấ u trúc tập mơ tả thuộc tính mà hệ thống dùng khuôn mẫu để tạo nên cửa sổ Mỗi cửa sổ phải thành viên lớp cửa sổ Tất lớp cửa sổ xử lý riêng biệt 1.4.1.2 Hộp thoại điểu khiển Hộp thoại (Dialog) dùng để tương tác với người dùng chương trình ứng dụng Một hộp thoại thường chứa nhiều khiển ô nhập văn (edit text), nút bấm (button), ghi (static control), hộp danh sách Ợist box) Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS > Nút bấm (button): gồm có Push Button dùng kích hoạt thao tác, Check Box dùng để chọn ưong hai trạng thái (TRUE hay FALSE), Radio Button giống Check Box nhóm Radio Button phải chọn loại trừ > Chú thích (static): dìmg để chứa ghi hộp thoại, ngồi nội dung thay đổi q trinh sử dụng hộp thoại > H ộp liệ t kê (list box): Chọn hay nhiều liệu liệt kê danh sách, 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 cuộn (scroll bar) > Ô nhập văn b ả n (edit text): Dùng nhập văn bản, có nhiều dòng thường kèm theo cuộn > Thanh cuộn (scroll bar): việc dùng kèm với list box hay edit box cuộn sử dụng độc lập nhằm tạo thước đo > Thực đơn (menu): danh sách chứa thao tác với định danh mà người dùng 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): dạng menu chứa thao tác cần thiết dạng biểu tượng đặc trưng Ngồi nhiều điều khiển mà cơng cụ lập ữình cung cấp cho người lập trình hay tự họ tạo dựa ữên thành phẩn cung cấp sẵn 1.4.1.3 ứng dụng điển hĩnh Windows 1.4.1.4 Các kiểu tập tín đ ể 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 tín *.h, *.hpp Còn mã nguồn (source code) chứa tập tin *.c hay *.cpp Tập tin định nghĩa Tập tín có phần mở rộng *.def, dùng định nghĩa điều khiển chương trình tạo viết ứng dụng tạo DLL, 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 dùng, ngày chúng dùng đến Các file chứa tài nguyên ứng dụng • Các file *.ico biểu tượng (icon) dùng chương trình Thơng thường cơng cụ lập ưình ưên Windows có tool đ ể tạo ảnh • Con trỏ chuột ứng dụng v ẽ lại dạng biểu tượng lưu ữên đĩa với dạng file *.cur • Các file dạng ảnh bitmap dùng đ ể minh họa lưu dạng file *.bmp • Tập tín tài nguyên *.rc phần khai báo tài nguyên thực đơn, hộp thoại, định danh đến tập tín dạng *.ico, *.cur, *.bmp, 1.4.1.5 Các kiểu liệu mói Trang NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Các kiểu liệu Windows thường đị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 cơng ty viết trình biên dịch c tạo ra, thiết phải tương thích với hệ điều hành Windows 98, hay NT dựa ữên kiến trúc 32-bit Một vài kiểu liệu có tên viết tắt dễ hiểu UINT liệu thường dùng mà đơn giản kiểu unsigned int, Windows 9x kiểu có kích thước 32bit Đối với kiểu chuỗi có kiểu PSTR kiểu trỏ đến chuỗi tương tự char* Tuy nhiên, có sơ kiểu khái báo tên thiếu rõ ràng WPARAM LPARAM Tên đặt có nguồn ngốc lịch sử sâu xa Khi hệ điểu hành Windows 16-bit tham sơ thứ hàm WndProc khai báo kiểu WORD, với kích thước 16b it, 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, ữong phiên Windows 32-bit, WPARAM định nghĩa nhự UINT LPARAM định nghĩa kiểu LONG, hai tham sơ có giá ữị 32-bit Điều nhắm lẫn WORD giá trị 16-bit Window 98 Trong thủ tục xử lý cửa sổ WndProc giá trị trả kiểu LRESULT Kiểu đơn giản định nghĩa kiểu LONG Ngồi ra, có kiểu thường xuyên dùng kiểu HANDLE sô nguyên 32-bit sử dụng kiểu định danh Có nhiều kiểu định danh nhuhg thiết tất phải có kích thước với HANDLE Bảng sau mơ tả sô kiểu liệu mới: Kiểu Ý 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Ơ ngun 16-bit khơng dấu DWORD SƠ ngun 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 Trang 10 NGƠN NGỮ LẬP TRÌNH WINDOWS 2nd Lock Achieved at 003FOOOO LẬP TRÌNH c TRÊN Chú ý : Lẩn khoá thứ 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 thành công, hệ thống loại bỏ tình ữạng "lính canh" ữang 7.3 XỬ LÝ TẬP TIN Tập tin đơn vị lưu trữ để 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 ữ phụ đĩa, băng từ, tổ chức theo nhóm gọi thư mục Đ ể xử lý tập tin, ta dùng hàm c chuẩn fopen, fclose, fread, fwrite, fseek, môi trường Windows Các hàm hỗ trỢ ứong thư viện stdio.h Chúng ta không bàn hàm Trong phẩn này, tìm hiểu hàm thao tác tập tin 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 tập tin 7.3.1 T ạo m tậ p tin Win32® API cung cấp hàm CreateFile đ ể tạo tập tin mở tập tin có sẵn HANDLE CreateFile(LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES IpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlags And Attributes, IIANDLE hTemplateFile); Trường lpFileName trỏ đến chuỗi ký tự zero xác định tên tập tín cần mở tạo Trường dwDesiredAccess xác định cách thức truy cập đối tượng Một ứng dụng thực truy cập đọc, ghi, đpc-ghi, sử dụng hay kết hợp giá trị sau : Giá trị Ý nghĩa Xác định truy vấn thiết bị đến đối tượng Một útig dụng truy vấn thuộc tính thiết bị mà khơng cần phải truy cập thiết bị GENERICJREAD Xác lập hình thức truy cập đọc Dữ liệu đọc từ tập tin, thời dịch chuyển trỏ tập tin Để truy cập đọc-ghi, ta kết hợp với cờ GENERIclwRITE Trang 190 LẬP TRÌNH c TRÊN NGƠN NGỮ LẬP TRÌNH WINDOWS GENERIC_WRITE Xác lập hình thức truy cập ghi Dữ liệu dược ghi vào tập tin, thời dịch chuyển trỏ Để truy cập đọc-ghi, ta kết hợp với cờ GENERIC_READ Bảng 7.4 Trường dwDeskedAccess xác định cách truy cập đối tượng 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 0, đối tượng chia sẻ Khi đó, ta khơng thể thao tác đối tượng đóng handle Đ ể chia sẻ đối tượng, ta kết hợp cờ sau : FILE_SHARE_DELETE s dụng Windows NT : Thao tác đối tượng thực yêu cầu truy cập xoá FILE_SHARE_READ Thao tác đối tượng thực yêu cầu truy cập đọc FILE_SHARE_WRITE Thao tác đối tượng thực 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ó 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 hay mở tập tin có Dùng ữong giá trị sau : CREATE_NEW Tạo tập tin Hàm thất bại tập tin có CREATE_ALWAYs Tạo tập tin Nêu tập tin tổn tại, hàm tạo chồng lên, đồng thời xố thuộc tính hành tập tin OPENJEXISTING MỞ lập tin Hàm thất bại lập Lin chưa có sẵn OPEN_ALWAYS MỞ tập tin có sẵn Nêu tập tin chưa tổn tại, hàm tạo tập tin sử dụng cờ CREATE_NEW Trang 191 LẬP TRÌNH c TRÊN NGƠN NGỮ LẬP TRÌNH WINDOWS TRUNCATEJEXISTING MỞ m ột tập tin Khi mở, hệ thống khởi tạo kích thước tập tin lại byte Tiên ữình gọi cán mở tập tin nhật với dạng truy cập GENERIC_WR1TE Hàm thất bại không tổn tập tin Bảng 7.6 Trường dwCreationDisposition xác lập thao tác tập tin Trường dwF lagsAnd Attributes xác định thuộc tính cờ cho tập tin Ta kết hợp thuộc tính sau : FILE_ATTRIBUTE_ARCHIVE Tập tin archive, ứ n g dụng dùng thuộc tính đ ể đánh dấu tập tin có th ể lưu loại bỏ FILE_ATTRIBUTE_HIDDEN Tập tin ẩn Không hiển thị ữong danh sách tập tin thông thường ưong thư mục FILE_ATTRIBUTE_NORMAL Tập tin khơng có thuộc tinh khác Thuộc tính thường dùng FILE_ATTRIBUTE_OFFLINE D ữ liệu tập tin khơng có sẵn D ữ liệu định di chuyển v ậ t lý vào vùng lull trữ offline FILE_ATTRIBUTE_READONLY Tập tin đọc ứ n g dụng không th ể ghi xoá d ữ liệu tập tin FILE_ATTRIBUTE_SYSTEM Tập tin phần h ệ điều hành, sử dụng đặc biệt h ệ thống FILE_ATTRIBUTE_TEMPORARY Tập tin dùng cho vùng lưu ữ tạm Sau ứng dụng kết thúc, tập tin xóa Bảng 7.7 Trường dwFlagsAndAttributes xác định thuộc tính cờ cho tập tín 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 ữò hỗ trỢ thuộc tính tập tin thuộc tính mở rộng cho tập tin tạo Trong Windows 95, giá trị hTemplateFile cần đ ợ c gán NULL Nêu thành công hàm ữá 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 truy vấn thuộc tính thiết bị mà khơng thực truy cập thiết bị Điều 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 Trang 192 NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Khi tạo tập tin, hàm CreateFile thực chức sau: • Kết hợp cờ thuộc tính tập tin xác định cờ dwFlagsAnd Attributes với giá trị FILE_ATTRIBUTE_ARCHIVE • Thiết lập kích thước tập tin • Chép thuộc tính mở rộng tập tin tạm vào tập tin biến hTemplateFile xác định Khi mở tập tin có sẵn, hàm CreateFile thực chức sau : • Kết hợp cờ xác định dwFlagsAndAttributes với thuộc tính tập tin có Hàm CreateFile bỏ qua thuộc tính tập tin xác định cờ dwFlagsAndAttributes • Thiết lập kích thước tập tin dựa vào giá trị dwCreationDisposition • Bỏ qua giá trị biến hTemplateFile Nêu hàm tạo tập tin ổ đĩa mềm khơng có đĩa mềm, CD-ROM khơng có đĩa CD, hệ thống đưa hộp thoại thông điệp (message box) yêu cầu người dùng đưa đĩa mểm đĩa CD vào Đ ể hệ thống không thực 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ở 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 OPENJEXISTING, // mở tập tin có FILE_ATTRIBUTE_NORMAL, //Tập tin thường NULL); // khơng có tính tạm if (hTile == INVALID_IIANDLE_VALUE) { ErrorHandler("Could not open file."); //lỗ i x ¡ý } Trang 193 NGÔN NGỮ LẬP TRÌNH WINDOWS Đ ể xố tập tin ữên, trước hết ta đóng tập tin lại LẬP TRÌNH c TRÊN CloseHandle(hFile); DeleteFile("MYFILE.TXT”); Trong ví dụ sau, hàm tạo tập tín m ở chê độ ghi HANDLE hFile; hFile = CreateFile("MYFILE.TXT", //tậ p tín MYFILE.TXT GENERIC_WRITE, // tạo đ ể ghi 0, // không chia sẻ NULL, // khơng bảo mật CREATE_ALWAYS, //ghi chồng có FILE_ATTRIBUTE_NORMAL I//tậ p tin bình thường FILE_FLAG_OVERLAPPED, //khơng đòng I/o NULL); // khơng thuộc tính tạm if (hFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open file."); //ỉỗ i x lý > 7.3.2 T ạo tậ p tin tạ m Các ứng dụng có th ể nhận tập tin cho tập tin tạm 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 tạo, ta dùng hàm GetTempPath Hàm GetTempFileName tạo tên tập tin tạm Tên tập tin đầy đủ gồm đường dẫn nối với chuỗi ký tự sô thập lực phân thể tên tập tin, phần mở rộng TMP UINT GetTempFileName(LPCTSTR lpPathName, LPCTSTR IpPrefixString, UINT uUnique, LPTSTR IpTempFileName); Trường IpPathName trỏ đến chuỗi ký tự (kết thúc ký tự NULL) xác định đường dẫn tập tin, dừng ký tự ANSI Neu trường NULL, hàm thất bại Trang 194 NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Trường IpPrefixString trỏ đến chuỗi ký tự (kết thúc ký tự NULL) Hàm sử dụng ký tự chuỗi phần tiền tô tập tín Các ký tự sử dụng phải ky tự ANSI Trường uUnique xác định 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 IpTempFileName trỏ đến vùng nhớ đệm chứa tên tập tin tạm Trường chuỗi ký tự kết thúc NULL ký tự ANSI ĐỘ dài vùng nhớ đệm xác định giá trị MAX_PATH thư mục tương ứng Tập tin tạo có dạng sau : path\preuuuu.TMP Trong path đường dẫn, xác định giá ữị lpPathName; pre ký tự đầu chuỗi lpPrefixString; uuuu giá trị thập lục phân uUnique Khi thoát khỏi hệ điều hành (tắt máy chẳng hạn), tập tín tạm tạo hàm tự động bị xoá Đ ể 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 0, hàm GetTempFileName xác lập sô dựa thời điểm h ệ thống N tập tin có, h ệ thống tự tăng lên m ột sô có tên Nêu thực thành công, hàm trả sô xác định ttong trường uUnique NgưỢc lại, giá trị trả Đ ể thu nhận đường dẫn tập tin tạm, ta dùng hàm GetTempPath DWORD GetTempPath(DwORD nBufferLength, LPTSTR IpBuffer); Trường nBufferlength xác định kích thước vùng đệm chuỗi ký tự xác định 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 ký tự ‘V, ví dụ : C:\TEMPV Nêu thành cơng, hàm trả độ lớn xác định kích thước chuỗi zero Nêu giá trị trả lớn nBufferLength, giá trị trả kích thước vừng đệm cắn đ ể chứa đường dẫn Ngược lại, giá trị trả hàm thất bại 7.3.3 Sao chép di chuyển tậ p tin Đ ể chép (copy) tập tin, ta cắn mở chê độ đọc Sau dùng hàm CopyFile để chép vào tập tin Trang 195 NGƠN NGỮ LẬP TRÌNH LẬ P TRÌN H c TRÊN WINDOWS BOOL CopyFile(LPCTSTR IpExistingFileName, LPCTSTR lpNewFileName, BOOL bFaillfExists); Trường lpExistingFileName IpNewFileName trỏ đến chuỗi (kết thúc NULL) xác định tên tập tin có tên tập tin Trường bFiallfExists xác định cách tạo tập tin với tên Nêu trường 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 thiết lập FALSE tập tin tổn hàm tạo tập tín chồng lên tập tin cũ Nêu thành công, hàm trả giá trị khác NgưỢc lại, giá ữị trả Đ ể di chuyển (move) 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 thao tác đổi tên m ột tập tin hay thư mục (bao gồm tập tin thư mục) BOOL MoveFile(LPCTSTR IpExistingFileName, LPCTSTR lpNewFileName); Hai trường lẩn lượt trỏ đến tên tập tin (thư mục) có tên tập tin (thư mục) Tên tập tín (thư mục) cẩn phải chưa có đường dẫn Tên tập tin hệ thống hay ổ đĩa khác, tên thư mục phải ổ đĩa với thư mục cũ Nêu thành công, giá trị trả khác NgƯỢc lại, giá trị trả Ví dụ sau minh họa việc tạo sử dụng tập tin tạm để copy tập tin Đầu tiên ứng dụng mở tập tin ORIGINAL.TXT 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 khối 4K liệu vàn vừng đệm, chuyển nội dung vìing đệm sang rh ữ hna, viết chiíng xiiơng tập tin tạm Sau chuyển tồn tập tin sang tập tin tạm, ta đổi tập tín tạm thành ALLCAPS.TXT cach dùng hàm MoveFile HANDLE hFile; HANDLE hTempFile; DWORD dwBytesRead, dwBytesWritten, dwPos; char szTempName[MAX_PATH]; char buffer[4096]; /* MỞ tập tin có sẵn */ hFile = CreateFileCORIGINAL.TXT", //tên tập tin GENERIC_READ, // mớ đ ể đọc 0, // không chia s ẻ Trang 196 LẬP TRÌNH NGƠN NGỮ LẬP TRÌNH WINDOWS NULL, // khơng bảo mật c TRÊN OPEN_EXISTING, // tập tín đõ 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) { ErrorHandler("Could not open file."); //x lý lỗi } /* Tạo tập tin tạm */ 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 szTempName); //vùng đệm tên hTempFile = CreateFile((LPTSTR) szTempName, // tên tập tin GENERICJREAD I GENERIC_WRITE, //m d n g đọc-ghi 0, // không chia sé NULL, // khơng bảo mật CREATE_ALWAYS, // tạo chòng tập tin đâ có FILE_ATTRIBUTE_NORMAL, // tập tin thơng thường NULL); //khơng thuộc tính tạm (hTempFile == INVALID_HANDLE_VALUE) { ErrorHandler("Could not create temporary file."); } /* Đọc khối 4K vào vùng đệm Chuyển tất ký tự vùng đệm sang dạng chữ hoa Viết vùng đệm vào tập tin tạm */ Trang 197 NGƠN NGỮ LẬP TRÌNH WINDOWS { LẬP TRÌNH c TRÊN if (ReadFiIe(hFile, buffer, 4096, &cwBytesRead, NULL)) { CharUpperBuff(buffer, dwBytesRead); WriteFile(hTempFile, buffer, dwBytesRead, &dwBytesWritten, NULL); } } while (dwBytesRead == 4096); /* Đóng hai tập tin */ CloseHandIe(hFile); CloseHandle(hTempFile); /* Chuyển tập tín tạm vào tập tin ALLCAPS.TXT */ tf (!MoveFile(szTempName, "ALLCAPS.TXT")) { ErrorHandler("Could not move temp, file."); } Hàm CloseHandle đóng m ột tập tin 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 mở có trỏ tập tín xác định byte kê tiếp đọc ghi Khi tập tin mở lần đầu tiên, hệ thống thiết lập trỏ tập tin vị trí đầu tập tin Mỗi đọc ghi vào byte, trỏ tập tin tự động dịch chuyển Đ ể thay đổi vị trí này, ta dùng hàm SetFilePointer DWORD SetFilePointer(HANDLE hFile, LONG lDistanceToMove, PLONG lpDistanceToMoveHigh, DWORD dwMoveMethod); Trường hFile handle tập tin chứa trỏ tập tin cần di chuyển Handle cắn tạo dạng truy cập GENERICJR.EAD GENERIC_WRITE Trường lDistanceToMove lpDistanceToMoveHigh xác định số byte trỏ cắn dịch chuyển Nêu lpDistanceToMoveHigh NULL, 32-bit thấp IDistanceToMove xác định sô byte cần di dời trỏ NgưỢc lại, hai trường ưên thiết lập giá trị 64-bit (không dấu) thể sô byte cần di dời trỏ Trang 198 NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Trường dwMoveMethod xác định điểm gốc mà trỏ cần di dời N trường FILE BEGIN, điểm gốc điểm đẩu tiên (byte thứ 0) tập tin Nêu FILE_CURRENT, điểm gốc vị trí trỏ Và FILE_END xác định điểm gốc vị trí cuối tập tin Nêu thành công, lpDistanceToMoveHigh NULL, giá trị ưả DWORD thấp trỏ tập tin Nêu lpDistanceToMoveHigh khác NULL, hàm trả DWORD thấp trỏ tập tin, trỏ trường đến DWORD cao trỏ tập tin Nêu hàm thất bại lpDistanceToMoveHigh NULL, giá trị trả v ề OxFFFFFFFF Đ ể biết thêm thông tin lỗi, ta dùng ham GetLastError Nêu hàm trả OxFFFFFFFF lpDistanceToMoveHigh, hàm thành công 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 đề : /* Trường hợp 1: Gọi hàm với IpDistanceToMoveHiqh == 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 == OxFFFFFFFF) // Kiểm tra thất bại { dwError = GetLastErrorO ; //N hậ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 IpDistanceToMoveHigh != NULL */ /* CỐ gắng di chuyển tr đ tập tín hFile m ột đoạn dài */ dwPtrLow = SetFilePointer(hFile, lDistLow, & lDistHigh, FILE_BEGIN); /* Kiểm tra thất bại */ if (dwPtrLow==OxFFFFFFFF&&(dwEiror=GetLastError())!=NO_ERROR) { / / X l ý lỗi // } // Cuối phần x lý lỗi Trang 199 NGƠN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS Đ ể di chuyển tiến, ta thiết lập độ dịch chuyển giá trị dương NgƯỢc lại, thiết lập giá trị âm để di chuyển lùi trỏ tập Un 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ả ERROR_NEGATIVE_SEEK Nêu muốn di chuyển trỏ đến cuối tập tin đ ể ghi tiếp, ta dừng hàm SetEndOfFile BOOL SetEndOfFUe(HANDLE hFüe); Trường hFile handle tập tin cần di chuyển trỏ đến cuối tập tín cần 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ị tra Hàm ReadFile đọc liệu từ tập tin, từ điểm xác định trỏ tập tin Sau đpr, rnn trỏ tập tin rlịrh rhnyển mộr đoạn ứng với sô hytp thật đ ọ r đưỢr Tương tự, đ ể ghi vào tập tin ta dùng hàm WriteFile 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 tạo với dạng truy cập GENERAL_READ GENERAL_WRITE Trường lpBuffer trỏ đến vùng nhớ đệm nhận liệu đọc từ tập tin, hay chứa liệu cắn ghi Trường nNumberOfBytesToRead xác định sô byte cắn đọc Trường lpNumberOfBytesRead trỏ đến byte đọc Hàm ReadFile thiết lập giá ttị trước thực thao tác khác đ ể kiểm ưa lỗi Trường nNumberOfBytesTo Write xác định số byte cần ghi Nêu trường 0, hàm không ghi liệu, gọi thực Trường IpNumberOfBytesWritten xác định sô byte ghi được, trường hàm WriteFile thiết lập vể trước thực thao tác khác để kiểm tra lỗi Cuối cùng, trường lpOverlapped trỏ đến cấu trúc OVERLAPPED Nêu tập tin mở với cờ FILE_FLAG_OVERLAPPED, giá trị phải khác NULL Để đơn giản ta thiết lập giá trị NULL, hàm đọc (ghi) tập tin từ vị trí ưỏ hàm ả kết sau đọc (ghi) xong Hàm ReadFile dừng với 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, 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ả Trang 200 LẬP TRÌNH c TRÊN NGƠN NGỮ LẬP TRÌNH WINDOWS 7.3.5 Khố m khoá tậ p tin Mặc dù hệ thống cho phép nhiều ứhg dụng mở ghi vào tập tin, ứng dựng không nên thực song song Đ ể ngăn chặn ứng dụng khác ghi vào phần liệu mình, ta sử dụng hàm LockFile Đ ể mở khoá tập tin, cho phép ứng dụng khác truy cập vùng liệu, ta dùng hàm UnlockFile BOOL LockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToLockLow, DWORD nNumberOfBytesToLockHigh); BOOL UnlockFile(HANDLE hFile, DWORD dwFileOffsetLow, DWORD dwFileOffsetHigh, DWORD nNumberOfBytesToUnlockLow, DWORD nNumberOfBytesToUnlockHigh); Trường hFile handle tập tin mở dạng GENERAL_READ GENERAL_WRITE, hai Trường dwFileOffsetLow dwFileOffsetHigh xác định word thấp cao byte offset đẩu tiên cẩn khoá 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 khố hay mở khóa Nêu thành công, hàm trả giá trị khác NgưỢc lại, giá trị trả Ví dụ sau nối tập tin vào tập tin khác, ứng dụng sử dụng hàm CreateFile mở tập tin ỎNE.TXT để đọc, TWO.TXT đ ể viết Sau ứng dụng nôi phan liệu tập tin ONE.TXT vào cuối tập tin TWO.TXT cách đọc (dùng hàm ReadFile) ghi (dùng hàm W riteFile) khối 4K liệu Trước v iết vào tập tin thứ hai, ứng dụng dịch chuyển trỏ đến cuối tập tin cách dùng hàm SetFilePointer, sau khóa vùng cần ghi dùng hàm LockFile Sau thực thao tác ghi xong, ta mở khoá, dùng hàm UnlockFile, để ứng dụng khác sử dụng tập tin HANDLE hFile; HANDLE hAppend; DWORD dwBytesRead, dwBytesWritten, dwPos; char buff[4096]; /* M ỏ tập tin có */ hFile = CreateFUe("ONE.TXT", // mở tập tin ONE.TXT GENERIC_READ, // mở đ ể đọ c Trang 201 LẬP TRÌNH NGƠN NGỮ LẬP TRÌNH WINDOWS 0, // khơng chia sẻ c TRÊN NULL, // không bảo mật OPENJEXISTING, // m ỏ tập tin tồn 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) { ErrorHandler("Could not open ONE."); //x lý lỗi } /* MỞ tập tin có Nếu chưa có, tạo tập tin */ hAppend = CreateFile("TWO.TXT', / / mở tập tin TWO.TXT GENERIC_WR]TE, //m đ ể ghi 0, // không chia sẻ NULL, //không bảo mật OPEN_ALWAYS, //m tập tin cũ tạo FILE_ATTRIBUTE_NORMAL, // tập tin bình thường NULL); // khơng có thuộc tính tạm (hAppend == INVALID_HANDLE_VALUE) { ErrorHandler("Could not open TWO."); / /x lý lỗi } /* Nối tập tirì thứ vào cuối tập tin thứ hai Khoá tập tin thứ hai đ ể ngăn chặn tiến trình khác truy cập ghi MỞ khoá sau ghi xong */ { (ReadFile(hFile, buff, 4096, &dwBytesRead, NULL)) { Trang 202 NGƠN NGỮ LẬP TRÌNH WINDOWS LẬP TRÌNH c TRÊN 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 hai tập tin */ CloseHandle(hFOe); CIoseHandle(hAppend); 7.3.6 Đóng xoá tậ p tin Đ ể sử dụng hiệu tài nguyên hệ thống, ứng dụng cần đóng tập tin không cẩn dùng cách gọi hàm CloseHandle Nêu ứng dụng bị ngắt tập tin mở, hệ thống tự động đóng tập tin BOOL CloseHandle(HANDLE hObject); Nêu thành công, hàm trả giá trị khác NgưỢc lại, giá trị trả Đ ể 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 ý tập tin cắn phải đóng trước bị xóa BOOL DeleteFile(LPCTSTR IpFileName); Trường lpFileName trỏ đến chuỗi (kết thúc ký tự NULL) xác định tập tin cần xoá Nêu thành công, hàm trả ưị khác NgưỢc lại, giá trị trả Hàm thất bại tập tập tin cẩn xố khơng tổn Trong Windows NT, hàm khơng thể xố tập tin mở Tuy nhiên, Windows 95, tập tín mở bị xố 7.3.7 x lý th m ục Khi ứng dụng tạo tập tin mới, hệ điều hành thêm tập tin vào thư mục xác định Đ ể tạo xoá thư mục, ta dùng hàm CreateDirectory RemoveDirectory BOOL CreateDirectory(LPCTSTR lpPathName, LPSECURITY_ATTRIBUTES lpSecurityAttributes); Trang 203 NGÔN NGỮ LẬP TRÌNH LẬP TRÌNH c TRÊN WINDOWS BOOL RemoveDirectory(LPCTSTR IpPathName); Trường lpPathName trỏ đến chuỗi (kết thúc 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 ữườ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 thư mục Đ ể đơn giản, ta gán giá trị lpSecurityAttributes NULL, thư mực nhận giá trị mò tả mật mặc định Nêu thành cơng, hàm ưả giá trị khác NgƯỢc lại, giá trị trả Thư mực cuối đường dẫn sử dụng gọi thư mực hành Đ ể xác định rhư m ụr hành, ứng dụng gọi hàm GpỵCnrrpnỵDirprỵnry Đ ể thay đổi itiư m ụr 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 chuỗi ký tự thể thư mục hành Vùng đệm phải dài đủ đ ể chứa ký tự NULL cuối chuỗi Trường lpBuffer chứa chuỗi ký tự Nêu thành công, hàm trả giá ữị xác định sô ký tự ghi vào vùng đệm, không chứa ký tự NULL NgưỢc lại, giá trị trả Nêu vùng đệm lpBuffer khơng đủ lớn, giá ữị trả xác định kích thước cẩn thiết vùng đệm, gồm byte NULL đáng dấu kết thúc chuỗi BOOL SetCurrentDirectoryQLPCTSTR lpPathName); Trường lpPathName trỏ đến chuỗi ký tự (kết thúc NULL) xác định đường dẫn Nêu thành công, hàm trả giá trị khác NgưỢc lại, giá trị trả Trang 204

Ngày đăng: 10/03/2019, 10:24

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

Tài liệu liên quan