VB中的String类型调用VC的DLL

来源:互联网 发布:软件著作权转让费用 编辑:程序博客网 时间:2024/06/11 17:13

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了,只需要把传回的字符串进行一次转换就可以了

原创粉丝点击