API中VB字符串作参数传递的本质论

API中VB字符串作参数传递的本质论,第1张

API中VB字符串作参数传递的本质论,第2张

背景:
前几天在论坛看到一个提问,是:
模块中的代码:
Option Explicit
公共声明函数GetComputerName Lib "kernel32 "别名" Get Computer Name ea "(ByVal LP buffer As String,NSize As Long)只要'声明API函数获取计算机名
代码的形式:
Option Explicit
私有子命令1 _ click ()
Dim计算机名As String打印计算机名,
end sub
以上程序的功能是获取计算机。
可以看到上面API中的参数lpBuffer声明为Byval。然后调用之后API函数可以通过实参computername返回ComputerName,那么形参不就是声明为按值调用吗?也就是参数值的变化不会影响实参,但是这里的API函数可以通过实参返回值。原因是什么?
相关知识:
众所周知,VB中没有C语言中的指针类型。C中只有字符数据类型,即字符变量只能存储一个字符,没有字符串变量。它通过字符指针操作字符串,其特点是判断一个字符是否以' [2] '结尾。VB有字符串变量类型,一个长度可变,一个长度固定。而VB字符串有特定的自动保护功能。
例如:dimstr as string * 6
str = " abcdef "
debug . printstr '则abcdef
str = " abcdefghijklmnopq "会显示
debug.printstr '也会显示abcdef,表示它有保护功能,会截掉多余的字符
VB中使用的字符是一种叫做BSTR格式的字符串指针类型,


字符号描述符是VB使用的,BSTR指针直接指向第一个字符。
由于大多数API函数都是用C或C++编写的,所以在C/C++(API)中使用了称为LPSTR类型的指针。


字符串变量X的地址与实际字符串的地址不同,这意味着字符X变量实际上是存储字符串的第一个地址,这与C/C++相同。其实图中的描述符就是c中字符串指针的地址,当BSTR指针与LPSTR指针相同而忽略字符数描述的前缀时,调用API时可以将BSTR按值传递给API。

位律师回复
DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
白度搜_经验知识百科全书 » API中VB字符串作参数传递的本质论

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情