在VB6中用CopyMemory拷贝字符串的种种猫腻(二).pdf

在VB6中用CopyMemory拷贝字符串的种种猫腻(二).pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
在VB6中用CopyMemory拷贝字符串的种种猫腻(二)

在VB6中用CopyMemory拷贝字符串的种种猫腻(二) - slowgrace的专栏 - CSDN博客在VB6中用CopyMemory拷贝字符串的种种猫腻(二) 收藏 版权声明:可以任意转载,转载时请务必以超链接形式标明如下文章原始出处和作者信息及本声明 作者:xixi 出处:/slowgrace/archive/2009/09/14/4550116.aspx 本文来自此帖的冗长讨论,感谢Tiger_Zhao的全程指点和陈辉、阿勇、马云剑等很多朋友的热心参与。本文其他部分在:(一)、(三)、(四)。 第三节 经典错误代码集锦好的,现在我们可以来看看VB妈妈好心没做好事的几个例子了。先说明一下,以下所有这些例子都来自这个帖子热心朋友的回复,它们都共享第一节里声明的模块级变量和常数。3.1 我在0楼的代码——结果为何变短 1. Sub test5() 2. String1 = STR_E 3. String2 = String$(7, 0) 4. 5. CopyMemory pString1, ByVal VarPtr(String1), 4 6. CopyMemory ByVal String2, ByVal pString1, 14 7. 8. Debug.Print String2 得到的不是PowerVB,而是“P o w e”? 9. End Sub 这个例子的运行过程如下:(1)第1个CopyMemory得到的是String1的地址,并把这个地址作为源地址传给第2个CopyMemory (2)第2个CopyMemory从String1的地址拷贝14个字节。由于VB中字符串的内部表示是Unicode,所以这时得到的14个字节的内容是“P-\0-o-\0-w-\0-e-\0-r-\0-V-\0-B-\0-”(注意,其中的“-”是我加入用来分割字符的,并不真的包括在字符串内存中)。 (3)由于CopyMemory的第一个参数是ByVal String2,是一个字符串,而VB会自动对API函数中的字符串参数做UA转换。所以,系统会把14个字节的Unicode空字符串String2转为7个字节的ANSI空字符串,并存在一个临时变量中,假设叫_tmp。 (4)然后系统把拷来的14字节数据“P-\0-o-\0-w-\0-e-\0-r-\0-V-\0-B-\0-”向_tmp拷。注意_tmp只有7字节,所以这里有溢出的危险。 (5)由于_tmp只有7字节,所以_tmp实际只得到头7个字节的数据,就是“P-\0-o-\0-w-\0-e-” (6)最后VB要把ANSI字串再转回Unicode字串,并把转回的结果赋给String2。AU转换就是是将英文的 1 个字节扩张为 2 个字节,这样String2最终的内容是“P-\0-\0-\0-o-\0-\0-\0-w-\0-\0-\0-e- /slowgrace/archive/2009/09/14/4550116.aspx (第 1/7 页)2011-3-31 15:32:03 在VB6中用CopyMemory拷贝字符串的种种猫腻(二) - slowgrace的专栏 - CSDN博客\0-”,用Debug打印出来,可不就是“P o w e”么? 下面这个表总结了上述过程: 另外,我还做了下图来说明上面的过程: 哎,这个图画得太杰出了。一目了然啊!你看,第②步的Unicode字符串硬是被当做ANSI字串在第③步被强行AU了,所以结果“浮肿”了很多(被插入好些空格)。 /slowgrace/archive/2009/09/14/4550116.aspx (第 2/7 页)2011-3-31 15:32:03 在VB6中用CopyMemory拷贝字符串的种种猫腻(二) - slowgrace的专栏 - CSDN博客这个例子如何改对呢?中间两句不改,前后各改/增加一句,如下: String2 = String$(LenB(String1), 0) 先确保_tmp2长度足够 CopyMemory pString1, ByVal VarPtr(String1), 4 CopyMemory ByVal String2, ByVal pString1, LenB(String1) String2 = StrConv(String2, vbFromUnicode) 再做UA转换以抵消VB多做的一次AU转换 3.2 阿勇在11楼的代码——结果为何变胖 1. 阿勇11楼 2. Sub test8_Yong() 3. Dim

您可能关注的文档

文档评论(0)

l215322 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档