在VB和DLL间传递字符串

FreeBasic写DLL给VB6调用(直接用API创建和修改VB字符串方法) 写DLL给VB用,不是什么难题,但我们要做到字符变量,从FreeBasic到VB6,从VB6到FreeBasic,在VB6端无痛使用,那就要费点功夫了。VB6代码:直接写 String Private Declare Function GetStr Lib "FBtoVB.dll" Alias "GETSTR@0" () As String '返回字符串FreeBasic和VB6的字符变量的内存格... 阅读详情

        用VB调用VC编写的DLL时,必须注意参数的匹配。VC中的变量,都是采用的32位,而VB中的,很多是16位,这就要进行相应的转化。转化的法则很多地方都有。我这里建议大家尽量使用VB,VC中都有,而且一致的变量。比如long型和double型。如果可能,尽量采用这些简单的变量类型。可以省缺很多麻烦。

要注意,传递变量值,在VB声明函数是,变量前加ByVal限定字,如果传递指针,要加ByRef限定字。默认为ByRef。

 

VB和DLL之间传递字符串的情况:

1。从VB传入字符串到DLL

比如下面的函数FuncA,传入字符串到DLL中,在VB中注意要用ByVal声明变量。声明为String型。

Public Declare Function  FuncA Lib "***.dll" (ByVal strS As String) As Boolean

在DLL中,

Bool WINAPI FuncA(LPSTR strS)
{
// 在这里可以直接使用strS
 return TRUE;
}

2。从DLL中传出字符串到VB

VB中的声明:

Public Declare Function FuncB Lib "***.dll" (ByVal strS As String) As Boolean
是不是和上面的声明一样,呵呵,没写错,就是一样的。

在DLL中,

Bool WINAPI FuncB(LPSTR strS)
{

*****
// 在程序的最后,可以返回strS。
 return TRUE;
}

在这里要注意的是,在VB中要先对strS进行初始化。给strS分配大小。例如,strS = Space$(260) ,这条语句,给strS分配了260个字符的大小。在DLL的函数中,要注意返回的strS的大小,不能超过这个限定。最好能做个判断。比较麻烦,但也没办法,申请个大点的空间吧。

还有一点要注意的是,在DLL中的FuncB中,千万不要对strS进行可能产生地址变更的操作!否则,strS的值不能返回到VB中。最好是在FuncB中使用临时的变量进行操作,程序的最后,把临时变量的值拷贝到strS中去。这样保险,以免出错。

BOOL WINAPI FuncB(  LPSTR   strS)
{
 LPSTR temp;
 在这里,对temp变量进行操作,程序的最好,把temp的值拷贝给strS;
 strcpy(strS, temp);
 return TRUE;
}
具体原因,是因为VB传递给DLL,实际上是strS这个变量的地址,(因为前面用的是ByVal限定词)也就是说是strS的指针。而使用前先分配大小,实际上是初始化指针,否则,是空指针,不能使用。在DLL函数中,如果出现了变更指针地址的操作,比如OLE2A,指针的赋值,指针的清空等等,都会引起strS地址的变更。这样,strS的值当然不可能传回VB中。

在VB中调用FuncB后,取得的是字符串后面会有一些空字符。比如,你申请了260个字符空间,结果,返回的字符串是“hello“,只有5个字符。那剩下的字符空间,都是空字符。可以使用下面的语句,去掉后面的空字符,只保留”hello“

str = left(strS, InStr(strS, Chr(0)) - 1)

总之,在VB和DLL之间传递数据,要尽量小心,尽量用简单类型。传递字符串时,在最开始,最后使用传递的字符串。中间过程建议采用临时变量替代。

 
VB调用c++写的Dll的一点总结 最近,写了一个VB应用程序,这个APP主要是用来演示三个C++写的视频处理动态链接库的使用方式。第一次写VB的代码,确实遇到了很多问题,现在回想一下,真的是很多东西走了或多或少的弯路,现在把这些东西总结并记录下来,期望以后写兼容VB的动态库,可以注意接口的定义,并不是所有的接口定义方式,都方便VB使用,再者,就是在VB中使用的一些知识积累。C++写的DLL接口定义需注意的事项1.      阅读详情

相关推荐

C#调用vb dll 参数传递--数组、整型等(c#调用com)

本例子中实现在c#中调用由vb生成的dll文件(com调用)例子由两个主要步骤组成:一 为在vb中生成有参数和返回值的dll ;二 是在c#中引入步骤一中生成的dll,然后生成实例调用步骤一:首先在vb中新建一个ActiveX DLL 工程,然后在类模块文件中填入以下代码'********************基础类型的测试*******************Public Function fncStrTest(ByVal str As String) As StringfncStrTest = str

xieguoxian的专栏 2633

VB6.0调用DLL

目 录 第1章 VB6.0调用DLL    1 1 VC++编写DLL    1 1.1 使用__stdcall    1 1.2 使用 .DEF 文件    1 2 简单数据类型    2 2.1 传值(ByVal)    2 2.2 传址(ByRef)    3 2.3 传址(VarPtr)    4 2.4

Hanford的专栏 1万+

VB等语言与C++DLL的通讯

VB等语言调用C++DLL        DLL(dynamic-link library)是一个包含一个或多个被编译、链接的函数/模块的文件, 并和调用它的进程分开存储。当使用者进程启动或运行时,操作系统负责把DLL映射到调用者进程的内存地址空间里。采用DLL技术,可以提高软件模块的重用性(DLL调用者可以不太关心该DLL是用何种语言写的)并起到保护源代码的目的,同时又能减少最终

subtop的专栏 1681

vb6传递数组给VC++

虽然VB已经很老了,但是做一些小软件还是非常方便的,下面就来介绍如何将VC程序实现的crc校验程序编译成dll库,接下来介绍如何使用VB来来用,使用时注意参数要对应,特别是特别是数组传递要对应起来。前两个可以通过VC的sourcefile和headfile自动添加文件后缀,而crc16_ccitt.def文件建立的时候选择新建文本文件,然后将后缀写成.edf就行了。crc16_ccitt,cpp文件的内容为如下所示,这是一个完整的CPP程序,除了没有main函数入口。上面只声明了一个函数cal_crc。

623

VB调用VC++ DLL实现字符串拼接实战项目

在现代软件开发中,跨语言混合编程已成为提升系统灵活性、复用核心模块、优化性能的重要策略。Visual Basic(VB)以其快速开发能力和友好的界面设计深受企业级应用开发者喜爱;而Visual C++(VC++)则凭借其对底层硬件的高效控制和出色的执行性能,广泛应用于系统级开发和高性能计算领域。将VB与VC++结合使用,可以充分发挥两者优势:通过VB构建用户交互界面,再调用由VC++编写的高性能DLL模块,实现功能与效率的统一。这种混合编程模式常用于图像处理、通信协议、算法加速等场景。

weixin_35935514的博客 1036

VC写的DLL给VB用,传送字符串

VB和VC写的DLL之间传达室送字符串。调试通过的源代码。网上的代码和文档都是用整型add(a,b)做例子。自己试试就知道传送string还会有那么多问题。耗了我不少时间!希望能节省你的时间!

vb与c语言数组传递,在VB中调用C/C++语言编写的dll,数组参数的传递

动态链接库(dll)的好处就不多说了,这里就把如何在VB中调用VC写的dll函数的方法介绍一下,供有需要的朋友们参考,同时也免得自己以后忘了。初次接触DLL的用户经常会遇到一个问题:在VC环境下创建的DLL,在VC里运行的好好的,可在VB应用程序中调用时却老是出现"调用约定错误"、"找不到入口点"之类的错误。这主要是由以下疏漏造成的。首先,要注意DLL中的函数和VB中的函数声明在名称、返回类型、参...

weixin_31316383的博客 1168

C++调用vb6.0制作的Activex DLL

vs2008 环境下C++代码调用vb6.0生成的Activex dll。

VB如何调用DLL

       Windows动态连接库是包含数据和函数的模块,可以被其它可执行文件(EXE、DLL、OCX 等)调用。动态连接库包含两种函数:输出(exported)函数和内部(internal)函数。输出函数可以被其它模块调用,而内部函数则只能在动态连接库内部使用。尽管动态连接库也能输出 数据,但实际上它的数据通常是只在内部使用的。使用动态连接库的优点是显而易见的。将应用程序的一部分功能提取出来

chenkangli的专栏 3万+

Android存储空间不足下,APP出现奔溃等情况

版权声明:本文为博主原创文章,未经博主允许不得转载。 1. 问题起因     实时录制视频,使用getExternalCacheDir()函数返回的路径作为文件缓存区 2. 问题产生     系统在空间不足的情况下第一清除getExternalCacheDir和getCache文件下的缓存,导致正在录制的视频出现Error。 3. 解决方案     第一

OverseasAndroid的博客 4160

基于YOLOv5的隧道衬砌缺陷智能检测系统

计算机视觉在工程检测领域正发挥越来越重要的作用,特别是目标检测技术通过深度学习算法实现了对复杂场景的智能分析。YOLOv5作为当前主流的目标检测框架,通过改进网络结构和训练策略,可以显著提升检测精度和效率。在隧道工程领域,结合通道注意力机制和多尺度特征融合技术,能够有效解决衬砌缺陷识别中的小目标检测难题。这种AI检测系统相比传统人工判读地质雷达图像,不仅将效率提升20倍,还能将识别准确率提高到92.3%,特别适用于3cm以上结构缺陷的自动化检测。系统通过深度可分离卷积等优化,实现了模型轻量化,便于在边缘计算

weixin_29064103的博客 326

vb的string c语言的,从VC++ 编辑的DLL过程(或函数)向VB 传递字符串的方法(简单实用版)...

1.MSDN中的介绍:1.1将字符串传递到DLL过程通常,字符串应该使用ByVal方式传递到APIs。VisualBasic使用被称为BSTR的String数据类型,它是由自动化(以前被称为OLE自动化)定义的数据类型。一个BSTR由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的null值。BSTR是以指针的形式进行传递的,因而DLL...

weixin_39869693的博客 508

ICG setup timing violation介绍?

门控时钟(clock gating)在RTL级电路设计过程中进行低功耗优化常用方法,能够有效降低动态功耗(翻转功耗)。Clock gating cell 可以由与门,与非门,或门或者或非门构成,但很容易产生Glitch。在实际使用中,一般用ICG(集成门控时钟单元)来完成clock gating。 下图展示了glitch的产生原因 在CTS时钟树综合的时候,ICG不会被看作sink,通常放置在source点附近,因此就会出现如上图这种结果。上图可以看出,在分析DFF到ICG的setup timing

m0_61003348的博客 9809

VB中如何传递指针给DLL

 VB默认的传递方式就是传指针(ByRef,也就是把变量的地址传递给所调用的函数)。如果要传值(也就是把变量的值传递给所调用的函数)反要在参数声明前加ByVal。所以如果你传递的参数是普通的数据类型,在参数前什么都不要加就行了。如C语言声明为:     void __stdcall MyProc(short * nPara);     则VB声明为:     Declare Function My

njstalk的专栏 4228

App inventor2通过蓝牙控制Arduino Uno LED开关

App inventer2控制Arduino Uno LED开关 如果学会这个小程序,大部分的手机通过蓝牙控制Arduino的功能都可以实现,这个小示例是通过蓝牙模块向Arduino发送"0"和"1",而其它功能要发送其它不同的字符串内容给Arduino. 所需硬件: Arduino Uno JDY-16 蓝牙模块(我的是蓝牙4.2版本) 草帽LED(可选) 手机(我用的是安卓,苹果手机应该也可以,最近其应用商店也有App inventor(AI)伴侣) 软件: Aduino IDE或者Platfom

Firmin123456的博客 5499

3D Slicer:从入门到精通——数据模块之DICOM

该模块允许导入、导出和网络传输DICOM数据。Slicer支持DICOM功能的常用子集,其特定功能由临床研究的需求驱动:从磁盘读取和写入数据集,并通过DIMSE和DICOMweb网络协议进行网络传输——查询检索发送和接收数据集。医学数字成像和通信(DICOM)是信息交换数字放射学的广泛使用标准。在大多数情况下,医院使用的成像设备(CT和MR扫描仪)将生成保存为DICOM对象的图像。DICOM按以下层次结构组织数据患者… 可以有1个或多个研究(单次成像检查) … 可以有1个或多个系列。

walt3433的博客 6064

VB调用vc写的dll的某个方法时的问题

第一,鉴于VB的速度和在位操作方面的不足,我用VC来编写一个DLL来实现一些功能。输出的函数YUYVtoRGB24 是没有返回值的。故在vb下声明用sub实现。如下,Public Declare Sub YUYVtoRGB24 Lib "ColorSpaceConverter.dll" (ByVal width As Long, ByVal height As Long, ByRef src

Amy0428的专栏 2647

Python 映射函数map()详解

Python 映射函数map()详解

分享我的点点滴滴,在成长路上与你同行! 2139

dll 是c语言的 vb,VB中的String类型调用VC的DLL

EXTERN_C BSTR WINAPI RetStr(LPCTSTR str){return SysAllocString((BSTR)str);}VB中Private Declare Function RetStr Lib "D:\learn\VB\fangda\MFCDIB.dll" (ByVal sendAs String) As StringDim result As StringDim...

weixin_42511080的博客 289

RK平台内核“大瘦身”:从4GB到500MB的蜕变之旅

摘要:本文详细介绍了RK平台内核裁剪的完整流程与技术要点。通过对RK3568/RK3588等SoC平台的分析,探讨了从初始4GB内核精简至500MB的具体方法。文章系统阐述了前期硬件环境搭建、软件工具准备、SDK源码获取等准备工作,深入解析了内核模块组成及可裁剪部分,并提供了图形化配置界面的详细操作指南。同时,对编译烧录过程和常见问题解决方案进行了说明,强调了备份和谨慎选择裁剪项的重要性。最后展望了内核裁剪技术在物联网和边缘计算等领域的应用前景,为开发者提供了实用的内核优化参考方案。(148字)

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 443

静态时序分析(STA)—— 标准单元库

目录 1、时序库 概览 2、时序模型 1、基本概念 2、影响因素 3、线性延时模型 4、非线性延时模型 5、单元时序弧 1、组合逻辑单元 2、时序逻辑单元 6、线负载模型 参考说明 上一篇,学习了 STA相关的基本概念,本篇继续学习 STA相关的 标准单元库。 1、时序库 概览 库文件概览: 2、时序模型 1、基本概念 2、影响因素 对于组合逻辑的时序弧而言,其延时的大小取决于: 1、输出负载,即,输出端的电容负载的大小。容性负载越大,...

记录所学,分享知识,结识挚友 2853

VB与VC通信初探(二)

      在通过DLL实现VB与VC的过程中,一般的简单的通信过程很容易建立。在《VB与VC通信初探(一)》中,我已经把基本的通信过程给描述了一下,但是,有些时候,事件的发展并不总是一帆风顺的,当我们以为可以轻松的实现VB与VC的通信的时候,就经常发生这样的情况,还是先看看例子再说。 VC中的程序:extern "C" _declspec(dllexport)  bool 

eliner's blog 1760

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

VB调用VC dll的返回方式

第一种类型:数值传递 注意:在VB中,默认变量传递方式为ByRef为地址,而传递值就是用ByVal,还要注意在C++中,int类型的变量是32位的,在VB中要用long型变量来配合。VC++部分: [cpp]view plaincopy extern"C"_declspec(dllexport)int__stdcallTestCalc(i...

demonzsmj12315的博客 191

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

VB向DLL传递字符串数组的问题

DLL函数原型为: DATAINTERFACE_API short (__stdcall GetCurValueList)(char* p[]); VB中的调用: Public Declare Function GetCurValueList Lib "DataInterface.dll" (pszExtName As Any) As Integer Dim pszName(2) As Long Dim asStr(2) As String Dim i As Long asStr(0) = Str

Yfw的博客 491

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

VB中的String类型调用VC的DLL

VB中的String类型调用VC的DLL EXTERN_C BSTR WINAPI RetStr(LPCTSTR str)  {  return SysAllocString((BSTR)str);  }  VB中 Private Declare Function RetStr Lib "D:\learn\VB\fangda\MFCDIB.dll" (ByVal s

听着程序唱着歌。。。 3388
上一篇: 关于文件路径操作的2个函数
下一篇: C++中struct与class的异同
sigepluto
博客等级 码龄23年 6粉丝 7原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值