MỤC LỤC
Trong phần này, chỳng ta minh họa bằng vớ dụ thực hiện thao tỏc ủể dành và xỏc nhận vùng nhớ, và ví dụ tạo trang "lính canh". Trong vớ dụ ủầu tiờn, ta sử dụng hàm VirtualAlloc và VirtualFree ủể cấp phỏt ủể dành và xỏc nhận vựng nhớ ảo. Ta sử dụng giỏ trị NULL cho ủịa chỉ cơ sở, ủồng nghĩa với việc ủể cho hệ thống tự xỏc ủịnh vị trớ vựng cấp phỏt.
Mỗi khi có lỗi trang xuất hiện trong quá trình thực hiện khối try, hàm lọc trước khối except sẽ ủược thực hiện. Nếu hàm lọc cú thể cấp phỏt một trang khỏc, phần thực thi sẽ tiếp tục trong khối try tại cại ủiểm xuất hiện lỗi ngoại lệ. Như một thay thế cho cấp phỏt ủộng, tiến trỡnh cú thể ủơn giản cấp phỏt xỏc nhận vựng cũn lại thay vỡ chỉ ủể dành chỳng.
Tuy nhiờn việc cấp phỏt xỏc nhận như vậy lại tạo nờn cỏc khối nhớ khụng cần thiết ủỏng ra ủược sử dụng cho cỏc tiến trỡnh khỏc. Trong vớ dụ này, ta sử dụng hàm VirtualFree ủể giải phúng vựng nhớ ủó xỏc nhận lẫn vựng nhớ ủể dành sau khi hoàn tất cụng việc. Hàm này ủược gọi hai lần : lần ủầu ủể khử cấp phỏt cỏc trang ủó ủược cấp phỏt xỏc nhận, và lần sau ủể giải phúng toàn bộ cỏc trang dưới dạng ủể dành.
PAGELIMIT*PAGESIZE,// kích thước vùng cấp phát MEM_RESERVE, // cấp phỏt dưới dạng ủể dành. Nếu lỗi trang xuất hiện, bộ lọc ngoại lệ sẽ thực thi ủể cấp phỏt xỏc nhận cỏc trang kế tiếp trong khối ủể dành */. ExitProcess( GetLastError() );. /* Giải phúng cỏc trang sau khi sử dụng. ðầu tiờn là cỏc trang ủó ủược cấp phỏt xỏc nhận */. lpvBase, // ủịa chỉ cơ sở của khối nhớ. dwPages*PAGESIZE, // số byte cỏc trang ủó cấp phỏt MEM_DECOMMIT); // hình thức là khử xác nhận /* Cuối cựng, giải phúng toàn vựng nhớ (ủể dành) */.
Hệ thống cũng xoá cờ PAGE_GUARD, loại bỏ tình trạng "lính canh" của trang vùng nhớ. Nếu một lỗi ngoại lệ xuất hiện trong suốt dịch vụ hệ thống, dịch vụ sẽ trả về giá trị xác ủịnh lỗi. Tuy nhiờn, trong lần khoỏ thứ hai, hàm thực hiện thành cụng, do hệ thống ủó loại bỏ tỡnh trạng "lớnh canh" của trang.
FILE_SHARE_DELETE Sử dụng trong Windows NT : Thao tỏc trờn ủối tượng chỉ thực hiện nếu yêu cầu truy cập xoá. Trường lpSecurityAttributes trỏ ủến cấu trỳc SECURITY_ATTRIBUTES xỏc ủịnh handle ủối tượng cú ủược chuyển cho cỏc tiến trỡnh con hay khụng. Nếu tập tin ủó tồn tại, hàm sẽ tạo chồng lờn, ủồng thời xoỏ cỏc thuộc tớnh hiện hành của tập tin.
Lưu ý, việc thiết lập giá trị dwDesiredAccess cho phép ứng dụng có thể truy vấn các thuộc tính thiết bị mà không thực sự truy cập thiết bị. • Kết hợp cỏc cờ và thuộc tớnh tập tin ủược xỏc ủịnh bởi cờ dwFlagsAndAttributes với giá trị là FILE_ATTRIBUTE_ARCHIVE. UINT SetErrorMode(UINT uMode);. Trong vớ dụ sau, hàm CreateFile mở một tập tin ủó cú ủể ủọc :. HANDLE hFile;. 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.
CloseHandle(hFile);. Trong vớ dụ sau, hàm tạo một tập tin mới và mở ở chế ủộ ghi. HANDLE hFile;. 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. Các ứng dụng có thể nhận một tập tin duy nhất cho tập tin tạm bằng cách sử dụng hàm GetTempFileName. 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 các ký 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 trong việc tạo tập tin tạm. Trường lpExistingFileName và lpNewFileName trỏ ủến chuỗi (kết thỳc NULL) xỏc ủịnh tờn tập tin ủó cú và tờn tập tin mới. Tờn tập tin (thư mục) mới cần phải chưa cú trong ủường dẫn của nú. Tờn tập tin mới cú thể trờn một hệ thống hay ổ ủĩa khỏc, trong khi tờn thư mục mới phải cựng ổ ủĩa với thư mục cũ. Nếu thành công, giá trị trả về khác 0. Ngược lại, giá trị trả về là 0. Vớ dụ sau minh họa việc tạo và 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 và 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 trong vựng ủệm sang chữ hoa, và viết chỳng xuống tập tin tạm. Sau khi chuyển toàn bộ tập tin trờn 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;. char szTempName[MAX_PATH];. 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. szTempName); // vựng ủệm tờn.
Nếu hàm trả về 0xFFFFFFFF và 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. Nếu giỏ trị con trỏ tập tin sau khi dịch chuyển õm, hàm thất bại, và mã lỗi mà hàm GetlastError trả về là ERROR_NEGATIVE_SEEK. Trường hFile là handle của tập tin cần di chuyển con trỏ ủến cuối tập tin cần ủược tạo với dạng truy cập GENERAL_WRITE.
Trường lpNumberOfBytesWritten xỏc ủịnh số byte ghi ủược, trường này cũng ủược hàm WriteFile thiết lập về 0 trước khi thực hiện cỏc thao tỏc khỏc ủể kiểm tra lỗi. 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) và ghi (dựng hàm WriteFile) từng khối 4K dữ liệu. Trước khi viết vào tập tin thứ hai, ứng dụng dịch chuyển con 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 khi thực hiện thao tỏc ghi xong, ta mở khoỏ, dựng hàm UnlockFile, ủể cỏc ứng dụng khác có thể sử dụng tập tin này. HANDLE hFile;. HANDLE hAppend;. DWORD dwBytesRead, dwBytesWritten, dwPos;. 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. 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.