用了很久COM了,一直老老实实为传出BSTR分配空间,今天做个实验,发现一个令人惊奇的事情:SysFreeString似乎什么都没有做。比如一个接口函数定义如下:
ITest:AAAA([out,retval]BSTR* pbstrTest)
在函数内这么写
{
……
……
……
*pbstrTest = SysAllocString("This is A test");
SysFreeString(*pbstrTest);
return S_OK;
}在进程外调用该接口,居然可以正确得到"This is A test"。
对内存进行一番分析后,发现SysFreeString执行期间,这个BSTR的内容并未发生变化,就是说指针前的表达长度的4个字节没有变成0,当然指针所指的地址空间更没有被重写,所以仍然可以marshal,甚至你可以多次调用SysFreeString仍然不会影响进程外的调用。(进程内就更不用说了)个人觉得这个问题很奇怪,提出来,看看有没有高人能给个解答。
ITest:AAAA([out,retval]BSTR* pbstrTest)
在函数内这么写
{
……
……
……
*pbstrTest = SysAllocString("This is A test");
SysFreeString(*pbstrTest);
return S_OK;
}在进程外调用该接口,居然可以正确得到"This is A test"。
对内存进行一番分析后,发现SysFreeString执行期间,这个BSTR的内容并未发生变化,就是说指针前的表达长度的4个字节没有变成0,当然指针所指的地址空间更没有被重写,所以仍然可以marshal,甚至你可以多次调用SysFreeString仍然不会影响进程外的调用。(进程内就更不用说了)个人觉得这个问题很奇怪,提出来,看看有没有高人能给个解答。
比如
BSTR bstrTest = SysAllocString("This is A test");
SysFreeString(bstrTest);
UINT nLen = SysStringLen(bstrTest);
nLen居然还是12我觉得这个真的很不安全,你访问了一个释放后的空间,系统没有检查,你完全不知道这个空间已经无效了,所以程序平时运行都是正确的,偶尔出一次错误,没谁知道是哪儿出问题了。