&: toán tử lấy địa chỉ
*: toán tử lấy nội dung con trỏ
->: toán tử đến các thành viên của con trỏ
Ví dụ dưới đây sử dụng con trỏ làm tham số cho hai hàm WinAPI CreatFile và ReadFile. ReadFile. Ví dụ 22-2 Sử dụng con trỏ trong C# using System; using System.Runtime.InteropServices; using System.Text; class APIFileReader {
// import hai phương thức, phải có từ khóa unsafe
[DllImport("kernel32", SetLastError=true)]
static extern unsafe int CreateFile( string filename, uint desiredAccess, uint shareMode, uint attributes, uint creationDisposition, uint flagsAndAttributes, uint templateFile); // API phải dùng con trõ
[DllImport("kernel32", SetLastError=true)]
static extern unsafe bool ReadFile( int hFile,
int nBytesToRead,
int* nBytesRead,
int overlapped);
// hàm dựng: mở một tập tin đã tồn tại
public APIFileReader(string filename) {
fileHandle = CreateFile( filename, // tập tin
GenericRead, // cách truy xuất - desiredAccess
UseDefault, // shareMode UseDefault, // attributes OpenExisting, // creationDisposition UseDefault, // flagsAndAttributes UseDefault); // templateFile }
// unsafe: cho phép tạo con trỏ và
// ngữ cảnh unsafe (unsafe context)
public unsafe int Read(byte[] buffer, int index, int count) {
int bytesRead = 0;
// fixed: cấm CLR dọn dẹp rác
fixed (byte* bytePointer = buffer)
{
ReadFile(
fileHandle, // hfile
bytePointer + index, // lpBuffer
count, // nBytesToRead &bytesRead, // nBytesRead 0); // overlapped } return bytesRead; }
const uint GenericRead = 0x80000000;
const uint OpenExisting = 3;
const uint UseDefault = 0;
int fileHandle; }
class Test {
public static void Main( ) {
APIFileReader fileReader =
new APIFileReader("myTestFile.txt"); // tạo buffer và ASCII coder
const int BuffSize = 128;
byte[] buffer = new byte[BuffSize];
ASCIIEncoding asciiEncoder = new ASCIIEncoding( );
// đọc tập tin vào buffer và hiển thị ra màn hình console
while (fileReader.Read(buffer, 0, BuffSize) != 0) {
Console.Write("{0}", asciiEncoder.GetString(buffer)); }
} }
Phần 2