C++写的DLL,传结构给VB用

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

由于某些情况下,我们需要用CB或是VC写一个DLL,而调用它的确实VB。

这里特别强调一下使用标准数据类型的问题,就是说用C++写的东西,导出的函数最好使用标准的int,char,long,double...标准类型以及他们的指针。

很多人都强调过这个问题。但是我最近遇到一个需要VB传结构给CB做的DLL,然后数据返回到结构的情况。

typedef struct Xtest

{

char a[100];

char b[100];

}*pX;

__declspec(dllexport) void __stdcall test  (*px,char *x,char *y);

void __stdcall test  (*px,char *x,char *y)

{

if(strlen(x)>100) *(x+99)='/0';

if(strlen(y)>100)*(y+99)='/0';

strcpy(px->a,x);

strcpy(px->b,y);

return;

}

在VB里你要写一个同样的结构

public type Xtest

a as string*100

b as string*100

end type

public declare funciton test lib"你的DLL名字" (byref px as Xtest,byval x,byval y)

这样才可以成功,如果使用了不定长的字符串,那么很可能你的系统要崩溃,我在我这里是这样。如果有问题,请大家指正。

另外,VB声明DLL里的函数,需要DLL的名字放在 LIB后面,但是这个名字在运行时,你必须要写全路径或是放在SYSTEM32目录,即使放在VB程序所在的目录,也需要全路径。但是编译过的VB程序,可以识别放在同目录下在声明里没有写全路径的DLL。

这样的结构,看起来是很不错的做法,但是对于cb/delphi,我认为用String类型就好。当我们需要传出非标类型的时候,把需要传入/传出的数据,用结构封装起来,这样就可以避免写参数N多的函数,只要定义一个机构就可以了。然后在结构里,我们使用一个类型标志来确定我们需要提取的参数。

public type Xtest

Para as String

a as String

b as String

...

end type

function test(v as Xtest)

if para="100" then

你的操作

end if

if para="200" then

...

end if

end function

这样的方式可以让我们在一个函数里处理N多的事情。只要根据不同的标志就可以确定我们做的操作。

很明显这种做法,就是我们通常所谓的协议实现。无论是银联的8583,还是RS232C,都是一种约定和规范。我们在编程的时候,适当的制定一些简单的规范,对我们批量处理是非常有好处的。而且最后的风状效果也是很不错的。

使用类做这样的事情当然是很不错的事情,但我们通常不建议直接使用导出类。而是使用接口,以免出现某些数据安全性方面的问题,因为你一但导出一个类,那么通过指针的简单操作,很容易从类的实例当中获取数据。所以,接口编程就比较重要了。

VB和Dev-C++合作——手把手教你GUI程序 声明此文的读者定为C语言初学者。此文介绍的技巧适用于开发迷你型项目或自娱自乐的玩具程序,正规的项目中可能不会采用。读者可以抱着茶余饭后休闲娱乐的心态来围观,至于CLI、GUI等名词解释请参看百度百科。转载请保留此声明和原作者redraiment,谢谢!正文诱人的GUI程序程序的作用就是化繁为简,让计算机高效地帮我们完成枯燥的工作。程序最大的动力就是你精心设计的程序能获得大家的认可 阅读详情

相关推荐

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

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

subtop的专栏 1676

C++DLLVB用,例程是封装NI虚拟仪器的函数.非常值得学习!

C++DLLVB用,包括VB6.0的例子,例程是封装NI虚拟仪器的函数.搞仪器控制的非常值得学习!

vb下调用C++dll的方法

VB下调用dll的函数必须要有特殊的声明,用Declare声明语句在窗体级或模块级或全局模块的代码声明段进行声明,将动态链接库中的函数声明到VB中,供VB程序调用。 语句格式为:Declare Sub 过程名Lib [ Alias " 别名]([ByVal 参数AS类型]),或为Declare Function函数名Lib [Alias " 别名]([ByVal 参数AS类型])AS类型在声明中首

Amy0428的专栏 2962

VCDLLVB用,送字符串

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

VB调用DLL递自定义类型数组参数注意

对于C/C++接口中的自定义类型,要给出对齐方式。如果调用者是C/C++,那么应当指定成相同的对齐方式;非C/C++且无自定义的能力,那么只能用byte数组自己组装和拆卸。 因为某个项目中曾经试图用Java来调用设备的控制接口,在C/C++中很简单的结构/联合体等,在Java中却不得不手工来编码,因为这个转化很耗费时间,与规定的宽限值相差几百万倍,所以不得不作罢;还有手工编码也很浪费开发时间,就百

Derry的专栏 4236

VB中调用C/C++语言编dll,数组参数的

介绍了如何在VB中调用C/C++dll以及如何递数组参数

NorthGod的专栏 8547

VB程序调用C++动态库

注意点如下: VB调用的类型是long,C++库要定义成int。

zhanghuahuapoi的博客 1432

c++调用vb6.0制作的activex dll

本文将介绍在vs2008 中C++ 调用vb6.0 生成的activex dll。具体的源代码可以从以下链接下载:http://download.csdn.net/detail/xsjm206/4092111     第一步:vb6.0制作的Activex DLL,发布为PRO.dll,并手动注册该dll文件(regsvr32 )。    第二步:vs2008,C++ 制作控制台程序调用PRO

xsjm206的专栏 4999

一步一步教你用VC和VB调用C++ DLL

Step by Step: Calling C++ DLLs from VC++ and VB一步一步教你用VC和VB调用C++ DLL.作者 Hans Dietrich    翻译烟灰介绍本系列教程讨论了普通情况下4种使用DLL的方法Part 1从VC++应用程序调用C++ DLL的函数 从VC++应用程序调用C++ DLL的类

──╆的专栏 5124

VB应用程序调用c++的动态库(dll)(转)

1.调用的网上经验:当编VB调用的C++ DLL时,必须使用def文件来定义导出符号,否则VB程序将链接失败。我们都知道使用def文件是为了避免C++编译器对函数进行重命名,另一个达到相同效果的替代方式是使用extern "C"标识符。若DLLC++、C#、Java等调用,后者可以工作得很好;然而VB不可以,即便使用了extern "C"来标识导出函数,依然需要定义def文件。...

dinghutian1305的博客 2023

vb.net静态动态调用c++dll的方法

vb.net静态调用c++dll的方法:在新建的工程中,add一个module,添加声明函数等代码。 如: Public Declare Function AdvDVP_Start Lib "xxx.dll" (ByVal nDevNum As Long, ByVal SwitchingChans As Long, ByVal Main As Long, ByVal hwandPrevie

Amy0428的专栏 7638

Visual C++VB.Net调用的DLL

跟我一样,很多初学者确实很难编出如题的DLL,即使编出来也经常在调用过程中出现各种问题。我根据摸索出了一个DLL,编译和调用代码获得通过。以下举例简单说明,具体还有很多问题我也待继续研究。1.用Visual C++ 新建一个Win32控制台 DLL项目(记得打钩空项目) 如:MyDll12.在头文件添加 Mydll1.h #pragma once #include <iostream&gt......

chinaherolts2008的博客 920

使用VB创建标准DLLvblink工具实战指南

Visual Basic(简称VB)是由微软推出的一种面向对象的可视化编程语言,广泛应用于Windows桌面应用程序的开发。其语法简洁、开发效率高,适合快速构建GUI界面和业务逻辑。VB支持事件驱动编程模型,具备良好的集成开发环境(IDE),如VB6和VB.NET。在 DLL 开发中,函数的设计和模块划分是决定其可维护性和扩展性的关键因素。合理使用 Public 函数、遵循模块化设计原则,以及管理资源依赖,有助于构建高质量的 DLL 组件。vblink。

weixin_29097457的博客 697

如何用VB,C#调用C++DLL

之前在网上搜集了一些资料,现在稍微gkg

shejiannan的专栏 3883

VB调用vcdll的某个方法时的问题

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

Amy0428的专栏 2641

C++VB调用 c++dll示例

dll方法定义:extern"C"__declspec(dllexport)BSTR __stdcall PayOrder(const char* parmStr); 入:字符串 返回:字符串 pb调用声明示范:function string PayOrder (string jsonStr) library("EJOrderExchange.dll"); c++调用示范 /*------...

angelpaiy的博客 1406

用 VC CRC32 DLLVB调用

建立 crc32.cpp代码如下:---------------------------------------------------------------------------------//kwanhong Young 2004-9-1unsigned long CRCTable[256];/*int main(int argc, char* argv[]){ Ini

VirtualAlloc的专栏 1794
上一篇: VC,学C的最后境界!?
下一篇: DES算法的C语言代码
vrix
博客等级 码龄23年 670粉丝 167原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值