• Thứ Hai, 21/01/2008 13:15 (GMT+7)

    Thông báo không tìm thấy gdi32.dll trong lập trình VB.NET

    Câu hỏi :
    Lập trình VB.Net và dùng các hàm API, thường bị báo lỗi như không tìm thấy gdi32.dll, user32.dll, ... mặc dù các file này vẫn có. Xin hướng dẫn.
     

    Trả lời :
    Bạn có thể gọi hàm Windows API (hay hàm trong thư viện *.dll bất kỳ) trong code VB .Net. Để gọi hàm API trong 1 class VB .Net, bạn có thể dùng 1 trong 2 lệnh: lệnh Declare hay lệnh DllImport để khai báo hàm API như 1 tác vụ của class đó rồi gọi nó y như những hàm khác của class. Sau đây là đoạn code VB .Net đặc tả class của 1 Form ứng dụng có gọi hàm API WinExec():
     ...
     Imports System.Runtime.InteropServices
     Public Class Form1
     'dùng lệnh DllImport
     <DllImport("kernel32.dll")> _
     Public Shared Function WinExec(ByVal lpCmdLine As String, ByVal wType As Integer) As Integer
     End Function
     'hoặc dùng lệnh Declare
     'Private Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Integer) As Integer
     
     'hàm xử lý click button để chạy ứng dụng Notepad
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
     'thử chạy ứng dụng Notepad.exe
     WinExec("Notepad.exe", 1)
     End Sub
     //định nghĩa các tác vụ khác của class Form1
     ...
     End Class
     Lưu ý, để khai báo đúng 1 hàm API, bạn cần tìm hiểu và nắm vững các thông tin sau về hàm API đó:
     - Hàm nằm trong thư viện *.dll nào.
     - Tên của hàm là gì.
     - Hàm có bao nhiêu tham số, mỗi tham số thuộc kiểu dữ liệu nào và được truyền theo cơ chế nào: theo trị hay theo tham khảo...
     - Giá trị trả về của hàm thuộc kiểu dữ liệu nào.
     Kinh nghiệm của chúng tôi cho thấy, lỗi sai phổ biến mà người lập trình VB .Net gặp phải khi khai báo 1 hàm API là không miêu tả đúng kiểu dữ liệu của từng tham số. Thí dụ hàm WinExec() ở trên, trong thư viện kernel32.dll nó được viết bằng C++ và có đặc tả như sau:
     UINT WinExec(LPCSTR lpCmdLine, UINT uCmdShow);
     
     Nhưng trong VB .Net ta phải khai báo hàm WinExec như sau:
     'dùng lệnh DllImport
     <DllImport("kernel32.dll")> _
     Public Shared Function WinExec(ByVal lpCmdLine As String, ByVal wType As Integer) As Integer
    Chuyên mục: Lập trình