我在我的一个Windows Mobile项目中,需要使用内嵌的IE浏览器,我使用了Web Browser Control这个控件,通过IWebBrower2这个interface进行控制。但令人郁闷的是,使用这个控件,可以成功的发出GET请求(使用IWebBrowser2::Navigate),但是始终不能发出POST请求。
我仔细的检查了我的每一行代码,根据网上给出的DEMO,代码本身应该不存在问题。因为我使用了完全相同的代码在WIN32平台上进行测试,发现是可以正常的发出POST请求的。我怀疑是否是WM平台下该控件不支持由API发起POST请求?尽快MSDN上相关材料上说是支持的。
下面是我的代码,请高手看看是否存在问题,或者是确实是PIE这个控件的问题?
RECT rectClient;
GetClientRect(&rectClient);
CoInitializeEx(NULL, COINIT_MULTITHREADED);
// create browser control
BOOL ret = m_browser.CreateControl(CLSID_WebBrowser,
NULL,
WS_VISIBLE | WS_BORDER | WS_CHILD,
rectClient,
this,
AFX_IDW_PANE_FIRST);
LPUNKNOWN lpunk = m_browser.GetControlUnknown();
HRESULT hr = lpunk->QueryInterface(IID_IWebBrowser2, (void**)&m_pBrowser);
BSTR url = SysAllocString(L"http://localhost/");
// post data
VARIANT vPostData = {0};
LPSAFEARRAY psa;
char* postData = "username=name&password=word";
UINT num = strlen(postData);
VariantInit(&vPostData);
psa = SafeArrayCreateVector(VT_UI1, 0, num);
char* pPostData = NULL ;
hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData);
memcpy(pPostData, postData, num);
hr = SafeArrayUnaccessData(psa);
V_VT(&vPostData) = VT_ARRAY | VT_UI1;
V_ARRAY(&vPostData) = psa;
//headers
VARIANT vHeader = {0};
VariantInit(&vHeader);
BSTR bstrHeaders = SysAllocString(
L"Content-Type: application/x-www-form-urlencoded\r\n");
V_VT(&vHeader) = VT_BSTR;
V_BSTR(&vHeader) = bstrHeaders;
m_pBrowser->put_Visible(VARIANT_TRUE);
m_pBrowser->put_AddressBar(VARIANT_TRUE);
m_pBrowser->put_StatusBar(VARIANT_TRUE);
VARIANT vUrl ={0};
VariantInit(&vUrl);
V_VT(&vUrl) = VT_BSTR;
V_BSTR(&vUrl)= url;
hr = m_pBrowser->Navigate2(&vUrl,NULL,NULL,&vPostData,&vHeader);