1. 程式人生 > 其它 >獲取本機所有dll_[VBA][高階應用] DLL動態呼叫

獲取本機所有dll_[VBA][高階應用] DLL動態呼叫

技術標籤:獲取本機所有dll

a232bf2d9da84fa57d22fd19f725aae2.png

總共就兩個部分,第一部分說幾個宣告API並使用的技巧,第二部分簡單講一下怎麼動態呼叫DLL

一、動態宣告

玩API的人看到前面的描述肯定會心裡MMP,廢話少說,看內容。

1、相對路徑宣告

這個最好理解

普通的API宣告長這樣:

Declare Function LZ4_versionNumber Lib "liblz4" Alias "[email protected]" () As Long

下面是其FullPath版本的宣告:

Declare Function LZ4_versionNumber Lib "c:liblz4.dll" Alias "
[email protected]
" () As Long

下面是其相對路徑版本的宣告:

Declare Function LZ4_versionNumber Lib "..Pluginsliblz4" Alias "[email protected]" () As Long

這特麼怎麼這麼複雜呢,這三種都可以?下面也就簡單一解釋,不做深入研究,各位看官也就看看就好,能記住就記住。

先說FullPath版本,這是最低階的使用方法,一般人不會這麼用;還有一種方法也可以指定FullPath,那就是使用manifest,manifest是個好東西,這個以後再扒。

然後是普通的API和相對路徑的API,這倆其實是一個原理:

對於VB6,怎麼檢索DLL呢,當然是先檢索App.Path(1、不檢索子目錄;2、VBA裡對應Application.Path)

然後再檢索環境變數目錄

很多人不知道怎麼看環境變數,Win+R,cmd,輸入set,enter,就看到了所有環境變數

上述DLL靜態宣告,會在當前目錄和所有環境變數目錄,以相對路徑檢索DLL(如果多個路徑都檢索到,這個要應用檢索規則,這裡也不扒了)

假設環境變數中有一個路徑:c:xxx

那麼API中的"..Pluginsliblz4"和"liblz4",就分別對應了路徑:

"c:xxx..Pluginsliblz4.dll"和"c:xxxliblz4.dll"

上面".."的意思是指上一級目錄,也即

"c:xxx..Pluginsliblz4.dll" = "c:Pluginsliblz4.dll"

2、動態路徑

先說怎麼用,宣告就跟普通宣告方式一樣:

Declare Function LZ4_versionNumber Lib "liblz4" Alias "[email protected]" () As Long

但是,如果這時候在環境變數目錄下都沒有這個dll的話

在使用這個dll之前,我們可以用LoadLibrary這個API來載入一下dll,就可以呼叫"LZ4_versionNumber"了

Declare宣告函式時,是宣告函式指標,並指明入口點,VB6會通過內部函式DllFunctionCall(該函式會呼叫LoadLibraryA)來呼叫外部API

如果Declare時,在所有路徑都找不到DLL,而這時候,你主動使用LoadLibrary載入了該DLL

這時候,就解決了載入DLL的問題,相當於執行時重定向DLL

3、修改環境變數

VB6程式在載入時,會優先載入App.Path

然後會載入程序環境變數,程序環境變數

這裡相關的API有5個,這裡用到的就前2個:

Declare Function GetEnvironmentVariableA Lib "kernel32" (ByVal lpName As String, ByVal lpBuffer As String, ByVal nSize As Long) As Long '單個獲取程序環境變數Declare Function SetEnvironmentVariableA Lib "kernel32" (ByVal lpName As String, ByVal lpValue As String) As Long '單個設定程序環境變數Declare Function GetEnvironmentStringsA Lib "kernel32" () As Long '獲取當前程序所有環境變數Public Declare Function SetEnvironmentStringsA Lib "kernel32" (ByVal lpszEnvironmentBlock As Long) As Long '設定當前程序所有環境變數Public Declare Function FreeEnvironmentStringsA Lib "kernel32" (ByVal lpszEnvironmentBlock As Long) As Long '清理臨時指標

然後加環境變數就是這樣操作:

 Dim lngRet As Long Dim strDest As String Dim arr() As String, i As Long Dim boolIn As Boolean '路徑是否在環境變數中  Const MAX_BUFFER = 9000& strDest = String$(MAX_BUFFER, Chr(0)) GetEnvironmentVariableA "Path