在VBA開發過程中,為了能夠使用系統已經提供的函數,或已經用C++語言開發的功能,本文對VBA調用C++ DLL進行了總結。
1. 函數聲明
Function prototype:
DWORD WINAPI GetCurrentDirectory(
__in DWORD nBufferLength,
__out LPTSTR lpBuffer
);
函數聲明如下:
Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long
Public 用於聲明對所有模塊中的所有其它過程都可以使用的函數。 Private 用於聲明只能在包含該聲明的模塊中使用的函數。
Lib包含所聲明函數的動態鏈接庫名或代碼資源名。
Alias 表示將被調用的函數在動態鏈接庫(DLL) 中還有另外的名稱。
2. DLL的位置
DLL文件必須位於以下三個目錄之一:
(1)Windows的系統目錄:\Windows\system32
(2)DOS中path所指出的任何目錄
(3)Windows XP系統下:C:\Documentsand Settings\%USERNAME%\My Documents
為了VBA可以調用DLL中的函數,必須把DLL放在以上三個位置中的任何一個。
有兩種辦法可以解決這個問題:
1. 在調用DLL 函數之前,把DLL copy到以上三個目錄中的任何一個。
Dim fso AsObject
Dim dllFileNameAs String
dllFileName = Environ("SYSTEMROOT")+ “\system32\LicenseVerify.dll”
Set fso =CreateObject("Scripting.FileSystemObject")
Iffso.FileExists(dllFileName) = False Then
fso. CopyFile ThisWorkbook.Path + “\ LicenseVerify.dll”,dllFileName
End If
2. 改變當前進程的當前路徑。
例如,DLL與當前EXCEL文件放在同一個目錄下,這個時候當前進程的當前路徑設置如下:
Public Declare Function SetCurrentDirectoryLib "kernel32" Alias "SetCurrentDirectoryA" (ByVallpPathName As String) As Long ‘ function declaration
SetCurrentDirectory (ThisWorkbook.Path) ‘set the current directory to Thisworkbook.Path
OK,這樣設置後,就可以訪問DLL了。這樣方便程序的發布,不需要用戶把DLL復制到系統目錄下。
3. 返回值
如果返回值是字符串,需要在函數調用前為字符串分配內存空間。
Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long
其中,lpBuffer 是輸出參數。
例子:
Public Declare Function GetCurrentDirectoryLib "kernel32" Alias "GetCurrentDirectoryA" (ByValnBufferLength As Long, ByVal lpBuffer As String) As Long
Private Sub DoVerify()
Dimresult As Integer
Dim retValue AsString
retValue = String(1024, vbNullChar) 'allocate the buffer for out parameter.
result= GetCurrentDirectory(1024, retValue)
End Sub