Interface:
   GetParm(BSTR* pBstrParm) 
 {
   *pBstrParm = ::SysAllocString("parm");
 }该接口在DCOM中被调用,在客户端该怎样释放DCOM中分配的内存?::SysFreeString()在客户端掉用有效吗?初写这些东西,大家赐教哦!

解决方案 »

  1.   

    在com中资源的分配释放一般用如下规则:
    1.[in]类型的参数资源,调用者分配,调用者释放
    2.[out]类型的,被调用者(服务器)分配,调用者释放
    3.[in,out]类型的,调用者分配,调用者释放,但是中间被调用者可以重新分配其资源,即新释放旧资源再分配新的资源*pBstrParm = ::SysAllocString("parm");
    应该为:
    *pBstrParm = ::SysAllocString(L"parm");
    如果上面你的函数在idl中声明参数为[out],那就没错了
      

  2.   

    对的,就是这个样子,GetParm([out]BSTR *pBstrParm)肯定是 服务器分配内存了可对于::SysAllocString(L"parm")分配的内存我该怎样释放呢?
      

  3.   

    你是说服务器端的内存没释放吗?我觉得不用释放了,因为再调用SysAllocString的时候,内部调用了CoTaskMemAlloc,它用的是com统一的内存管理接口IMalloc,通过存根代理dll,它会处理内存释放问题,也就是再SysFreeString被调用的时候它会在服务端释放内存个人理解,希望高手指正
      

  4.   

    有很多种方式都可以的:
    1)
    BSTR tmp = NULL;
    try
    {
      InterfacePtr->GetPara(&tmp);
    ...//处理
    }
    catch (...)
    {
       ::SysFreeString(tmp);
    }2)
    {
    BSTR tmp;
    InterfacePtr->GetPara(&tmp);
    _bstr_t Para(tmp, false);
    ...//处理
    } //自动由Para释放掉偶一般都采用第二种。
      

  5.   

    luohualiushui(落花流水) 
    我担心就是这个了我的IDL文件需要定义一个结构体,用来在接口函数中传入和传出参数。该结构体有很多char[n]类型的字段,没办法确定char数组的长度。我在寻找一种数据类型,就像MFC中的CString,或std::string。我现在尝试使用BSTR,由于它是基本类型,它还有长度信息,故在接口函数中传入和传出时很方便。但由于它是一指针类型,在服务器端分配内存,我不能像CoTaskMemFree()一样进行释放。有该方面经验的朋友赐教了
      

  6.   

    LeeZi(临渊羡鱼,不如退而结网) 你所用的方法只是在调用方(相对于服务器端来说就是客户端)确保内存不泄漏,是不是这样子?