API中VB字符串作參數傳遞的本質論

發表于:2007-07-01來源:作者:點擊數: 標簽:
API 中 VB 字符串作參數傳遞的本質論 問題背景: 前幾天在論壇中看到有一個提問的問題,內容是: 模塊中的代碼: Option Explicit Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As L

APIVB字符串作參數傳遞的本質論

問題背景:

前幾天在論壇中看到有一個提問的問題,內容是:

模塊中的代碼:

Option Explicit

 

Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long’聲明獲取計算機名的API函數

 

窗體中的代碼:

Option Explicit

 

Private Sub Command1_Click()

   Dim computername As String

   Dim length As Long

   length = 255

   str = String(length, 0)

  

   GetComputerName computername, length

  

   Debug.Print computername,

End Sub

以上程序的功能是獲取計算機名。

大家看上面API中的lpBuffer這個形參被聲明為Byval(傳值)方式。那么在調用之后API函數卻可以通過computername這個實參傳回計算機名,那么形參不是被聲明為傳值調用方式嗎?即形參值的改變不會影響到實參,可是這里調用API函數后卻可以通過實參返回值,這是到底是什么原因呢?

相關知識:

大家都知道,VB中沒有C語言中的指針類型。C語言中只有字符數據類型,即字符變量只能存放一個字符,而沒有字符串變量,它操作字符串是通過字符型指針來實現的,它的特點是通過’\0’來判斷字符是否結束的。而VB有字符串變量類型,一種變長,一種是定長的。并且VB字符串具體自動保護功能。

例如:dim str as string * 6

      str=”abcdef”

      debug.print str’那么將顯示abcdef

      str=”abcdefghijklmnopq”

      debug.print str’還顯示abcdef,說明它具有保護功能,將超過的字符截掉

在VB中使用的字符是一種叫做BSTR格式的字符串指針類型。

6   a    b    d    e     f    chr(0)

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97