2008年3月25日 星期二

如何使用IWebBrowser2 加入自定的Header - MFC

相信很多人都曾有過在自己的視窗程式中,鉗入一個IE元件,也就是IWebBrowser2這個Interface,最近我也在寫類似的功能,這次要在HTTP的Header中,加入自訂的設定與資訊;在google找到的範例中,對於GET是可行的,也已經解決一半的問題,但是在遇到需要用POST時,會發現這些範例,不論怎麼傳,都還是GET的方式。
加入自訂的Header方式,主要是利用BeforeNavigate2這個Event。如果是用MFC來實作的話,你會有一個類似
BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel) 這個函數。
首先在這個Event中,把Cancel設成TRUE (*Cancel = TRUE),然後再這個函數中,再呼叫一次Navigate2,並傳入自訂的header。
以下是我的方式。(請不要照抄,因為只是說明,並不是可以執行的程式)
void CMyDlg::BeforeNavigate2Explorer1(LPDISPATCH pDisp, VARIANT* URL, VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData, VARIANT* Headers, BOOL* Cancel)
{
// 用來判斷是不是自己發出的Navigate2,一開始m_bIsReNavigate是FALSE!
this->m_bIsReNavigate = !this->m_bIsReNavigate;

if(this->m_bIsReNavigate) {
*Cancel = TRUE;
_variant_t header;
// 加入自己的Header ex: AAA:BBBrn
header.SetString(my_header_string);

_variant_t p;
_variant_t e(VT_EMPTY);
// Copy使用者傳的POST資料,請用VariantCopyInd,不要用VariantCopy;因為PostData有safearray,如果用VariantCopy,並不會把array複製進來。
VariantCopyInd(&p, PostData);
// 重新再Request一次
this->m_browser.Navigate2(URL, &e, &e, &p, &header);
}// if(this->m_bIsReNavigate)
}
張貼留言