当前位置:C++技术网 > 资讯 > 在非UNICODE下,通过CHtmlView类怎么样实现POST

在非UNICODE下,通过CHtmlView类怎么样实现POST

更新时间:2016-08-11 00:12:25浏览次数:1+次

在非UNICODE下,通过CHtmlView类怎么样实现POST,(因为POST后要用浏览器来显示返回的数据)

C++技术网解答:

    CHtmlView类是MFC用于显示html网页的类,利用此类可以实现一个浏览器。类提供了很多的成员函数来轻松实现浏览器的常用功能。

    实现POST的成员函数如下:

void Navigate2(
   LPITEMIDLIST pIDL,
   DWORD dwFlags = 0,
   LPCTSTR lpszTargetFrameName = NULL 
);
void Navigate2(
   LPCTSTR lpszURL,
   DWORD dwFlags = 0,
   LPCTSTR lpszTargetFrameName = NULL,
   LPCTSTR lpszHeaders = NULL,
   LPVOID lpvPostData = NULL,
   DWORD dwPostDataLen = 0 
);
void Navigate2(
   LPCTSTR lpszURL,
   DWORD dwFlags,
   CByteArray& baPostedData,
   LPCTSTR lpszTargetFrameName = NULL,
   LPCTSTR lpszHeader = NULL 
);
     lpvPostData为POST提交的数据,dwPostDataLen指定POST提交的数据的长度。默认情况下,这些数据都是空的,也就是直接获取一个网页。而实现POST提交,需要设置其他参数。具体的参见MSDN的每一个参数的描述。

    因为这里的lpvPostData参数都是中性字符串,只要你将VS的字符集设置为多字节字符集就可以了。当然,设置了多字节字符集之后,数据直接用双引号括起来就行,不需要加_T("")了。


    鉴于提问的描述,你应该是实现了Unicode的版本,所以不做进一步的POST实现的解答了。有问题可以仔细阅读MSDN,就参数的传递问题了。


C++技术网解答:

下面是使用IWebBrowser2来实现的代码,测试通过,能够提交成功:

CComVariant sURL="http://localhost:32860/service/test.ashx";
CString sPostData="v=100\r\n";
BSTR bstrHeaders = NULL;
CComVariant vFlags = "", vTargetFrameName="", vPostData="", vHeaders="";
LPSAFEARRAY psa;
UINT cElems = sPostData.GetLength();
LPSTR pPostData;
LPVARIANT pvPostData;
HRESULT hr;
CComPtr<IWebBrowser2> pWebBrowser2;
CoInitialize(NULL);
hr = CoCreateInstance(CLSID_InternetExplorer,
    NULL,CLSCTX_LOCAL_SERVER,
    IID_IWebBrowser2,(void **)&pWebBrowser2); 
bstrHeaders = SysAllocString(L"Content-Type: application/x-www-form-urlencodedrn\r\n");
if (!bstrHeaders)
{
    MessageBox("不能分配bstrHeaders", "警告", MB_OK | MB_ICONWARNING);
    return;
} 

V_VT(&vHeaders) = VT_BSTR;
V_BSTR(&vHeaders) = bstrHeaders;

pvPostData = &vPostData;
if(pvPostData)
{
    VariantInit(pvPostData);
    psa = SafeArrayCreateVector(VT_UI1, 0, cElems);
    if(!psa)
    {
        return;
    }
    SafeArrayAccessData(psa, (LPVOID*)&pPostData);
    memset(pPostData,0,6);
    memcpy(pPostData, sPostData, cElems);
    SafeArrayUnaccessData(psa);
    V_VT(pvPostData) = VT_ARRAY | VT_UI1;
    V_ARRAY(pvPostData) = psa;
}
pWebBrowser2->Navigate2(&sURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders);
     sURL填写提交地址,sPostData填写POST的数据,记得结尾要加\r\n。bstrHeaders赋值后面的字符串也要加\r\n。