- 1、本文档共7页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
您可能关注的文档
- 公路最小直线长度计算_张荣洁.pdf
- 公路隧道围岩模糊信息分类的专家系统.pdf
- 公路隧道渗漏水综合防治措施.pdf
- 六款护肤品让肌肤瞬间清爽白.pdf
- 六年级上册英语第二单元第第二课时课件.ppt
- 共享经济深度研究报告(五):共享经济与住宿.pdf
- 共面波导CPW和平面微带线CPS--测试方案.pdf
- 关于《志萍版老友记英语笔记》的使用说明.pdf
- 关海土木论坛_高速路.pdf
- 兵马俑英文介绍Terra-cotta Warriors.pdf
- 《GB/Z 44363-2024致热性 医疗器械热原试验的原理和方法》.pdf
- GB/T 16716.6-2024包装与环境 第6部分:有机循环.pdf
- 中国国家标准 GB/T 44376.1-2024微细气泡技术 水处理应用 第1 部分:亚甲基蓝脱色法评价臭氧微细气泡水发生系统.pdf
- 《GB/T 44376.1-2024微细气泡技术 水处理应用 第1 部分:亚甲基蓝脱色法评价臭氧微细气泡水发生系统》.pdf
- GB/T 44376.1-2024微细气泡技术 水处理应用 第1 部分:亚甲基蓝脱色法评价臭氧微细气泡水发生系统.pdf
- 中国国家标准 GB/T 44315-2024科技馆展品设计通用要求.pdf
- GB/T 44305.2-2024塑料 增塑聚氯乙烯(PVC-P)模塑和挤塑材料 第2部分:试样制备和性能测定.pdf
- 《GB/T 44315-2024科技馆展品设计通用要求》.pdf
- GB/T 44315-2024科技馆展品设计通用要求.pdf
- GB/T 39560.9-2024电子电气产品中某些物质的测定 第9 部分:气相色谱-质谱法(GC-MS)测定聚合物中的六溴环十二烷.pdf
文档评论(0)