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了,只需要把传回的字符串进行一次转换就可以了
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。