• Thứ Tư, 20/09/2006 15:08 (GMT+7)

    lấy ngày sản xuất máy tính bằng VC++

    Câu hỏi :
    Xin hướng dẫn tạo file *.dll từ Visual C++ để lấy ngày sản xuất trong máy tính. Chương trình trong DOS được viết như sau:
     

    Trả lời :

    #include <dos.h>
     #include <mem.h>
     unsigned char far *rom = MK_FP(0xFFFF, 0);
     void main() {
     char date[9], c[256];
     int i, len;
     for (i=0; i<8; i++)
     date[i] = rom[5+i];
     date[8] = 0;
     printf("\n\n\nThong tin ve BIOS");
     printf("\nNgay san xuat : %s", date);
     if (rom[14] == 0xFC)
     printf("\nKieu may : AT");
     rom = MK_FP(0xF000, 0xE060);
     len = rom[0];
     for (i=0; i<len; i++)
     c[i] = rom[i+1];
     printf("\nManufacturer : %s", c);
     getch(); }
     Đoạn chương trình C của bạn đã truy xuất trực tiếp vào bộ nhớ ROM BIOS để lấy các thông tin về BIOS của máy như ngày sản xuất BIOS, nhà chế tạo BIOS... Chương trình của bạn chỉ có thể chạy trên chế độ "real-mode" (DOS), chế độ mà mỗi địa chỉ bộ nhớ được truy xuất bởi chương trình là địa chỉ thật sự của ROM hay RAM máy tính. Tuy nhiên, hiện nay tuyệt đại đa số người dùng đều dùng môi trường Windows XP, môi trường này chỉ cho phép chạy các ứng dụng theo chế độ bộ nhớ ảo, do đó nếu giữ nguyên đoạn code của bạn sẽ không được phép chạy trên Windows XP. Để khắc phục vấn đề truy xuất các thông tin phần cứng của máy, Windows có cung cấp dịch vụ WMI (Windows Management Instrumentation) để người lập trình trên Windows XP dễ dàng truy xuất các thông tin phần cứng của máy mà không cần biết chi tiết về vị trí vật lý và cách thức lưu trữ những thông tin đó. Tuy nhiên nếu dùng ngôn ngữ C hay C++ để truy xuất dịch vụ WMI thì đoạn code sẽ rất dài, phức tạp và không trong sáng, cách thuận tiện nhất để truy xuất dịch vụ WMI là dùng ngôn ngữ VB, VB .Net hay VC#. Thí dụ sau đây được viết bằng VB 6.0. Bạn hãy chạy VB, tạo 1 Project "Standard EXE" chứa 1 Form trống, vẽ 1 ListBox với tên mặc định là List1 vào Form rồi viết hàm Form_Load cho Form như sau:

     Private Sub Form_Load()
     'tạo đối tượng dịch vụ WMI
     Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
     'tìm các đối tượng BIOS của máy
     Set colItems = objWMIService.ExecQuery("Select * from Win32_BIOS")
     'lặp hiển thị thông tin của từng BIOS (thường chỉ có 1 BIOS)
     For Each objItem In colItems
     'hiển thị thông tin nhà sản suất BIOS
     List1.AddItem "BIOS Manufacturer : " & CStr(objItem.Manufacturer)
     'hiển thị thông tin ngày sản suất BIOS
     List1.AddItem "BIOS Date : " & CStr(objItem.ReleaseDate)
     Next
     End Sub

     Phần mềm ứng dụng viết bằng Visual FoxPro 7.0, có cách nào thiết lập chương trình chạy 1 tháng rồi dừng lại để cho khách hàng dùng thử?

     Chức năng của phần mềm là do người viết phần mềm đó quyết định. Thí dụ nếu muốn phần mềm FoxPro của mình chỉ chạy 1 tháng, sau đó sẽ không chạy nữa thì bạn hãy viết đoạn code thực hiện chức năng này vào phần mềm của mình. Có rất nhiều cách thực hiện khác nhau với mức độ bảo mật khác nhau, ở đây chúng tôi chỉ xin giới thiệu 1 cách đơn giản:

     - Khi cài đặt ứng dụng vào máy người dùng, chương trình cài đặt sẽ tạo 1 file (hay 1 sector đặc biệt trên đĩa cứng...) chứa ngày/giờ cài đặt.
     - Trong ứng dụng, thường ở phần khởi động chương trình, bạn viết thêm đoạn code kiểm tra thời hạn sử dụng bằng cách so sánh ngày/giờ hiện hành khi ứng dụng chạy và ngày/giờ lưu giữ khi cài đặt, nếu quá 1 tháng (thời hạn cho phép) thì ứng dụng dừng lại, nếu không chạy tiếp bình thường.

     Lưu ý, tùy mức độ bảo vệ ứng dụng mà người dùng có thể "bẻ khóa" dễ dàng hay khó khăn.
     
     

    Chuyên mục: Windows