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