VisualFreeBasic指南_DLL声明和生成

2026-1-20 / 0 评论 / 82 阅读

调用其它DLL

  1. 先复制DLL到软件的输出文件夹
  2. 静态调用:声明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模式,因此必须套上。

  3. 动态调用DLL:直接上代码
    1)加载DLL
     Dim As Any Ptr library = DyLibLoad( "DLL文件名" )  '就文件名,不能带 .DLL 
      If ( library = 0 ) Then
          AfxMsg "加载DLL失败"
          Return 1
      End If

    2)声明函数  

    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 If

    3)使用,和使用本地函数和静态方法一样,无区别

    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 来返回变量即可。

评论一下?

OωO
取消