写DLL给VB用,不是什么难题,但我们要做到字符变量,从FreeBasic到VB6,从VB6到FreeBasic,在VB6端无痛使用,那就要费点功夫了。

VB6代码:直接写 String
Private Declare Function GetStr Lib "FBtoVB.dll" Alias "GETSTR@0" () As String '返回字符串

FreeBasic和VB6的字符变量的内存格式是不同的,因此我们要在FreeBasic的地方搞个转换函数。

FB代码:
'=====================关键函数================
'--------------------------------------------------------------------------
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,LFunction = 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 StringIf nBStr <> 0 Thenss = *CPtr(WString Ptr, nBStr)End IfFunction = ss
End Function
'--------------------------------------------------------------------------
Sub SetBstr(ByRef nBStr As BStr,nStr As String ) ' 修改VB字符串,用于字符数组
'必须是 ByRef ,不然修改不了nBStr,默认是 ByValIf nBStr=0 Then '无字符nBStr=SysAllocString(nStr) '新增字符串Else'有字符SysReAllocString(@nBStr,nStr) '修改字符串End If
End Sub

下面是FB里的导出函数代码,测试例题用:

'--------------------------------------------------------------------------
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-1a[i]=Rnd *10000Next
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-1bb=BStrToStringW(a[i])If Len(bb) Then AfxMsg bb,"读取字符"SetBstr a[i],Str(Rnd *999 )Next
End Sub

再来看VB6这边的DLL声明例题:

'==============处理数字变量===================
Private Declare Function JiaFa Lib "FBtoVB.dll" Alias "JIAFA@8" (ByVal a As Long, ByVal b As Long) As Long '数字例题
'Alias 里的全部是大写,不管FB里如何,一律大写
'@8 标准符号,是为了兼容C语言默认带的, 表示有2个参数,无参数是 @0 ,1个参数为 4 ,几个就 几个*4Private Declare Sub Dizi Lib "FBtoVB.dll" Alias "DIZI@4" (ByRef a As Long) '传地址数字
'以地址方式传数字参数给FB,FB那里可以修改参数值了Private Declare Sub LongShuZhu Lib "FBtoVB.dll" Alias "LONGSHUZHU@8" (ByVal 数组地址 As Long, ByVal 数组长度 As Long) '数组例题
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组,数组长度是为了FB那边知道长度,不然超边界了软件会崩溃的。
'其它数字和Long 一样处理,对应FB那边类型名是
'VB类型:Byte  Integer Single Double
'FB类型:UByte Short   Single Double'==============处理字符串变量===================
Private Declare Function GetStr Lib "FBtoVB.dll" Alias "GETSTR@0" () As String '返回字符串
'从FB里传来的字符,VB这边直接使用,无障碍。
Private Declare Function LenDuoStr Lib "FBtoVB.dll" Alias "LENDUOSTR@16" (ByVal a As String, ByVal b As String, ByVal c As String, ByVal d As String) As Long '传字符串给FB
'传VB的字符到FB那边使用。注意,FB那边中文算2个,英文算1个。
Private Declare Sub StrShuZhu Lib "FBtoVB.dll" Alias "STRSHUZHU@8" (ByVal 数组地址 As Long, ByVal 数组长度 As Long) '数组例题
'FB 和 VB 之间,处理数组的方式不同,因此无法直接传数组,数组长度是为了FB那边知道长度,不然超边界了软件会崩溃的。
'

还增加了数组的操作方法,下面是VB6调用DLL例题

Private Sub Form_Load()ChDrive App.Path '必须先设置软件文件夹,否则,万一不在EXE文件夹开启软件,会发生找不到DLL文件的错误ChDir App.PathEnd Sub
Private Sub Command4_Click()Dim a As Longa = 100Dizi aDebug.Print a
End SubPrivate Sub Command5_Click()Dim a(10) As Long, i As LongLongShuZhu VarPtr(a(0)), UBound(a) + 1For i = 0 To 10Debug.Print a(i),Next
Debug.PrintEnd SubPrivate Sub Command6_Click()Dim a(10) As String, i As Longa(0) = "dd"a(2) = ""StrShuZhu VarPtr(a(0)), UBound(a) + 1For i = 0 To 10Debug.Print a(i),Next
Debug.Print
End SubPrivate Sub Command1_Click()Label1 = JiaFa(10, 20)
End Sub
Private Sub Command2_Click()Dim b As Stringb = GetStrLabel1 = bDebug.Print b, Len(b)End Sub
Private Sub Command3_Click()Dim a As Stringa = "w我o"Label1 = LenDuoStr(a, "p单位c", "", "ddd")
End Sub

勇芳编程群里,有搞好的工程源码,感兴趣的,请进群下载。

FreeBasic写DLL给VB6调用(直接用API创建和修改VB字符串方法)相关推荐

  1. 如何直接用maven创建java项目,不用eclipse,不用idea,不用任何ide

    不用eclipse,不用idea,不用任何ide,如何直接用maven创建java项目 写作背景 maven简介 安装maven 配置镜像与本地仓库 更改镜像下载地址 更改本地仓库 配置环境变量 建立 ...

  2. 调用接口登录禅道_调用禅道api创建新用户

    调用禅道api创建新用户 使用禅道API是一件非常麻烦的事,因为它没有详细的API文档. 官方在网站内嵌的API文档极其简略,根本不知道需要传递什么参数. 如何知道该如何使用它提供的API呢? 你必须 ...

  3. 易语言和java接口_易语言写接口让其他调用 易语言api使用教程

    易语言如何调用API函数? 你代码方法错了,如果传出参数为文本或字节集必须先"申请内存缓冲",如图1 源码中有两种方法,建议你采用"长整数"的那个,比较方便~! ...

  4. python文件之间的相互调用_用Python创建功能模块——截取字符串模块

    用Python创建模块 本篇文章小编给大家分享在Python如何创建属于自己的模块,实现更多的功能! 一.模块 模块是什么?简单来说,当程序的功能很多.代码量很大时,我们可以编写一个实现一定功能的py ...

  5. 快速实现 分页器(超简单) 可以直接用

    1.如果想直接,用请直接滑到最后(方便省事,有详细用法) 2. 如果想自己了解,下面有详细注释 下面是效果图: 1.首先创建一个组件定义为全局(结构已写好,可直接cv大法) <div class ...

  6. python有道api-python 调用有道api接口的方法

    初学python ,研究了几天,写了一个python 调用 有道api接口程序 效果看下图: 申明:代码仅供和我一样的初学者学习交流 申请很简单的 ps:审核不用花时间的,请勿滥用!! #-*- co ...

  7. SQL恢复XP_CMDSHLL 以及XPLOG70.DLL被删 直接用SQL连接器开启3389

    SQL恢复XP_CMDSHLL 以及XPLOG70.DLL被删 直接用SQL连接器开启3389 用SQL连接器恢复XP_CMDSHLLE的命令 (1)SQL Query Analyzer sp_add ...

  8. VB6 调用 Nim 生成的 DLL

    2019独角兽企业重金招聘Python工程师标准>>> 关于 Nim Nim 是德国人 开发的编程语言,最初叫 Nimrod.Nim 有下面几个特点: 强制缩进语法 AST 操控 编 ...

  9. 用IKVMC将jar转成dll供c#调用

    目录 前言 ikvmc介绍 ikvmc下载安装 下载并解压 设置环境变量 jar->dll 常用参数说明 具体操作 解决方案 前言 实习到现在所需要的工具类给的都是jar包,但是我需要在.net ...

最新文章

  1. list循环添加数据_List 去除重复数据的 5 种正确姿势!你知道几种?
  2. 关于类中的引用、常量、静态常量的初始化
  3. mysql in 原理_深入理解MySql子查询IN的执行和优化
  4. 【转】无服务计算(Serverless Computing)核心知识
  5. 今天来总结一下CSS中有哪些定位
  6. ZED2+ORB_SLAM3+视觉惯性轨迹保存
  7. 485.最大连续1的个数
  8. 微博认证:黄v怎么认证?(认证技巧分享)
  9. 人工智能产生式系统动物识别实验python
  10. MRI_Made_Easy 磁共振成像原理-物理基础5
  11. 百旺最新服务器地址,百旺金赋安装与使用教程
  12. python是爬虫的意思吗_python跟爬虫的区别
  13. openwrt反攻局域网arp攻击shell脚本
  14. python _foo __foo
  15. 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛 G 旋转矩阵(模拟)
  16. time datetime 总结
  17. 对贴片陶瓷电容材料的区分
  18. mysql 时间函数的使用
  19. 用C语言读取.txt文本,并保存在二维数组中
  20. 致我终将逝去的青春——毕业后的我

热门文章

  1. PyQt(Python+Qt)学习随笔:Designer中属性设置界面的属性字体使用粗黑体的含义
  2. 2021-07-15莫得感情的流水账日记之Day2
  3. Mysql数据库(十)| 合计/统计函数count
  4. NRF2401 ,NRF905 ,CC1100无线应用开发文档
  5. ENScanGo主域名批量提取脚本
  6. 人脑改造成超级计算机,让超级计算机变成“大脑”
  7. 安装Ubuntu15.10和编译RT补丁
  8. C# 泛型约束 new() 的底层细节和性能
  9. 一根网线同时搭载电信itv及网络 解决方案
  10. item_search - 虾皮根据关键词取商品列表