|
楼主 |
发表于 2024-1-7 20:11
|
显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用 · 内置多项VBA编程加强工具 ★ 免费下载 ★ ★ 使用手册★
VBA设置外部DLL库(非系统函数库)和其他文件的相对路径
---------------------------
问题:在使用网友【wodewan】《带带弟弟OCR,纯VBA本地获取网络验证码整体解决方案》VBA时,我们会调用外部的Dll文件,而此DLL文件会随着打包程序的发放,而放在不同的目录。由于Dll文件就放置在执行文件的一个相对路径下,这时在程序内部定义调用Dll文件时,其定义的路径为相对路径。然而很多时候程序并不能识别到定义的Dll文件路径。如何让程序自动识别相对路径,即为本问题所在!
解决:设置指定路径为当前系统目录即可。使用的API函数为SetCurrentDirectoryA
例子:
'下面的例子是,在VBA要执行的代码里,需要调用外部Dll文件"DdddOcr.dll"里的三个函数【Init、Shutdown、Classification】,而外部这个Dll文件放在当前激活文件目录下"\DdddOcr.dll",在执行三个函数前,直接使用SetCurrentDirectoryA设置当前目录即可。
'另外,保存图片文件的目录【相对路径】也存储在当前目录之下
'DdddOcr.dll、DdddOcr-V2.xlsm、网络验证码图片(文件夹),要位于同一个文件内,也就是Excel文件DdddOcr-V2.xlsm所在的路径内
'系统函数无须指定所在路径
看代码:
'注意这是API函数SetCurrentDirectory 的申明
Public Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) As Long
'注意当中相对路径的写法:.(英文句点)+\(斜杠)+DLL链接库全名(含.dll)
Declare PtrSafe Sub Init Lib ".\DdddOcr.dll" ()
Declare PtrSafe Sub Shutdown Lib ".\DdddOcr.dll" Alias "Close" ()
Declare PtrSafe Function Classification Lib ".\DdddOcr.dll" (ByRef aa As Byte) As LongPtr
'--------------------------------
'Sub main函数中要调用保存图片文件的【相对路径】
Sub main()
Dim path As String, i As Long, pathbase As String
'很重要,设置当前激活目录
SetCurrentDirectory (Application.ActiveWorkbook.path)
pathbase = ThisWorkbook.path
'path = ThisWorkbook.path & "\pics\" & i & ".png"
'保存图片的相对目录路径
path = ".\网络验证码图片\网络验证码图片.jpg" '1.png
'Debug.Print (GetStr(path))
'ThisWorkbook.Sheet1.Cells(1, 1) = GetStr(path)
Sheets("Sheet1").Cells(1, 1) = GetStr(path)
End Sub
'--------------------------------
'Function GetStr(path As String)函数中要调用DdddOcr.dll库的Init、Shutdown
'获取识别结果
Function GetStr(path As String)
'很重要,设置当前激活目录
SetCurrentDirectory (Application.ActiveWorkbook.path)
Dim address, str As String, bytearr() As Byte
str = Pic2Base64(path)
bytearr = StrConv(str, vbFromUnicode)
'调用DdddOcr.dll库函数Init
Init
address = Classification(bytearr(0))
GetStr = StringFromPointerA(address)
Shutdown
End Function
致谢:剑客Training
http://blog.163.com/shikang999@1 ... 896201510225924807/ |
|