英文的我编不下去了,所以还是先写个中文的吧,

之前遇到了SysStringLen求Bstr长度不正确的问题,试验了几次都不行的情况下我觉得可能是这个方法的bug,所以就没管。

大概的情况是这样:

int n1 = SysStringLen(m_str);//n1的值是10
m_str[] = '\0';         //当时就觉得问题应该出在这里,然而没有仔细去想
int n2 = SysStringLen(m_str);//n2的值仍然是10

看了一下BSTR的宏定义,我以为bstr只是一个WCHAR*,然后就写了这样一段代码:

关于BSTR和SysStringLen方法的简单研究-LMLPHP

所以我觉得这个SysStringLen肯定是有问题的,所以就决定不用它了。

周五开会的时候Simon让我弄明白到底怎么回事,所以我就百度了一下,

关于BSTR和SysStringLen方法的简单研究-LMLPHP

所以我的代码一开始就写错了?

然后我就改了一下:

关于BSTR和SysStringLen方法的简单研究-LMLPHP

果然这次结果就对了~

所以既然这个方法能读到它的长度,如果不是通过查找\0来判断结束,那差不多就是把长度写到了内存里,所以我决定去内存中找找答案

关于BSTR和SysStringLen方法的简单研究-LMLPHP

然而并没有卵用,没有找到什么跟6有关的东西。

但巧的是我手滑把鼠标滚轮往上滚了一下,

关于BSTR和SysStringLen方法的简单研究-LMLPHP

画框的地方有些让人注意的东西,尤其是那个“0c” 不就是12吗?

所以我又改了一下代码:

关于BSTR和SysStringLen方法的简单研究-LMLPHP

这回没跑了 ,这个12(换成10进制就是18)正好就是长度信息。

所以SysStringLen应该就是读的这个内存里的内容没跑了。

为了验证这个问题,我写了几段代码验证了一下:

关于BSTR和SysStringLen方法的简单研究-LMLPHP

关于BSTR和SysStringLen方法的简单研究-LMLPHP

所以SysStringLen这个方法只是读取了BSTR写在内存中的长度信息,和字符串的结束符在哪没有任何关系

05-20 21:16