我用ATL写了一个WebBrowser浏览器,现在遇到廖数据转换问题:
如何将用户的POST数据获取。
//
// IDispatch Methods
//
STDMETHODIMP CAtlBrCon::Invoke(DISPID dispidMember, 
   REFIID riid, 
   LCID lcid, 
   WORD wFlags,
                               DISPPARAMS* pDispParams, 
   VARIANT* pvarResult,
                               EXCEPINFO*  pExcepInfo,  
   UINT* puArgErr)
{
   
//_ASSERT();   USES_CONVERSION;
    if (!pDispParams)
      return E_INVALIDARG;   switch (dispidMember)
   {
      //
      // The parameters for this DISPID are as follows:
      // [0]: Cancel flag  - VT_BYREF|VT_BOOL
      // [1]: HTTP headers - VT_BYREF|VT_VARIANT
      // [2]: Address of HTTP POST data  - VT_BYREF|VT_VARIANT 
      // [3]: Target frame name - VT_BYREF|VT_VARIANT 
      // [4]: Option flags - VT_BYREF|VT_VARIANT
      // [5]: URL to navigate to - VT_BYREF|VT_VARIANT
      // [6]: An object that evaluates to the top-level or frame 
      //      WebBrowser object corresponding to the event. 
      //
      case DISPID_BEFORENAVIGATE2:
          
  //if (pDispParams->rgvarg[0].vt==(VT_BYREF|VT_BOOL)) MessageBox("bool");
  //((*pDispParams).rgvarg)[2].pbool=FALSE;
  //pDispParams->rgvarg[0].pbool =FALSE;  
  if (pDispParams->cArgs >= 5 && pDispParams->rgvarg[5].vt == (VT_BYREF|VT_VARIANT))
         {
            
//pDispParams->rgvarg[0].boolVal=FALSE;  
//Get URL of Navigate
CComVariant vtURL(*pDispParams->rgvarg[5].pvarVal);
            vtURL.ChangeType(VT_BSTR);
//Get PostData Important
CComVariant vtPostData(*pDispParams->rgvarg[2].pparray);
vtPostData.ChangeType(VT_UI1);

//LPVOID lpArrayData;
//::SafeArrayAccessData( pDispParams->rgvarg[2].pvarVal, &lpArrayData );
/*
CComVariant vtPostData2(*vtPostData.pvarVal);
if (vtPostData2.vt !=VT_EMPTY)
{
SAFEARRAY * psa = *(vtPostData2.pparray);
LPSTR lp = NULL;
char buf[1024];
UINT len = SafeArrayGetDim(psa);
long lOffs[3];
lOffs[0] = 0;
lOffs[1] = len;
lOffs[2] = 0; SafeArrayGetElement(*(vtPostData2.pparray),lOffs,buf);             vtPostData2.ChangeType(VT_UI1);
SafeArrayAccessData(*(vtPostData2.pparray),(void**)&lp);
}
            vtPostData.ChangeType(VT_I1);
*/
 CString str;
//str.Format("%c",n);
//str.Format("%s",_T(((*pDispParams).rgvarg)[2].bstrVal));
str=OLE2T(vtPostData.bstrVal);
//if (str.Find("about.htm"))
    //m_spWebBrowser->Navigate(vtURL.bstrVal,NULL,NULL,NULL,NULL);
//m_spWebBrowser->Stop();
if (str.GetLength()>0) 
{
MessageBox(OLE2T(vtURL.bstrVal));
MessageBox(str);
}
((*pDispParams).rgvarg)[0].boolVal = FALSE;
pDispParams->rgvarg[0].boolVal = FALSE;
  }
         break;
            case DISPID_AMBIENT_DLCONTROL:
         {
            CComVariant vtResult(static_cast<long>(m_dwDLControl));
            *pvarResult = vtResult;
         }         break;      default:
         return DISP_E_MEMBERNOTFOUND;   }     return S_OK;
}