调用方法:
SetCookieItem("ABCDEF","","1123344");
如果中间那个字段不是空,是给Cookies字典符值。下面是函数:STDMETHODIMP CLogin::SetCookieItem(_bstr_t bstrKey, _bstr_t bstrName, _bstr_t bstrValue)
{
CComPtr<IRequestDictionary> pDict; HRESULT hr = m_piResponse->get_Cookies(&pDict); if(FAILED(hr)) return hr; VARIANT vtCookieKey;
VariantInit(&vtCookieKey);
vtCookieKey.bstrVal = bstrKey;
vtCookieKey.vt = VT_BSTR; VARIANT vtCookieDict;
VariantInit(&vtCookieDict); hr = pDict->get_Item(vtCookieKey, &vtCookieDict);
if(FAILED(hr)) return hr;
CComPtr<IWriteCookie> pWriteCookie = (IWriteCookie*)(vtCookieDict.pdispVal); if (!bstrName.length())
{
VARIANT varOptional;
V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);
}
else
{
VARIANT vtCookieName;
VariantInit(&vtCookieName);
vtCookieName.bstrVal = bstrName;
vtCookieName.vt = VT_BSTR;
return pWriteCookie->put_Item(vtCookieName, bstrValue);
}
}
SetCookieItem("ABCDEF","","1123344");
如果中间那个字段不是空,是给Cookies字典符值。下面是函数:STDMETHODIMP CLogin::SetCookieItem(_bstr_t bstrKey, _bstr_t bstrName, _bstr_t bstrValue)
{
CComPtr<IRequestDictionary> pDict; HRESULT hr = m_piResponse->get_Cookies(&pDict); if(FAILED(hr)) return hr; VARIANT vtCookieKey;
VariantInit(&vtCookieKey);
vtCookieKey.bstrVal = bstrKey;
vtCookieKey.vt = VT_BSTR; VARIANT vtCookieDict;
VariantInit(&vtCookieDict); hr = pDict->get_Item(vtCookieKey, &vtCookieDict);
if(FAILED(hr)) return hr;
CComPtr<IWriteCookie> pWriteCookie = (IWriteCookie*)(vtCookieDict.pdispVal); if (!bstrName.length())
{
VARIANT varOptional;
V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);
}
else
{
VARIANT vtCookieName;
VariantInit(&vtCookieName);
vtCookieName.bstrVal = bstrName;
vtCookieName.vt = VT_BSTR;
return pWriteCookie->put_Item(vtCookieName, bstrValue);
}
}
在
if (!bstrName.length())
{
VARIANT varOptional;
V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);
}
中:
VARIANT varOptional;是否也需要Init,Clear?
要不就确任条件是否真的满足,即能进入这里吗?
用trace,要不干脆写入文件,观察运行情况
V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);这是我其他地方看到的代码,我也不清楚该给varOptional如何符值才能确保
pWriteCookie->put_Item() 是对Cookie符值,而不是给Cookie字典符值。谁知道呀??
This method adds a specified cookie to the write-only Cookie collection. HRESULT put_Item( VARIANT key,
//VARIANT that contains the name of the cookie
BSTR bstrValue
//binary string that contains the cookie value
);
Res
If key is an optional VARIANT parameter (V_VT(&key) == VT_ERROR && V_ERROR(&key) == DISP_E_PARAMNOTFOUND), then the cookie is treated as a simple cookie and bstrValue is the cookie’s value. Otherwise the cookie is treated as a dictionary cookie and bstrValue is the value for the cookie’s key. 如何给一个 VARIANT 符值,让它满足:
(V_VT(&key) == VT_ERROR && V_ERROR(&key) == DISP_E_PARAMNOTFOUND), 呀
V_ERROR(&varOptional) == DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);但是它没有把Cookie写进去呀。
http://support.microsoft.com/default.aspx?scid=kb;en-us;240191那里也只是给了Cookie字典的设置方法,没有给出简单Cookie的符值方法。
key.scode=DISP_E_PARAMNOTFOUND
<%
Response.Cookies("test10") = "haha"
%>而不是实现如下代码:
<%
Response.Cookies("test10")("test") = "haha"
%>网上可以找到的资料大多都是实现第二个的方式,而不是第一个。
低一个的实现方式只找到一个,就是上买提到的,但是那个执行没有效果,没有给Cookie符值。检查msdn文档,put_Item的第一个参数只要满足 If key is an optional VARIANT parameter (V_VT(&key) == VT_ERROR && V_ERROR(&key) == DISP_E_PARAMNOTFOUND), then the cookie is treated as a simple cookie and bstrValue is the cookie’s value.
但是我调试就是不行,不知道谁成功的在ATL下给简单Cookie符值???
{
CComPtr<IRequestDictionary> pDict;
HRESULT hr = m_piResponse->get_Cookies(&pDict);
if(FAILED(hr)) return hr;
VARIANT vtCookieKey;
VariantInit(&vtCookieKey);
vtCookieKey.bstrVal = bstrKey;
vtCookieKey.vt = VT_BSTR;
VARIANT vtCookieDict;
VariantInit(&vtCookieDict);
hr = pDict->get_Item(vtCookieKey, &vtCookieDict);
if(FAILED(hr)) return hr;
CComPtr<IWriteCookie> pWriteCookie = (IWriteCookie*)(vtCookieDict.pdispVal);
if (!bstrName.length())
{
VARIANT varOptional;
varOptional.vt=VT_ERROR;
varOptional.scode=DISP_E_PARAMNOTFOUND;
return pWriteCookie->put_Item(varOptional, bstrValue);
}
else
{
VARIANT vtCookieName;
VariantInit(&vtCookieName);
vtCookieName.bstrVal = bstrName;
vtCookieName.vt = VT_BSTR;
return pWriteCookie->put_Item(vtCookieName, bstrValue);
}}