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。