程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> VC >> vc教程 >> VB與VC通信初探(二)

VB與VC通信初探(二)

編輯:vc教程

     在通過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

為了繼續學習下去,我一定會繼續完成這一系列的文章,同時也希望可以看到願意一起學習這方面的知識的朋友給我提意見,與我聯系,共同進步!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved