加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

VB与VC通信初探

发布时间:2020-12-16 22:47:02 所属栏目:大数据 来源:网络整理
导读:VB与VC通信初探(一) 在使用VB调用VC写的DLL的时候,可以实现一些VB不能实现或者很难实现的功能,但是,因为VB与VC之间的数据类型并不总是完全对应的,所以,在进行参数传递的时候,就需要进行类型转换了。下面我将通过逐步的推进的方法,来看看如何达到VB与
VB与VC通信初探(一) 在使用VB调用VC写的DLL的时候,可以实现一些VB不能实现或者很难实现的功能,但是,因为VB与VC之间的数据类型并不总是完全对应的,所以,在进行参数传递的时候,就需要进行类型转换了。下面我将通过逐步的推进的方法,来看看如何达到VB与VC之间的通信。 首先,看一个简单的例子。 VC中的程序: extern "C" _declspec(dllexport) void ReadString(void) { //函数功能 } 将这个VC程序编译成DLL程序供VB调用(假设生成的为commication.dll) VB中的程序: …………………… Private Declare Function ReadString Lib "commication.dll" () …………………… call ReadString 在这里,我们实现了一个简单的通信,即在VC中写了一个DLL,然后再在VB中调用了这个DLL,但是,在这次的通信中,实际上他们之间没有传递任何数据,仅仅是VB调用了DLL,从而使得commication.dll中的函数ReadString()函数执行。这种通信实现是非常简单,所以他完成的功能也就非常的简单,然而我们的要求肯定不止于此。 现在就让我们来实现一个使用DLL来处理VB中的数据的例子,并且将处理结果返回给VB程序: VC中的程序: extern "C" _declspec(dllexport) bool ReadString(bool receive) { if(receive==true) return true; else return false; } VB中的程序: …………………… Private Declare Function ReadString Lib "commication.dll" (ByVal send As Boolean) as Boolean …………………… Dim result As Boolean Dim send As Boolean send = False result = ReadString(send) If result Then MsgBox "The return value is 'true'" Else MsgBox "The return value is 'false'" End If 在这次的通信过程中,我们还是实现了一个很简单的通行过程,在DLL中,根据VB调用的时候传递进来的参数将接收到的参数返回给了VB调用程序,虽然简单,但是已经实现了VB与DLL之间的数据传递了,在这里要注意的是它们之间的数据类型,布尔类型的数据在VC中使用的关键字是Boolean,而在VC中使用的关键字则是bool。 由于VB与VC之间的数据类型没有相同的关键字,为了方便,下面列出常用数据类型在VC与VB中分别使用的关键字以及它们之间的对应关系: c中的数据类型 VB中的声明 结果 ATOM ByVal variable As Integer 结果为Integer 类型的表达式 BOOL ByVal variable As Boolean 结果为 Long 类型的表达式 BYTE ByVal variable As Byte 结果为 Byte 类型的表达式 CHAR ByVal variable As Byte 结果为 Byte 类型的表达式 COLORREF ByVal variable As Long 结果为 Long 类型的表达式 DWORD ByVal variable As Long 结果为 Long 类型的表达式 HWND,HDC,HMENU ByVal variable As Long 结果为 Long 类型的表达式等Windows 句柄 INT,UINT ByVal variable As Long 结果为 Long 类型的表达式 LONG ByVal variable As Long 结果为 Long 类型的表达式 LPARAM ByVal variable As Long 结果为 Long 类型的表达式 LPDWORD variable As Long 结果为 Long 类型的表达式 LPINT,LPUINT variable As Long 结果为 Long 类型的表达式 LPRECT variable As type 自定义类型的任意变量 LPSTR,LPCSTR ByVal variable As String 结果为 String 类型的表达式 LPVOID variable As Any 任何变量(在传递字符串的时候使用ByVal) LPWORD variable As Integer 结果为Integer 类型的表达式 LRESULT ByVal variable As Long 结果为 Long 类型的表达式 NULL As Any 或 ByVal Nothing 或 ByVal variable As Long ByVal 0& 或 VBNullString SHORT ByVal variable As Integer 结果为Integer 类型的表达式 VOID Sub procedure 不可用 WORD ByVal variable As Integer 结果为Integer 类型的表达式 WPARAM ByVal variable As Long 结果为 Long 类型的表达式 好了,现在我们已经建立了基本的通信模式了,并且实现了两个简单的通信过程,该休息一下了,之后再来看看更复杂的通信该如何去实现了!(待续) VB与VC通信初探(二) 作者:eliner 来源:CSDN 点击:156 更新:2006-12-19 7:03:33 编辑: 画王w 字体:小 大 在通过DLL实现VB与VC的过程中,一般的简单的通信过程很容易建立。在《VB与VC通信初探(一)》中,我已经把基本的通信过程给描述了一下,但是,有些时候,事件的发展并不总是一帆风顺的,当我们以为可以轻松的实现VB与VC的通信的时候,就经常发生这样的情况,还是先看看例子再说。 VC中的程序: extern "C" _declspec(dllexport) bool ReadString(LPCSTR lpString) { char str[]="Hello World!"; if(strcmp(lpString,str)==0) return true ; else return false ; } VB中的程序: Private Declare Function ReadString Lib "commication.dll" (ByVal send As String) as Boolean …………………… Dim result As Boolean Dim send As String send =”Hello,World!” result = ReadString(send) If result Then MsgBox "The return value is 'true'" Else MsgBox "The return value is 'false'" End If 可以上机运行这个程序,一样的,实现了通信的功能,但是这里有几个地方是应该引起我们注意的,首先就是在VB中声明传递的字符串参数的时候,按照常规的理解,好像应该是传递地址才对,但是这里使用的方法是ByVal,为什么?原因比较复杂,但是可以简单的来分析一下,在VB中,使用的字符串实际上是BSTR类型的,它是由自动化(以前被称为OLE Automation)定义的数据类型。一个BSTR由头部和字符串组成,头部包含了字符串的长度信息,字符串中可以包含嵌入的null值。大部分的BSTR是 Unicode的,即每个字符需要两个字节。BSTR通常以两字节的两个null字符结束。下图表示 了一个BSTR类型的字符串。   (前缀)aTest   头部BSTR指向数据的第一个字节   另一方面,大部分的DLL过程(包括Windows 95 API中的所有过程)使用LPSTR类型字符串,这是指向标准的以null结束的C语言字符串的指针,它也被称为ASCIIZ字符串。LPSTR 没有前缀。下图显示了一个指向ASCIIZ字符串的LPSTR。   aTest   LPSTR指向一个以null结尾的字符串数据的第一个字节 通过上面的简单分析,不难看出,如果均以地址的方式传递参数的话,那么VB中的字符串将会包含更多德内容,所以,在这里,就必须以值的方式传递参数,虽然是以值得方式传递的参数,但是在DLL中还是能够识别得出来这是一个字符串,并且将它转换成为字符串。 好了,上面的这个问题我们已经解决了,但是,我们现在的胃口肯定也变得慢慢得有点大了,既然我们已经实现了能够从VB中把字符串传给DLL,那么,又应该怎么样才能够从DLL中把字符串返回给VB程序呢?通过上面的分析我们知道,因为两者之间使用的字符不是相同的格式的,所以简单的传输肯定是不行的,那么应该如何解决呢?其实,在明白了上面我们分析的道理后,再来解决这个问题就太easy了,只需要把传回的字符串进行一次转换就可以了,是的,下面就给出这个实例,注意的黑体部分就可以了。 VC中的程序: extern "C" _declspec(dllexport) BSTR ReadString(LPCSTR lpString) { char str="Hello,World!"; if(strcmp(lpString,str)==0) return SysAllocString((BSTR)str); else return SysAllocString((BSTR)lpString); } VB中的程序: Private Declare Function ReadString Lib "commication.dll" (ByVal send As String) as String …………………… Dim result As String Dim send As String send =”Hello,World!” result = ReadString(send) MsgBox result 为了继续学习下去,我一定会继续完成这一系列的文章,同时也希望可以看到愿意一起学习这方面的知识的朋友给我提意见,与我联系,共同进步! 关于COM的数据类型,并不是所有VC的数据类型VB都支持,下面是一下对照表 IDL     VC++    VB  Microsoft Java boolean  Unsigend char 不支持  char byte    Unsigend char 不支持  char small    char     不支持  char short    short     Integer short long    long     Long   int byper   _int64    不支持   long float    float     Single  float double  double     Double double char  unsigned char  不支持  char wchar_t  wchar_t   Integer  char enum   enum    Enum   int VARIANT VARIANT  Variant   ms.com/Variant BSTR   BSTR    String   java.lang.String VARIANT_BOOL sHORT{-1/0} Boolean{True/Flase} boolean{true/false}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读