• Thứ Năm, 08/01/2004 11:22 (GMT+7)

    Câu hỏi :
    Hỏi: Tôi muốn viết chương trình tạo file nén tự bung kiểu như Winzip Self-Extractor nhưng gặp phải vấn đề là file *.exe đang chạy thì không thể mở chính bản thân nó để đọc phần dữ liệu phía sau (dùng Borland Delphi với các hàm Reset, FileOpen đều gặp thông báo lỗi).

    Trả lời :

    Đáp: Vấn đề của bạn liên quan đến tình huống nhiều ứng dụng cùng truy xuất 1 file. Chúng tôi không có điều kiện để thử các hàm truy xuất file của môi trường Delphi vì việc này cũng không cần thiết. Thực vậy, dù bạn lập trình bằng ngôn ngữ nào trên Windows, bạn cũng có thể gọi các hàm API của Windows để truy xuất file hay thực hiện 1 chức năng nào đó, hơn nữa các hàm API của Windows rất mạnh và tương thích tốt với môi trường Windows hơn là hàm của môi trường lập trình cụ thể. Chẳng hạn bạn muốn viết 1 ứng dụng để mở và đọc chính file khả thi của ứng dụng đó, hãy gọi hàm API CreateFile() và ReadFile(). Sau đây là đoạn source code bằng C++ cho phép mở file khả thi đang chạy và đọc nội dung vào bộ nhớ để xử lý sau. Bạn có thể đọc, hiểu rồi dịch đoạn lệnh này sang Delphi nếu cần:

    HANDLE hd;// chứa handle của file

    int kq;   //

    DWORD readCnt,flenl, flenh;

       hd = CreateFile("MyApp.exe",// mở file để đọc

                GENERIC_READ,

                FILE_SHARE_READ,// mở file ở chế độ đọc chung

                NULL,

                OPEN_EXISTING,

                FILE_ATTRIBUTE_READONLY,

                NULL);

       if (hd == INVALID_HANDLE_VALUE) {

                MessageBox("Không mở được file MyApp.exe",NULL,MB_OK);

                return;

       } else { // đọc nội dung file

                flenl = GetFileSize(hd,&flenh);

                BYTE *buf=(BYTE*)malloc(flenl);

                if (ReadFile(hd,buf,flenl,&readCnt,NULL)==0) {

                   MessageBox("Khong mo duoc file Key.exe",NULL,MB_OK);

                   return;

                } else {

                   // xử lý nội dung đọc được

                }

                return;

       }

    Chuyên mục: Lập trình