MSDN对他的描述是:
Allocates a new string and copies the passed string into it.
但是:BSTR  m_LoginIP = GetServerItem("REMOTE_ADDR");
BSTR m_LoginInfo = GetServerItem("ALL_HTTP");
....其他代码
BSTR m_Name = ::SysAllocString(L""); 在第一次调用的时候,
BSTR m_Name = ::SysAllocString(L""); 
这一步之后,会把m_LoginIP的值变掉,不知道为什么??之后再调用,就没有任何问题了。函数:
_bstr_t CReLogin::GetServerItem(_bstr_t bstrParam)
{
    CComPtr<IRequestDictionary> piDic;
    HRESULT hr;
    VARIANTARG vParam, vRet;    // 获得指定的
    hr = m_piRequest->get_ServerVariables(&piDic);
   if(FAILED(hr))
   {
   _bstr_t ret("Error");
       return ret.copy();
   }    // variant 屈狼 函荐 蔼阑 巩磊凯屈栏肺 函券茄促
    ::VariantInit(&vParam);
    vParam.vt = VT_BSTR;
    vParam.bstrVal = bstrParam;    piDic->get_Item(vParam, &vRet);    VARIANTARG varDest;
    VariantInit(&varDest);
    hr = VariantChangeType(&varDest, &vRet, 0, VT_BSTR);
   if(FAILED(hr))
   {
   _bstr_t ret("Error");
       return ret.copy();
   }    _bstr_t bstrRet1(varDest.bstrVal);    return bstrRet1.copy();}

解决方案 »

  1.   

    BSTR  m_LoginIP = GetServerItem("REMOTE_ADDR");
    // m_LoginIP无效,因为返回的_bstr_t释放了
    BSTR m_LoginInfo = GetServerItem("ALL_HTTP");
    // 同上同时
    _bstr_t CReLogin::GetServerItem(_bstr_t bstrParam)
    {
      ...
      return bstrRet1.copy();
    }
    引起内存泄露,因为函数里面相当于
     _bstr_t bstr = bstrRet1.copy(); // copy拷贝了一份内存,然后bstr也拷贝一份,跟着copy拷贝的内存失去引用。
     return bstr;这是一般C++错误,当然出问题了。修改如下
    _bstr_t m_LoginIP = GetServerItem("REMOTE_ADDR");
    _bstr_t m_LoginInfo = GetServerItem("ALL_HTTP");
      

  2.   

    ok 是这里错误,非常感谢,不过我对 BSTR 和 _bstr_t 两个不是很清楚。我程序里面是组件内调用组件,下面是组件内调用组件代码:hr = pLogin->Login(m_Seed,m_MainCookieVal,m_LoginIP,m_LoginInfo,&m_Curr_Sign,&newMainCookie,&newValiCookie,&m_Curr_Info,&m_MemberID,&m_Name);象这些返回值,好像只能用BSTR,不能用_bstr_t。(&m_Curr_Sign,&newMainCookie,&newValiCookie,&m_Curr_Info,&m_MemberID,&m_Name 这些变量),否则会出错。
    但是传入的,就只能用_bstr_t,不能用BSTR 否则就会出现被其他应用程序修改的情况。
    (m_Seed,m_MainCookieVal,m_LoginIP,m_LoginInfo, 这些变量)不知道为啥??
      

  3.   

    BSTR是指针,_bstr_t是类,封装了BSTR指针。_bstr_t是MS对标准C++库的扩展,以便不使用MFC和ATL的程序也可以方便的使用BSTR指针(MSDN里很多关于COM的SDK示例就是用_bstr_t),相关的扩展还有对VARIANT类型的封装类--_variant_t。ATL中对BSTR的封装类是CComBSTR,VARIANT的封装类是CComVariant。
    当你不想使用MFC和ATL,只想用C++标准库开发组件时,使用_bstr_t,_variant_t;否则_bstr_t、_varaint_t和CComBSTR、CComVariant都可以使用,推荐使用后者更方便些。
      

  4.   

    thanks  justleon(蜗牛)http://expert.csdn.net/Expert/topic/1674/1674725.xml这里我碰到一个问题,不知道到底那里内存地址不能写了。