转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> VB.NET程序 >> 正文
API中VB字符串作参数传递的本质论         ★★★★

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1281 更新时间:2009/4/23 18:59:52

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)

字符个数描述符由VB来使用,BSTR指针直接指向第一个字符。

因为大多数API函数是用C或C++来编写的,在C/C++(API)中使用叫做LPSTR类型的指针。

  

VB中字符串变量在内存中的存储状态图:

从上图可知:字符串变量X的地址与实际字符串的地址不同,也就是说字符X变量中实际上是存放的字符串的首地址这一点是和C/C++相同的。其实图中descriptor这个描述符就是C中的字符串指针地址。当BSTR指针在忽略字符个数描述前缀的情况下是与LPSTR指针是相同的,在调用API时可以将BSTR以传值方式传递给API。采用传值方式传递时实际上传递的是实参中所存放的字符串的首地址,当调用过API后,可以通过它来返回数据,API修改传送给它的那个地址所指向的字符串数据,而没有修改实参字符变量内的内容,所以可以返回数据。即并没有与高级语言中所规定的传值方式调用方式的形参改变不影响实参的规则相冲突。

 

实例:

模块中的代码:

Option Explicit

 

Public Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long

窗体中的代码:

 

Option Explicit

 

Private Sub Command1_Click()

   Dim str As String

   Dim str1 as String

   Dim length As Long

   length = 255

 

   str = String(length, 0)

   str1=str

   Debug.Print VarPtr(str),”     “,varptr(str1)

   Debug.Print StrPtr(str),”      ”,strptr(str1)

   Debug.Print

 

   GetComputerName str, length

 

[1] [2]  下一页


没有相关教程
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台