VB與VC通信初探(二)

在通過DLL實現VBVC的過程中,一般的簡單的通信過程很容易建立。在《VBVC通信初探(一)》中,我已經把基本的通信過程給描述了一下,但是,有些時候,事件的發展並不總是一帆風順的,當我們以爲可以輕鬆的實現VBVC的通信的時候,就經常發生這樣的情況,還是先看看例子再說。

 

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/0
  頭部BSTR指向數據的第一個字節

  另一方面,大部分的DLL過程(包括Windows 95 API中的所有過程)使用LPSTR類型字符串,這是指向標準的以null結束的C語言字符串的指針,它也被稱爲ASCIIZ字符串。LPSTR 沒有前綴。下圖顯示了一個指向ASCIIZ字符串的LPSTR

  aTest/0

  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

 

爲了繼續學習下去,我一定會繼續完成這一系列的文章,同時也希望可以看到願意一起學習這方面的知識的朋友給我提意見,與我聯繫,共同進步!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章