您的位置:首页 > 编程语言 > VB

VB中的String类型调用VC的DLL

2012-10-30 10:55 204 查看


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 send

As String) As String

Dim result As String

Dim str As String

str = "12345"

result = RetStr(str)

MsgBox result

-----------------------------------------------------------------------------

第二个程序

VC++

EXTERN_C BSTR WINAPI add(LPSTR a,LPSTR b)

{

strcat(a,b);

return SysAllocString((BSTR)a);

}

VB

Private Declare Function add Lib "D:\learn\VB\fangda\MFCDIB.dll" (ByVal p As

String, ByVal p As String) As String

Dim s As String

s = "Hello"

Dim k As String

k = "heihei"

Dim result As String

result = add(s, k)

Debug.Print result

终于搞定了,整整一天呀!!!!!其实主要是这个函数SysAllocString((BSTR)字符串);因为VB和VC的编码是不同的!

找到的VB和VC编码的区别:首先就是在VB中声明传递的字符串参数的时候,按照常规的理解,好像应该是传递地址才对,但是这里使用的方法是ByVal,为什么?原因比较复杂,但是可以简单的来分析一下,在VB中,使用的字符串实际上是BSTR类型的,它是由自动化(以前被称为OLE Automation)定义的数据类型。一个BSTR由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的null值。大部分的BSTR是 Unicode的,即每个字符需要两个字节。BSTR通常以两字节的两个null字符结束。下图表示
了一个BSTR类型的字符串。

  (前缀)aTest\0

  头部BSTR指向数据的第一个字节

  另一方面,大部分的DLL过程(包括Windows 95 API中的所有过程)使用LPSTR类型字符串,这是指向标准的以null结束的C语言字符串的指针,它也被称为ASCIIZ字符串。LPSTR 没有前缀。下图显示了一个指向ASCIIZ字符串的LPSTR。

  aTest\0

  LPSTR指向一个以null结尾的字符串数据的第一个字节

通过上面的简单分析,不难看出,如果均以地址的方式传递参数的话,那么VB中的字符串将会包含更多德内容,所以,在这里,就必须以值的方式传递参数,虽然是以值得方式传递的参数,但是在DLL中还是能够识别得出来这是一个字符串,并且将它转换成为字符串。

好了,上面的这个问题我们已经解决了,但是,我们现在的胃口肯定也变得慢慢得有点大了,既然我们已经实现了能够从VB中把字符串传给DLL,那么,又应该怎么样才能够从DLL中把字符串返回给VB程序呢?通过上面的分析我们知道,因为两者之间使用的字符不是相同的格式的,所以简单的传输肯定是不行的,那么应该如何解决呢?其实,在明白了上面我们分析的道理后,再来解决这个问题就太easy了,只需要把传回的字符串进行一次转换就可以了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: