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

由于某些情况下,我们需要用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,都是一种约定和规范。我们在编程的时候,适当的制定一些简单的规范,对我们批量处理是非常有好处的。而且最后的风状效果也是很不错的。

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值