3.2 Cách khai báo hàm API bằng lệnh Declare.
Ở các phần trước, chúng ta đã biết rằng hàm API được cung cấp trong các file DLL. Tuy nhiên, để gọi hàm API thì các điều dưới đây, VBA không hiểu.
Ⓐ Hàm API mà chúng ta muốn gọi nằm trong thư viện nào?
Ⓑ Ta phải truyền tham số như thế nào cho hàm API thì tốt?
Vì vậy, để truy cập vào DLL, ở VBA ta sử dụng lệnh
Declare để khai báo hàm API.
Thông qua ví dụ về khai báo hàm lấy chỉ dẫn Windows Directory là
GetWindowsDirectory, chúng ta sẽ cùng nhau học cách sử dụng lệnh
Declare.
Đầu tiên hãy nhìn cấu trúc hàm
GetWindowsDirectory được viết bằng ngôn ngữ C:
UNIT GetWindowsDirectoryA(
LPSTR lpBuffer, //address of buffer for Windows directory
UINT uSize //size of directory buffer
);
Sau đây ta sẽ chuyển thành khai báo phù hợp để có thể sử dụng được trong VBA.
Đầu tiên hãy xem định dạng Win64 API.
Bạn cần đăng nhập để thấy đính kèm
❶ Khai báo của 64bit
Khi gọi Win64 API, đầu tiên chúng ta sử dụng từ khóa PtrSafe, nó sẽ biên dịch cho VBA 64bit.
❷ Chỉ định tên hàm
Tên hàm ở đây sẽ dùng giống như tên hàm được khai báo bằng ngôn ngữ C. Do đó chúng ta giữ nguyên tên hàm là
GetWindowsDirectory.
Chú ý: Cũng có những hàm API không có giá trị trả về. Khi đó chúng ta không dùng Function, chúng ta dùng từ khóa Sub. (
Lời người dịch: Hãy nhớ lại khái niệm thủ tục và hàm)
❸ Chỉ định thư viện
Hàm API này đang được cất trong DLL nào, chúng ta phải khai báo. Nếu không khai báo thì VBA sẽ không hiểu địa chỉ của hàm API. Như tôi đã nói, chúng ta giới hạn trong khuôn khổ 3 DLL phổ biến hay dùng nhất, đó là Kernel32.dll, User32.dll, Gdi32.dll , chúng ta có thể giản lược bỏ đuôi file là ".dll" và có thể viết là [Lib "kernel32"] nhưng khi bạn gọi hàm API trong thư viện khác thì phải viết rõ ràng cả đuôi file ".dll", ví dụ [Lib "advapi32.dll"] .
❹ Chỉ định tên hàm chính thức được công khai ở DLL
Ở mục 5 chương 3 (3.5) tôi sẽ giải thích về Win API sử dụng chuỗi ký tự nhưng cũng có trường hợp API được công khai bằng cái tên khác trong DLL. Trong trường hợp đó, ta sẽ khai báo tên hàm được công khai bằng
Alias.
Tóm lại, hàm
GetWindowsDirectory được công khai trong DLL là hai tên hàm:
GetWindowsDirectoryA và
GetWindowsDirectoryW. Tên hàm
GetWindowsDirectory không tồn tại trong thực tế.
Trong trường hợp ví dụ này, mặc dù có hai cái tên, nhưng chúng ta đã chọn khai báo lấy tên là
GetWindowsDirectoryA.
Chú ý: Ở cuối tên hàm có sự khác biệt chữ cái [A] và [W], về điều này tôi sẽ thuyết minh trong mục Win API sử dụng chuỗi ký tự.
Ngoài ra, tên hàm API có phân biệt chữ in hoa và chữ thường. Trường hợp khai báo như dưới đây sẽ sinh ra lỗi.
Bạn cần đăng nhập để thấy đính kèm
Tổng kết: Thực tế là, nếu bạn chỉ định tên hàm API đúng ở phần Alias, thì đằng sau từ khóa Function, bạn có thể viết tên hàm tùy ý mà không phải là [
GetWindowsDirectory]. Ví dụ, trường hợp khai báo như dưới đây cũng đúng.
Bạn cần đăng nhập để thấy đính kèm
Tuy nhiên, chúng ta không nên đặt tên tùy tiện như vậy, đó không phải là thói quen tốt. Hãy đặt tên giống như Microsoft.
❺ Chỉ định tham số
Trong C, tham số lpBuffer có kiểu dữ liệu được khai báo là [LPTSTR] nhưng trong VBA không có kiểu dữ liệu như vậy. Ở đây, ta chuyển thành khai báo kiểu String.
Tương tự như thế, kiểu dữ liệu [UNIT] chúng ta chuyển thành kiểu Long. Ở phần tiếp theo, tôi sẽ giới thiệu quy tắc chuyển đổi kiểu dữ liệu từ ngôn ngữ C sang kiểu dữ liệu của VBA.
❻ Giá trị trả về
Trong ngôn ngữ C, giá trị trả về của hàm
GetWindowsDirectory là kiểu dữ liệu UNIT. Trong VBA, ta chuyển kiểu dữ liệu trả về của [
Function GetWindowsDirectory] là kiểu LongPtr.
(Còn nữa)