
总共就两个部分,第一部分说几个声明API并使用的技巧,第二部分简单讲一下怎么动态调用DLL
一、动态声明
玩API的人看到前面的描述肯定会心里MMP,废话少说,看内容。
1、相对路径声明
这个最好理解
普通的API声明长这样:
Declare Function LZ4_versionNumber Lib "liblz4" Alias "_LZ4_versionNumber@0" () As Long
下面是其FullPath版本的声明:
Declare Function LZ4_versionNumber Lib "c:liblz4.dll" Alias "_LZ4_versionNumber@0" () As Long
下面是其相对路径版本的声明:
Declare Function LZ4_versionNumber Lib "..Pluginsliblz4" Alias "_LZ4_versionNumber@0" () 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 "_LZ4_versionNumber@0" () 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