找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 2315|回复: 1

【VFB】DLL(VFB教程2-8)

[复制链接]
发表于 2018-2-26 22:20:56 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有账号?立即注册→加入我们

×
此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。
写DLL
1518778650699883.jpg
点编译DLL,就可以,产生出了DLL,DLL是写好的模块给别的软件调用你DLL里的函数。
被EXE加载与卸载

  1. Function FF_WINMAIN( ByVal hInstance     As HINSTANCE, _
  2.                      ByVal hPrevInstance As HINSTANCE, _
  3.                      ByRef lpCmdLine     As String, _  
  4.                      ByVal iCmdShow      As Long ) As Long
  5.    'hInstance 当前DLL模块句柄  iCmdShow DLL状态通知,就2个  其它参数为空。
  6.   Select Case iCmdShow 'fdwReason
  7.     Case DLL_PROCESS_ATTACH '加载DLL,DLL被加载到内存时,可以做任意事,包括耗时间等
  8.         AfxMsg "DLL被加载到内存时"
  9.     Case DLL_PROCESS_DETACH '卸载DLL,DLL被卸载或软件退出时,需要快速完成,不能用进程锁。
  10.          AfxMsg "DLL被卸载时"
  11.   End Select

  12. End Function
复制代码

此函数,在VFB工程【资源】里的【特殊函数】里,并不是你自己写的函数。

这是DLL起始函数。
'函数后面加 Export 就表示导出此函数,其它软件才可以调用
  1. '--------------------------------------------------------------------------
  2. Public Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer Export
  3. '函数后面加 Export 就表示导出此函数,其它软件才可以调用
  4. '然后 编译为DLL

  5.   Return( x + y )
  6. End Function
  7.   '--------------------------------------------------------------------------
  8. Public Function ok( aa As String  ) As  String Export
  9. '函数后面加 Export 就表示导出此函数,其它软件才可以调用
  10. '然后 编译为DLL

  11.   Function=aa
  12. End Function
复制代码
FB 生成的DLL,函数名后面带符号,其它语言调用,需要用 DLL查看器看函数输出名,
要是给 FB调用,同时吧  【???.dll.a】文件复制过去,就不管符号了。生成的EXE后,就不需要带【???.dll.a】 文件
DLL 里函数名称,全部变成大写,且带符号,如: ADD2@8


静态调用DLL
先声明DLL,需要在 【资源】里的【特殊函数】 FF_AppStart 模块里
  1. Declare Function Add2 Lib "开发DLL例题.dll" ( ByVal x As Integer, ByVal y As Integer ) As  Integer
  2. Declare Function ok Lib "开发DLL例题.dll" ( aa As String  ) As  String
复制代码
是FB编译的DLL,必须把【 lib开发DLL例题.dll.a 】文件一起和 DLL 文件 复制来用,不然不可以编译
生成EXE后,此文件不需要带。
其它软件,比如 C 生成的DLL,必须先把DLL复制到软件输出文件夹中,才可以

Declare Function 函数名 Lib "dll文件" Alias "DLL中的函数名"(ByVal eID As Integer  ) As  Integer
声明后,就像是自己的函数使用DLL里的函数了
  1. FF_Control_SetText  HWND_FORM1_TEXT1 ,Str(  Add2 (100,Rnd*100))
  2. AfxMsg ok("ddddd")
复制代码

动态调用DLL
  1.   Dim As Any Ptr library = DyLibLoad( "开发DLL例题" ) '就文件名,不能带 .DLL
  2.   If ( library = 0 ) Then
  3.       AfxMsg "加载DLL失败"
  4.       Return 1
  5.   End If
  6.   Dim AddNumbers As Function( ByVal As Integer, ByVal As Integer ) As Integer
  7.   AddNumbers = DyLibSymbol( library, "ADD2" )  ' 特别提醒,必须全部大写
  8.   '从DLL查看器里可以看到全称是 ADD2@8 ,而FB用FB的DLL可以省略  @8 的符号
  9.   
  10.   If ( AddNumbers = 0 ) Then
  11.       AfxMsg "无法从开发DLL例题库中检索Add2()函数的地址"
  12.       Return 1
  13.   End If

  14.   FF_Control_SetText  HWND_FORM1_TEXT2 ,Str(  AddNumbers (100,Rnd*100))
  15.   
  16.   AfxMsg "使用完成"
  17.   DyLibFree( library )  '卸载DLL ,特别注意,假如DLL还在工作,卸载会让软件崩溃
  18.   '本例题里,加载会弹窗提示,就是在工作,必须先关弹窗在卸载
复制代码


回复

使用道具 举报

发表于 2022-5-17 10:38:57 | 显示全部楼层

楼主大能,感谢感谢
回复 赞! 靠!

使用道具 举报

本版积分规则

QQ|Archiver|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图

GMT+8, 2024-12-26 12:15 , Processed in 0.036408 second(s), 28 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表