问题背景:
前几天在论坛中看到有一个提问的问题,内容是:
模块中的代码:
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格式的字符串指针类型。
字符个数描述符由VB来使用,BSTR指针直接指向第一个字符。
因为大多数API函数是用C或C++来编写的,在C/C++(API)中使用叫做LPSTR类型的指针。
VB中字符串变量在内存中的存储状态图:
从上图可知:字符串变量X的地址与实际字符串的地址不同,也就是说字符X变量中实际上是存放的字符串的首地址这一点是和C/C 相同的。其实图中descriptor这个描述符就是C中的字符串指针地址。当BSTR指针在忽略字符个数描述前缀的情况下是与LPSTR指针是相同的,在调用API时可以将BSTR以传值方式传递给API。
相关文章
拒绝录入错误日期的编程方法
06年9月二级VisualBasic程序设计笔试试卷及答案
如何取得文本框中包含指定字符串的行
vb精彩教程:数据异步加载
API中VB字符串作参数传递的本质论
另类快速导出数据库为EXCEL文档
在VB5.0中编辑数据库和电子表格
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛