分享

VFB写DLL给VB调用

 nxhujiee 2020-07-09
Function FF_WINMAIN(ByVal hInstance As HINSTANCEAs 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 BStrAs String  '将VB里的字符串转换为FB里使用的字符串
    
Dim 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 StringAs BStr  '将FB里的字符串转换为VB里使用的字符串
  
Function SysAllocStringCast(WString Ptr, StrPtr(nStr'伪造 VB 字符串
End Function
'--------------------------------------------------------------------------
Function BStrToStringW(nBStr As BStrAs String  '将VB里的字符串转换为FB里使用的字符串,用于字符数组
  '注意,假如字符串里包含 chr(0) 将会在此被截断
  
Dim ss As String
  If 
nBStr <> 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 =Then 
        
'无字符
        
nBStr = SysAllocString(nStr'新增字符串
    
Else
        
'有字符
        
SysReAllocString(@nBStr,nStr'修改字符串
    
End If    
End Sub        
'=============================================
'警告!警告!警告! 在工程属性里,必须去掉 支持GDI+(默认选中),不然VB软件和VB的IDE会失去响应。
'--------------------------------------------------------------------------
Function JiaFa(ByVal As Long ,ByVal As Long As Long Export  '参数全是数字例题
'ByVal 由于VB和FB默认表达不同,避免发生不一至的情况,前面的必须加个,和VB那边一样。
  
Return a + b
End Function
'--------------------------------------------------------------------------
Sub Dizi(ByRef As Long )Export'以地址传来参数
    
a = 666
End Sub
'--------------------------------------------------------------------------
Sub LongShuZhu(ByVal As Long Ptr,ByVal As Long) EXPORT '处理VB的数组
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组
'只能以指针的方式处理
  
For As Long =To b - 1
    a[i] = Rnd * 10000
  Next
End Sub
'--------------------------------------------------------------------------
Function GetStr() As BStr Export  '返回字符例题
'直接将字符返回到VB里,由于VB与FB的字符内存不同,必须用转换
  
Dim As String 
  
a = "返dd回dd字dd符dd例dd题dd"
  Return StringToBStr(a)
End Function
'--------------------------------------------------------------------------
Function LenDuoStr(ByVal As BStr ,ByVal As BStr ,ByVal As BStr ,ByVal As BStr As Long Export  '处理VB发来的字符例题
'由于VB与FB的字符内存不同,必须用转换
  
AfxMsg BStrToString(a)
  
Return Len(BStrToString(bBStrToString(cBStrToString(d))
End Function
'--------------------------------------------------------------------------
Sub StrShuZhu(ByVal As BStr Ptr ,ByVal As Long) Export '处理VB的数组
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组
'只能以指针的方式处理
 
Dim bb As String 
  For 
As Long =To b - 1
    bb = BStrToStringW(a[i])
    
If Len(bbThen AfxMsg bb,"读取字符"
    SetBstr a[i],Str(Rnd * 999 )
  
Next
End Sub 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多