调用方法:
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);
    }
}

解决方案 »

  1.   

    用这个函数给Cookie字典符值没问题,普通Cookie符值就没法符值,也没有任何执行期错误。   if (!bstrName.length())这里来判断是要给那种Cookie符值msdn上这么写的;IWriteCookie:, put_ItemIf you pass key as an Automation optional parameter, the cookie is treated as a simple cookie and its value is set to bstrValue. Otherwise, the cookie is treated as a dictionary cookie and bstrValue is the value for the cookie's key.
      

  2.   

    没有任何经验,猜测而已。

     if (!bstrName.length())
        {
    VARIANT varOptional;
    V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
    return pWriteCookie->put_Item(varOptional, bstrValue);
        }
    中:
    VARIANT varOptional;是否也需要Init,Clear?
    要不就确任条件是否真的满足,即能进入这里吗?
    用trace,要不干脆写入文件,观察运行情况
      

  3.   

    VARIANT varOptional;
    V_ERROR(&varOptional) = DISP_E_PARAMNOTFOUND;
    return pWriteCookie->put_Item(varOptional, bstrValue);这是我其他地方看到的代码,我也不清楚该给varOptional如何符值才能确保
    pWriteCookie->put_Item() 是对Cookie符值,而不是给Cookie字典符值。谁知道呀??
      

  4.   

    IWriteCookie::put_Item
    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), 呀
      

  5.   

    网上我只能找到这样的代码:VARIANT varOptional;
    V_ERROR(&varOptional) == DISP_E_PARAMNOTFOUND;
    return pWriteCookie->put_Item(varOptional, bstrValue);但是它没有把Cookie写进去呀。
      

  6.   

    对,单步调试进去了,执行了,没问题。但是Asp下检测Cookie 没有写进去。
      

  7.   

    刚刚查了一下微软的知识库:
    http://support.microsoft.com/default.aspx?scid=kb;en-us;240191那里也只是给了Cookie字典的设置方法,没有给出简单Cookie的符值方法。
      

  8.   

    key.vt=VT_ERROR
    key.scode=DISP_E_PARAMNOTFOUND
      

  9.   

    为了问题描述清楚。我简单再描述一下:也就是在ATL 中实现asp下的如下代码:
    <%
    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符值???
      

  10.   

    thanks  zzyx(菜农) 就是那样的写法,正确的这个函数应该是:STDMETHODIMP CReLogin::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;
    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);
    }}
      

  11.   

    To : ghj1976 (蝈蝈俊.net) 曾经的那个拿着大刀满水园砍人的大侠,如今到是很难见到你哦。我们可是老朋友了,可能你还不记得我,刚上CSDN的时候,就觉得你最NB.不知道是不是这个错,但这样子写是有问题的:CComPtr<IWriteCookie> pWriteCookie = (IWriteCookie*)(vtCookieDict.pdispVal);CComPtr的构造函数被输入参数不为IWriteCookie*的时候,它会在vtCookieDict.pdispVal上执行一个QueryInferface的操作。而你的程序直接用C++的强制转换将IDispatch*转換为IWriteCookie*类型,导致这个QueryInterface操作没有被执行。所以pWriteCookie包含的不是一个正确的IWriteCookie指针,而是IDispatch*
      

  12.   

    to:  Erlin  现在已经不再去灌水乐园了,只是去去VC++  .net 社区支持 ;上面我的代码已经编译通过,没有错误了。不过你说的:CComPtr的构造函数被输入参数不为IWriteCookie*的时候,它会在vtCookieDict.pdispVal上执行一个QueryInferface的操作。而你的程序直接用C++的强制转换将IDispatch*转換为IWriteCookie*类型,导致这个QueryInterface操作没有被执行。所以pWriteCookie包含的不是一个正确的IWriteCookie指针,而是IDispatch*我不是很懂,那如何获得IWriteCookie* 呀??