如何實現自動化 Internet Explorer 以 POST 表單數據
Posted on 2009-10-20 19:57 S.l.e!ep.¢% 閱讀(743) 評論(0) 編輯 收藏 引用 所屬分類: COM如何實現自動化 Internet Explorer 以 POST 表單數據
?
概要
如 Microsoft Visual Basic 自動化控制器可以自動化 Internet Explorer (IE) 發送數據使用 POST...
如 Microsoft Visual Basic 自動化控制器可以自動化 Internet Explorer (IE) 發送數據使用 POST 方法的 HTTP 服務器 (如 Internet Information Server (IIS)。 本文演示如何使自動從 Visual Basic 并從簡單的 Visual C++ 應用程序執行窗體數據的 POST 的 IE。 該示例說明了整個 Internet Explorer 應用程序的自動化時, 相同的技術可應用于 Web 瀏覽器 ActiveX 控件當宿主于應用程序中時。
更多信息
幾種方法可用于將數據發送到 HTTP 服務器。 GET 和 POST 是目前最常見的。 POST 通常用于表單數據提交到 HTTP 服務器數據超過最大允許傳輸...
幾種方法可用于將數據發送到 HTTP 服務器。 GET 和 POST 是目前最常見的。 POST 通常用于表單數據提交到 HTTP 服務器數據超過最大允許傳輸使用 GET 方法時。 此限制通常是 2K 數據。
IE 公開 IWebBrowser(App) 接口到自動化控制器。 在 IWebBrowser(App) 接口公開一個導航方法。在接口定義語言 (IDL) 語法 (通用表示派生的同時 Visual Basic 和 Visual C++ 語法),Navigate 方法類似于以下:,以便執行 POST,僅,URL、 PostData 和 Headers 參數才相關。 在其他一個參數,請參閱 Internet Client SDK 文檔信息。
要調用導航 POST 到 HTTP 服務器的表單數據,URL 參數必須指定一個有效的地址 PostData 參數必須包含的字節的 SAFEARRAY 而且 Headers 參數必須包含 BSTR 包含以下 HTTP 標頭:
Internet Explorer 版本 3.0、 3.01 和 3.02 不支持 HTTP 過帳數據通過 Navigate 方法的服務器。 WinInet 和 URL 的標記是兩個可能的替代方法。 有關 WinInet 和標記的詳細信息,請參閱此參考一節。
請注意 Internet Explorer 腳本對象模型對象"窗口"有"定位"方法也。 這 Navigate 方法將只接受 URL,不能向 Web 服務器的 POST 數據。
若要測試以下示例,以下 Active Server Page (ASP) 應將保存到文件 NAVPOST.ASP 目錄中運行 Internet Information Server (IIS) 版本 3.0 的 NT 4.0 服務器上。 目錄應將識別由 IIS 為虛擬根目錄的執行權限:
IE 公開 IWebBrowser(App) 接口到自動化控制器。 在 IWebBrowser(App) 接口公開一個導航方法。在接口定義語言 (IDL) 語法 (通用表示派生的同時 Visual Basic 和 Visual C++ 語法),Navigate 方法類似于以下:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
[in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
[in] VARIANT* Headers);要調用導航 POST 到 HTTP 服務器的表單數據,URL 參數必須指定一個有效的地址 PostData 參數必須包含的字節的 SAFEARRAY 而且 Headers 參數必須包含 BSTR 包含以下 HTTP 標頭:
應用內容的類型: 程序 / x www 的窗體的 urlencoded
此標頭指示發送的數據進行編碼 HTML 規范中指定的規則。 Internet Explorer 版本 3.0、 3.01 和 3.02 不支持 HTTP 過帳數據通過 Navigate 方法的服務器。 WinInet 和 URL 的標記是兩個可能的替代方法。 有關 WinInet 和標記的詳細信息,請參閱此參考一節。
請注意 Internet Explorer 腳本對象模型對象"窗口"有"定位"方法也。 這 Navigate 方法將只接受 URL,不能向 Web 服務器的 POST 數據。
若要測試以下示例,以下 Active Server Page (ASP) 應將保存到文件 NAVPOST.ASP 目錄中運行 Internet Information Server (IIS) 版本 3.0 的 NT 4.0 服務器上。 目錄應將識別由 IIS 為虛擬根目錄的執行權限:
<HTML>
<%
cFlavor = Request("Flavor")
cName = Request("FName")
%>
<BODY>
Hello, <% =cName %>. <br>
One scoop of <% =cFlavor %> coming right up!
</BODY>
</HTML>Visual Basic
要演示在 Visual Basic 中的 POST,執行下面的步驟:- Visual Basic 中,請啟動新的標準 EXE 項目。 默認情況下會創建 Form 1。 將下列控件添加到 Form 1:
(將多行 edtPostData 應和有滾動條)
Object Name Caption ------------------------------------------------------------------- Label lblName First Name Label lblFlavor Flavor CommandButton cmdSubmit Submit ComboBox cboFlavor TextBox txtName TextBox edtPostData
- 從項目菜單中調用"參考",并 for"Microsoft Internet Controls"(SHDOCVW.DLL) 中添加對項目的引用。 請確保這是從引用對話框和不只是從組件對話框。
- 一般聲明中插入以下代碼部分:
Dim g_oIE As InternetExplorer ' Global reference to an ' instance of IE Private Sub cmdSubmit_Click() edtPostData.Text = "" ' Initialize an edit box for testing ReDim aByte(0) As Byte ' Array of bytes to hold data to post ' Extract the URL encoded data from the UI, ' and pack it into an array of bytes cFlavor = cboFlavor.List(cboFlavor.ListIndex) cParamName = "FName=" cParamFlavor = "Flavor=" cSeparator = "&" cPostData = cParamName & txtName.Text _ & cSeparator & cParamFlavor & cFlavor PackBytes aByte(), cPostData ' For testing, rebuild the POST data and stuff ' it into an edit box For i = LBound(aByte) To UBound(aByte) edtPostData = edtPostData + Chr(aByte(i)) Next Dim vPost As Variant vPost = aByte ' Assign the byte array to a VARIANT Dim vFlags As Variant Dim vTarget As Variant Dim vHeaders As Variant vHeaders = _ "Content-Type: application/x-www-form-urlencoded" _ + Chr(10) + Chr(13) ' You're done. Now call Navigate ' Note: modify path to server as appropriate g_oIE.Navigate "http://<server>/scripts/navpost.asp", _ vFlags, vTarget, vPost, vHeaders End Sub Private Sub Form_Load() ' Create an instance of IE Set g_oIE = New InternetExplorer g_oIE.Visible = True ' Populate a combobox with some flavor choices cboFlavor.List(0) = "Vanilla" cboFlavor.List(1) = "Chocolate" cboFlavor.List(2) = "Strawberry" cboFlavor.ListIndex = 0 ' The default choice End Sub ' Utility function to pack the data to post into an array of bytes Private Sub PackBytes(ByteArray() As Byte, ByVal PostData As String) iNewBytes = Len(PostData) - 1 ' Get rid of the null termination If iNewBytes < 0 Then Exit Sub End If ReDim ByteArray(iNewBytes) For i = 0 To iNewBytes ch = Mid(PostData, i + 1, 1) If ch = Space(1) Then ch = "+" End If ByteArray(i) = Asc(ch) Next End Sub - 修改在調用該 URL 定位根據,關閉所有正在運行的實例的 IE,并從運行菜單中選擇開始。
- 在名字文本框中輸入您的姓名,選擇一個的風格,然后單擊提交命令按鈕。 Visual Basic 窗體數據將過帳到 HTTP 服務器,并且響應將顯示在可見的瀏覽器窗口中。
Visual C++
要演示在 Visual C++ 中的 POST,執行下面的步驟:- 確保安裝了 ActiveX 或 Internet Client SDK。
- 啟動 Visual C++,并創建一個新的 Win 32 控制臺項目。
- 創建一個新的文本文檔并添加下面的代碼:
#include <windows.h> #define INITGUID #include <initguid.h> #include <exdisp.h> #include <memory.h> HRESULT GetPostData(LPVARIANT pvPostData); void main() { HRESULT hr; IWebBrowserApp* pWBApp = NULL; // Derived from IWebBrowser BSTR bstrURL = NULL, bstrHeaders = NULL; VARIANT vFlags = {0}, vTargetFrameName = {0}, vPostData = {0}, vHeaders = {0}; if (FAILED(hr = CoInitialize(NULL))) { return; } if (FAILED(hr = CoCreateInstance(CLSID_InternetExplorer, NULL, CLSCTX_SERVER, IID_IWebBrowserApp, (LPVOID*)&pWBApp))) { goto Error; } bstrURL = SysAllocString(L"http://<server>/scripts/navpost.asp"); if (!bstrURL) { goto Error; } bstrHeaders = SysAllocString( L"Content-Type: application/x-www-form-urlencoded\r\n"); if (!bstrHeaders) { goto Error; } V_VT(&vHeaders) = VT_BSTR; V_BSTR(&vHeaders) = bstrHeaders; hr = GetPostData(&vPostData); hr = pWBApp->Navigate(bstrURL, &vFlags, &vTargetFrameName, &vPostData, &vHeaders); pWBApp->put_Visible(VARIANT_TRUE); Error: if (bstrURL) SysFreeString(bstrURL); if (bstrHeaders) SysFreeString(bstrHeaders); VariantClear(&vPostData); if (pWBApp) pWBApp->Release(); CoUninitialize(); } // Pack some data into a SAFEARRAY of BYTEs. Return in a VARIANT HRESULT GetPostData(LPVARIANT pvPostData) { HRESULT hr; LPSAFEARRAY psa; LPCTSTR cszPostData = "FName=Matt&Flavor=Mocha+Chip"; UINT cElems = lstrlen(cszPostData); LPSTR pPostData; if (!pvPostData) { return E_POINTER; } VariantInit(pvPostData); psa = SafeArrayCreateVector(VT_UI1, 0, cElems); if (!psa) { return E_OUTOFMEMORY; } hr = SafeArrayAccessData(psa, (LPVOID*)&pPostData); memcpy(pPostData, cszPostData, cElems); hr = SafeArrayUnaccessData(psa); V_VT(pvPostData) = VT_ARRAY | VT_UI1;V_ARRAY(pvPostData) = psa; return NOERROR; } - 修改適當,URL 引用,并保存代碼。 將其添加到該的項目,然后生成。
- 關閉所有瀏覽器實例并運行該應用程序。
- 切換到正在運行的實例的 IE,以查看數據的過帳。

回到頂端

