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();}
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();}
// 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");
但是传入的,就只能用_bstr_t,不能用BSTR 否则就会出现被其他应用程序修改的情况。
(m_Seed,m_MainCookieVal,m_LoginIP,m_LoginInfo, 这些变量)不知道为啥??
当你不想使用MFC和ATL,只想用C++标准库开发组件时,使用_bstr_t,_variant_t;否则_bstr_t、_varaint_t和CComBSTR、CComVariant都可以使用,推荐使用后者更方便些。