Function FF_WINMAIN(ByVal hInstance As HINSTANCE) As Long '程序入口函数
'hInstance EXE或DLL的模块句柄,就是在内存中的地址,EXE 通常固定为 &H400000 DLL 一般不固定
'编译为 LIB静态库时,这里是无任何用处
' DLL 例题 ******** 函数无需返回值
' DLL被加载到内存时,不要执行太耗时间的代码,若需要耗时就用多线程。
' AfxMsg "DLL被加载到内存时 "
' EXE 例题 ********
' AfxMsg "EXE刚启动 "
' 如果这个函数返回TRUE(非零),将会结束该软件。如果没有启动窗口,那么此函数过后,也会终止软件。
' 您可以在此函数做程序初始化。
' (这里的EXE、DLL表示自己的,无法获取其它EXE、DLL入口和出口)
Function = False
End Function
Sub FF_WINEND(ByVal hInstance As HINSTANCE) '程序出口,程序终止后的最后代码。
'hInstance EXE或DLL的模块句柄,就是在内存中的地址,EXE 通常固定为 &H400000 DLL 一般不固定
'编译为 LIB静态库时,这里是无任何用处
' DLL 例题 ********
' 卸载DLL,DLL被卸载,需要快速完成,不能用进程锁。
' AfxMsg "DLL被卸载时 "
' EXE 例题 ********
' 程序即将结束,这里是最后要执行的代码,(:无法停止被退出的命运。
' AfxMsg "EXE退出 "
' (这里的EXE、DLL表示自己的,无法获取其它EXE、DLL入口和出口)
End Sub
'*************同文件夹里,有VB工程源码,演示调用FB的DLL方法 **********************
'点击顶部工具栏【齿轮】图标,就编译为DLL 了,
'函数后面加 Export 表示导出函数,那样VB里就可以定义使用了
'导出后,函数名全部自动变大写,且在后面加符号 @0 @4 @8 等,@后面的数字是 1个参数 *4
'=====================关键函数================
'--------------------------------------------------------------------------
Function BStrToString(nBStr As BStr) As String '将VB里的字符串转换为FB里使用的字符串
Dim L As Long =
Peek(Long,Cast(UInteger,nBStr) - 4)
Dim ss As String = String(L,0)
memcpy StrPtr(ss),nBStr,L
Function = ss
End Function
'--------------------------------------------------------------------------
Function StringToBStr(nStr As String) As BStr '将FB里的字符串转换为VB里使用的字符串
Function = SysAllocString( Cast(WString Ptr, StrPtr(nStr) ) ) '伪造 VB 字符串
End Function '--------------------------------------------------------------------------
Function BStrToStringW(nBStr As BStr) As String '将VB里的字符串转换为FB里使用的字符串,用于字符数组
'注意,假如字符串里包含 chr(0) 将会在此被截断
Dim ss As String
If nBStr <> 0 Then
ss = *
CPtr(WString Ptr, nBStr)
End If
Function = ss
End Function
'--------------------------------------------------------------------------
Sub SetBstr(ByRef nBStr As BStr,nStr As String ) ' 修改VB字符串,用于字符数组
'必须是 ByRef ,不然修改不了nBStr,默认是 ByVal
If nBStr
= 0 Then
'无字符
nBStr
= SysAllocString(nStr) '新增字符串
Else
'有字符
SysReAllocString(@nBStr,nStr) '修改字符串
End If
End Sub
'=============================================
'警告!警告!警告! 在工程属性里,必须去掉 支持GDI+(默认选中),不然VB软件和VB的IDE会失去响应。
'--------------------------------------------------------------------------
Function JiaFa(ByVal a As Long ,ByVal b As Long ) As Long Export '参数全是数字例题
'ByVal 由于VB和FB默认表达不同,避免发生不一至的情况,前面的必须加个,和VB那边一样。
Return a
+ b
End Function
'--------------------------------------------------------------------------
Sub Dizi(ByRef a As Long )Export'以地址传来参数
a
= 666
End Sub
'--------------------------------------------------------------------------
Sub LongShuZhu(ByVal a As Long Ptr,ByVal b As Long) EXPORT '处理VB的数组
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组
'只能以指针的方式处理
For i As Long =
0 To b - 1
a[i]
= Rnd * 10000
Next
End Sub '--------------------------------------------------------------------------
Function GetStr() As BStr Export '返回字符例题
'直接将字符返回到VB里,由于VB与FB的字符内存不同,必须用转换
Dim a As String
a = "返dd回dd字dd符dd例dd题dd"
Return StringToBStr(a)
End Function '--------------------------------------------------------------------------
Function LenDuoStr(ByVal a As BStr ,ByVal b As BStr ,ByVal c As BStr ,ByVal d As BStr ) As Long Export '处理VB发来的字符例题
'由于VB与FB的字符内存不同,必须用转换
AfxMsg BStrToString(a)
Return Len(BStrToString(b) & BStrToString(c) & BStrToString(d))
End Function '--------------------------------------------------------------------------
Sub StrShuZhu(ByVal a As BStr Ptr ,ByVal b As Long) Export '处理VB的数组
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组
'只能以指针的方式处理
Dim bb As String
For i As Long =
0 To b - 1
bb
= BStrToStringW(a[i])
If Len(bb) Then AfxMsg bb,"读取字符"
SetBstr a[i],Str(Rnd *
999 )
Next
End Sub
|