调用其它DLL
- 先复制DLL到软件的输出文件夹
- 静态调用:声明DLL
Declare Function 函数名 Lib "dll文件" Alias "DLL中的函数名"(ByVal eID As Integer ) As Integer一般在 特殊函数的 程序起始模块 中声明(为了不出问题,强力要求在起始模块里声明DLL)
"dll文件" 文件名,但不可以包含 “.dll” ,就纯名字,不包含扩展名
以上适合带符合输出的DLL使用,VFB默认都是带符合号的,"DLL中的函数名@4" 全部是大写。@4 是和参数有关,1个参数是@4 ,2个是@8 等。
VFB 调用VFB写的DLL,不需要加符合(@4),可以省,其它编程就必须要加符合了。如果是其它按照标准C写的DLL,需要加层说明。Extern "C" Declare Function 函数名 Lib "dll文件" Alias "DLL中的函数名"(ByVal eID As Integer ) As Integer End Extern套了层 C 模式,函数名要区分大小写,不带 @4 等符号,绝大多数DLL都是C模式,因此必须套上。
- 动态调用DLL:直接上代码
1)加载DLLDim As Any Ptr library = DyLibLoad( "DLL文件名" ) '就文件名,不能带 .DLL If ( library = 0 ) Then AfxMsg "加载DLL失败" Return 1 End If2)声明函数
Dim AddNumbers As Function( ByVal As Integer, ByVal As Integer ) As Integer AddNumbers = DyLibSymbol( library, "ADD2" ) ' 特别提醒,必须全部大写 '从DLL查看器里可以看到全称是 ADD2@8 ,而FB用FB的DLL可以省略 @8 的符号 If ( AddNumbers = 0 ) Then AfxMsg "无法在DLL中检索Add2函数的地址" Return 1 End If3)使用,和使用本地函数和静态方法一样,无区别
a= AddNumbers (b,c)4)完成后卸载
DyLibFree( library ) '卸载DLL ,特别注意,假如DLL还在工作,卸载会让软件崩溃
生成DLL
自己写DLL,若想要输出函数,在函数名后面加 Export 即可,如:
Function aaa(ByVal b As Long) As long Export
此时输出会带符号,其它软件声明时,需要加符号 如:
Declare Function 函数名 Lib "dll文件" Alias "AAA\@4 "(ByVal b As Long ) As Long
函数名全部变大写。当然我们也可以生成标准C 的DLL
Extern "C" '注意:此代码必须在 特殊函数的 程序起始模块中 ,其它普通的可以在任意地方
Function aaa(ByVal b As Long) As long Export
......
End Function
End Extern
其它软件声明就按照C声明即可。标准C,函数名区分大小写。(VFB 默认会全部变大写)
减少生成DLL文件大小的方法:
假如不用GDI+,工程属性里取消 GDI+ \
在特殊函数的 程序起始模块中注销不使用的引用:如 #include Once "afx/CWindow.inc" 等
(注意:注销后编译出错,就恢复,编译正常表示没用到,就可以省一点点大小。)
DLL返回String问题:
DLL中有个函数返回String,EXE调用这个DLL函数就会发生内存泄漏问题BUG(DLL和EXE必须是FB写的,其它编程语言在任何情况下都不可以使用返回字符或字符作为参数)
例:DLL中代码 --------------------
Function Myaaa1() As String Export '
Dim As String ss
ss="ferdddd"
Function = ss
End Function
EXE中代码 ----------------
Declare Function Myaaa1 Lib "FunSupLib" Alias "MYAAA1"() As String
Dim i As Long ,ss As String
For i=0 To 100000
ss = Myaaa1()
Next
用多次循环,就能直接在进程管理器发现此时EXE的内存占用变大。
解决方法代码:DLL -------------------
Function Myaaa1() ByRef As String Export '
Static As String ss
ss="ferdddd"
Function = ss
End Function
EXE代码 --------------
Declare Function Myaaa1 Lib "FunSupLib" Alias "MYAAA1"() ByRef As String
就是加个 ByRef 定义和 DLL中使用 Static 来返回变量即可。
评论一下?