紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 8791|回复: 3

[原创] 【原创】VB中BSTR字符串的结构

[复制链接]

273

主题

3287

帖子

1

精华

管理员

嗷嗷叫的老马

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
17057

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2009-2-25 01:20:37 | 显示全部楼层 |阅读模式
VB里面使用的字符串String就是COM规范中的BSTR,其特点是缓冲区前面有4字节的前缀用于说明缓冲区的长度:



因此这种结构可以保证能包含任意的内容,包括LPSTR中用于标志字符串结束的NULL.
VB在向API中以ByVal方式传递String时,实际上是把缓冲区的地址传了进去,因此API可以通过这个缓冲区来修改字符串内容.

以下这个代码可以直观的展示上面的说明:



  1. Option Explicit
  2. '说明BSTR结构的测试代码
  3. 'BY 嗷嗷叫的老马
  4. Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
  5.      ByVal Destination As Long, _
  6.      ByVal Source As Long, _
  7.      ByVal Length As Long)
  8. Sub Main()
  9.     Dim I As String, J As Long, K As Long
  10.    
  11.     I = "12345"
  12.     Call CopyMemory(VarPtr(J), StrPtr(I) - 4, 4)        '-4,指针就指向了I的前缀
  13.     MsgBox "字符串A" & Chr(0) & "字符串B"
  14.             'MsgBox也是以NULL为字符串结尾的,因此无法显示出字符串B.
  15.     MsgBox "缓冲区地址 = &H" & Hex(StrPtr(I)) & vbCrLf & vbCrLf & _
  16.             "LenB(BSTR) = " & LenB(I) & vbCrLf & vbCrLf & _
  17.             "CopyMemory得到的长度 = " & J
  18. End Sub
复制代码

【原创】VB中BSTR字符串的结构

【原创】VB中BSTR字符串的结构
我就是嗷嗷叫的老马了......

1214

主题

1566

帖子

11

精华

管理员

菜鸟

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
93743

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2009-2-25 11:05:53 | 显示全部楼层
不错,经典实用
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

273

主题

3287

帖子

1

精华

管理员

嗷嗷叫的老马

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
17057

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2009-2-26 14:50:33 | 显示全部楼层
<p>LPSTR就等于没有长度前缀的BSTR,请看后面蓝色部分.</p>
<p>&nbsp;</p>
<p>由于没有长度标识,因此LPSTR以NULL为字符串结束标志,所以LPSTR无法正常存放一个包含了NULL的字符串.</p>
我就是嗷嗷叫的老马了......

273

主题

3287

帖子

1

精华

管理员

嗷嗷叫的老马

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
17057

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
 楼主| 发表于 2009-3-1 03:15:45 | 显示全部楼层
<p>关于问题一:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 这个我不太清楚,C我不熟.不过貌似C里就LPSTR使用得多.....</p>
<p>&nbsp;</p>
<p>问题二:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 不是"没什么作用",而是根本没得用......VB里面就只有BSTR类型的字符串可用........</p>
<p>&nbsp;</p>
<p>问题三:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 我好象没见到哪个API只需要传缓冲区进去而不需要指定长度的....?想了半天真没想出来.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 不过呢,关于字符串返回的API的工作方式,我可以大约地说明一下.</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; 你看看这个帖子:</p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp; <font face="Verdana"><a href="dispbbs.asp?boardid=27&amp;id=2373&amp;star=1&amp;page=1">http://www.m5home.com/bbs/viewthread.php?tid=2373&extra=&page=1</a></font></p>
我就是嗷嗷叫的老马了......

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2024-5-17 13:17 , Processed in 0.030380 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表