- UID
- 3260
- 精华
- 积分
- 648
- 威望
- 点
- 宅币
- 个
- 贡献
- 次
- 宅之契约
- 份
- 最后登录
- 1970-1-1
- 在线时间
- 小时
|
此处为VisualFreeBasic编程教程(从零开始学或VB进阶)的子章节部分,全部目录点链接。
写DLL
点编译DLL,就可以,产生出了DLL,DLL是写好的模块给别的软件调用你DLL里的函数。
被EXE加载与卸载
- Function FF_WINMAIN( ByVal hInstance As HINSTANCE, _
- ByVal hPrevInstance As HINSTANCE, _
- ByRef lpCmdLine As String, _
- ByVal iCmdShow As Long ) As Long
- 'hInstance 当前DLL模块句柄 iCmdShow DLL状态通知,就2个 其它参数为空。
- Select Case iCmdShow 'fdwReason
- Case DLL_PROCESS_ATTACH '加载DLL,DLL被加载到内存时,可以做任意事,包括耗时间等
- AfxMsg "DLL被加载到内存时"
- Case DLL_PROCESS_DETACH '卸载DLL,DLL被卸载或软件退出时,需要快速完成,不能用进程锁。
- AfxMsg "DLL被卸载时"
- End Select
-
- End Function
复制代码
此函数,在VFB工程【资源】里的【特殊函数】里,并不是你自己写的函数。
这是DLL起始函数。
'函数后面加 Export 就表示导出此函数,其它软件才可以调用- '--------------------------------------------------------------------------
- Public Function Add2( ByVal x As Integer, ByVal y As Integer ) As Integer Export
- '函数后面加 Export 就表示导出此函数,其它软件才可以调用
- '然后 编译为DLL
-
- Return( x + y )
- End Function
- '--------------------------------------------------------------------------
- Public Function ok( aa As String ) As String Export
- '函数后面加 Export 就表示导出此函数,其它软件才可以调用
- '然后 编译为DLL
-
- Function=aa
- End Function
复制代码 FB 生成的DLL,函数名后面带符号,其它语言调用,需要用 DLL查看器看函数输出名,
要是给 FB调用,同时吧 【???.dll.a】文件复制过去,就不管符号了。生成的EXE后,就不需要带【???.dll.a】 文件
DLL 里函数名称,全部变成大写,且带符号,如: ADD2@8
静态调用DLL
先声明DLL,需要在 【资源】里的【特殊函数】 FF_AppStart 模块里- Declare Function Add2 Lib "开发DLL例题.dll" ( ByVal x As Integer, ByVal y As Integer ) As Integer
- 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里的函数了- FF_Control_SetText HWND_FORM1_TEXT1 ,Str( Add2 (100,Rnd*100))
- AfxMsg ok("ddddd")
复制代码 动态调用DLL- Dim As Any Ptr library = DyLibLoad( "开发DLL例题" ) '就文件名,不能带 .DLL
- If ( library = 0 ) Then
- AfxMsg "加载DLL失败"
- Return 1
- End If
- 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
-
- FF_Control_SetText HWND_FORM1_TEXT2 ,Str( AddNumbers (100,Rnd*100))
-
- AfxMsg "使用完成"
- DyLibFree( library ) '卸载DLL ,特别注意,假如DLL还在工作,卸载会让软件崩溃
- '本例题里,加载会弹窗提示,就是在工作,必须先关弹窗在卸载
复制代码
|
|