MFC中开发Activex控件,用ClassWizard生成一个返回值为BSTR的方法。ClassWizard自动生成的代码如下:
BSTR CMyActCtrl::GetName(short index) 
{
CString strResult;
// TODO: Add your dispatch handler code here
return (BSTR)(strResult.AllocSysString());
}
因为这段代码中使用了CString::AllocSysString()函数,所以应该在容器中释放这片内存空间。但是在容器程序中加入该Activex控件后(Project->Add to project->Components and controls),自动生成的MyAct.cpp文件中该方法的定义却是如下代码
CString CMyAct::GetName(short index)
{
CString result;
static BYTE parms[] = VTS_I2;
InvokeHelper(0x5, DISPATCH_METHOD, VT_BSTR, (void*)&result, parms,
index);
return result;
}现在有两个问题:
1、原方法的BSTR返回值,在容器中自动变成了CString的返回类型,那么我该如何调用SysFreeString函数来释放内存?
2、当CString作为返回值返回的时候,返回的是CString字符串的指针还是其他的什么东西?
   CString aaa=m_MyAct.GetName(1);这时aaa与函数中的result所指向的是同一片内存区域么?谢谢!

解决方案 »

  1.   

    如果MFC封装的方法没有问题的话,那么CString应该在返回之前就自动调用SysFreeString了
      

  2.   

    CString CMyAct::GetName(short index) 

    CString result; 
    BSTR bsOut = NULL;
    static BYTE parms[] = VTS_I2; 
    InvokeHelper(0x5, DISPATCH_METHOD, VT_BSTR, (void*)bsOut, parms, 
    index); 
    result = bsOut;
    SysFreeString(bsOut);
    return result; 

      

  3.   

    算了,不深究了。我觉得是把BSTR放在CString中了。
    CString CMyAct::GetName(short index) ,这种形式返回的CString可能在调用函数退出的时候会调用CString的析构函数释放内存。
    总之CString function()这种形式的返回的话,返回的到底是什么东西?还是有点不明了。比如char* function()返回的是指针。但是CString function()这种形式,返回的是指针还是类?不是很清楚。再看看有没有更清楚点的解释。
    无论如何,后天来结贴啦。另外谢谢回帖的两位兄弟。
    jameshooo ,
    在返回之前不能释放吧?如果释放了的话,调用函数就不能得到字符串值了吧?tcjsrdn ,
    你的意思是VS6.0生成的代码有bug?
      

  4.   

    返回之前释放的意思是:CString本身管理的并不是BSTR,它会从BSTR复制字符串副本到自己的缓冲区,再释放BSTR,以后就使用自己的缓冲区了。
      

  5.   


    恩,有点道理。可能是这个函数里的名堂InvokeHelper。来晚了,今天结帖。不好意思。