Function FF_WINMAIN(ByVal hInstance As HINSTANCE) As Long '程序入口函數(shù)
'hInstance EXE或DLL的模塊句柄,就是在內(nèi)存中的地址,EXE 通常固定為 &H400000 DLL 一般不固定
'編譯為 LIB靜態(tài)庫時,這里是無任何用處
' DLL 例題 ******** 函數(shù)無需返回值
' DLL被加載到內(nèi)存時,不要執(zhí)行太耗時間的代碼,若需要耗時就用多線程。
' AfxMsg "DLL被加載到內(nèi)存時 "
' EXE 例題 ********
' AfxMsg "EXE剛啟動 "
' 如果這個函數(shù)返回TRUE(非零),將會結(jié)束該軟件。如果沒有啟動窗口,那么此函數(shù)過后,也會終止軟件。
' 您可以在此函數(shù)做程序初始化。
' (這里的EXE、DLL表示自己的,無法獲取其它EXE、DLL入口和出口)
Function = False
End Function
Sub FF_WINEND(ByVal hInstance As HINSTANCE) '程序出口,程序終止后的最后代碼。
'hInstance EXE或DLL的模塊句柄,就是在內(nèi)存中的地址,EXE 通常固定為 &H400000 DLL 一般不固定
'編譯為 LIB靜態(tài)庫時,這里是無任何用處
' DLL 例題 ********
' 卸載DLL,DLL被卸載,需要快速完成,不能用進程鎖。
' AfxMsg "DLL被卸載時 "
' EXE 例題 ********
' 程序即將結(jié)束,這里是最后要執(zhí)行的代碼,(:無法停止被退出的命運。
' AfxMsg "EXE退出 "
' (這里的EXE、DLL表示自己的,無法獲取其它EXE、DLL入口和出口)
End Sub
'*************同文件夾里,有VB工程源碼,演示調(diào)用FB的DLL方法 **********************
'點擊頂部工具欄【齒輪】圖標,就編譯為DLL 了,
'函數(shù)后面加 Export 表示導(dǎo)出函數(shù),那樣VB里就可以定義使用了
'導(dǎo)出后,函數(shù)名全部自動變大寫,且在后面加符號 @0 @4 @8 等,@后面的數(shù)字是 1個參數(shù) *4
'=====================關(guān)鍵函數(shù)================
'--------------------------------------------------------------------------
Function BStrToString(nBStr As BStr) As String '將VB里的字符串轉(zhuǎn)換為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里的字符串轉(zhuǎn)換為VB里使用的字符串
Function = SysAllocString( Cast(WString Ptr, StrPtr(nStr) ) ) '偽造 VB 字符串
End Function '--------------------------------------------------------------------------
Function BStrToStringW(nBStr As BStr) As String '將VB里的字符串轉(zhuǎn)換為FB里使用的字符串,用于字符數(shù)組
'注意,假如字符串里包含 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字符串,用于字符數(shù)組
'必須是 ByRef ,不然修改不了nBStr,默認是 ByVal
If nBStr
= 0 Then
'無字符
nBStr
= SysAllocString(nStr) '新增字符串
Else
'有字符
SysReAllocString(@nBStr,nStr) '修改字符串
End If
End Sub
'=============================================
'警告!警告!警告! 在工程屬性里,必須去掉 支持GDI+(默認選中),不然VB軟件和VB的IDE會失去響應(yīng)。
'--------------------------------------------------------------------------
Function JiaFa(ByVal a As Long ,ByVal b As Long ) As Long Export '參數(shù)全是數(shù)字例題
'ByVal 由于VB和FB默認表達不同,避免發(fā)生不一至的情況,前面的必須加個,和VB那邊一樣。
Return a
+ b
End Function
'--------------------------------------------------------------------------
Sub Dizi(ByRef a As Long )Export'以地址傳來參數(shù)
a
= 666
End Sub
'--------------------------------------------------------------------------
Sub LongShuZhu(ByVal a As Long Ptr,ByVal b As Long) EXPORT '處理VB的數(shù)組
'FB 和 VB 之間,處理數(shù)組的方式不同,因此無法直接傳數(shù)組
'只能以指針的方式處理
For i As Long =
0 To b - 1
a[i]
= Rnd * 10000
Next
End Sub '--------------------------------------------------------------------------
Function GetStr() As BStr Export '返回字符例題
'直接將字符返回到VB里,由于VB與FB的字符內(nèi)存不同,必須用轉(zhuǎn)換
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發(fā)來的字符例題
'由于VB與FB的字符內(nèi)存不同,必須用轉(zhuǎn)換
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的數(shù)組
'FB 和 VB 之間,處理數(shù)組的方式不同,因此無法直接傳數(shù)組
'只能以指針的方式處理
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
|