如 Microsoft Visual Basic 自動(dòng)化控制器可以自動(dòng)化 Internet Explorer (IE) 發(fā)送數(shù)據(jù)使用 POST 方法的 HTTP 服務(wù)器 (如 Internet Information Server (IIS)。 本文演示如何使自動(dòng)從 Visual Basic 并從簡(jiǎn)單的 Visual C++ 應(yīng)用程序執(zhí)行窗體數(shù)據(jù)的 POST 的 IE。 該示例說(shuō)明了整個(gè) Internet Explorer 應(yīng)用程序的自動(dòng)化時(shí), 相同的技術(shù)可應(yīng)用于 Web 瀏覽器 ActiveX 控件當(dāng)宿主于應(yīng)用程序中時(shí)。
幾種方法可用于將數(shù)據(jù)發(fā)送到 HTTP 服務(wù)器。 GET 和 POST 是目前最常見(jiàn)的。 POST 通常用于表單數(shù)據(jù)提交到 HTTP 服務(wù)器數(shù)據(jù)超過(guò)最大允許傳輸使用 GET 方法時(shí)。 此限制通常是 2K 數(shù)據(jù)。
IE 公開(kāi) IWebBrowser(App) 接口到自動(dòng)化控制器。 在 IWebBrowser(App) 接口公開(kāi)一個(gè)導(dǎo)航方法。在接口定義語(yǔ)言 (IDL) 語(yǔ)法 (通用表示派生的同時(shí) Visual Basic 和 Visual C++ 語(yǔ)法),Navigate 方法類似于以下:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
[in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
[in] VARIANT* Headers);
,以便執(zhí)行 POST,僅,URL、 PostData 和 Headers 參數(shù)才相關(guān)。 在其他一個(gè)參數(shù),請(qǐng)參閱 Internet Client SDK 文檔信息。
要調(diào)用導(dǎo)航 POST 到 HTTP 服務(wù)器的表單數(shù)據(jù),URL 參數(shù)必須指定一個(gè)有效的地址 PostData 參數(shù)必須包含的字節(jié)的 SAFEARRAY 而且 Headers 參數(shù)必須包含 BSTR 包含以下 HTTP 標(biāo)頭:
應(yīng)用內(nèi)容的類型: 程序 / x www 的窗體的 urlencoded
此標(biāo)頭指示發(fā)送的數(shù)據(jù)進(jìn)行編碼 HTML 規(guī)范中指定的規(guī)則。
Internet Explorer 版本 3.0、 3.01 和 3.02 不支持 HTTP 過(guò)帳數(shù)據(jù)通過(guò) Navigate 方法的服務(wù)器。 WinInet 和 URL 的標(biāo)記是兩個(gè)可能的替代方法。 有關(guān) WinInet 和標(biāo)記的詳細(xì)信息,請(qǐng)參閱此參考一節(jié)。
請(qǐng)注意 Internet Explorer 腳本對(duì)象模型對(duì)象"窗口"有"定位"方法也。 這 Navigate 方法將只接受 URL,不能向 Web 服務(wù)器的 POST 數(shù)據(jù)。
若要測(cè)試以下示例,以下 Active Server Page (ASP) 應(yīng)將保存到文件 NAVPOST.ASP 目錄中運(yùn)行 Internet Information Server (IIS) 版本 3.0 的 NT 4.0 服務(wù)器上。 目錄應(yīng)將識(shí)別由 IIS 為虛擬根目錄的執(zhí)行權(quán)限:
<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,執(zhí)行下面的步驟:
- Visual Basic 中,請(qǐng)啟動(dòng)新的標(biāo)準(zhǔn) EXE 項(xiàng)目。 默認(rèn)情況下會(huì)創(chuàng)建 Form 1。 將下列控件添加到 Form 1:
Object Name Caption
-------------------------------------------------------------------
Label lblName First Name
Label lblFlavor Flavor
CommandButton cmdSubmit Submit
ComboBox cboFlavor
TextBox txtName
TextBox edtPostData
(將多行 edtPostData 應(yīng)和有滾動(dòng)條) - 從項(xiàng)目菜單中調(diào)用"參考",并 for"Microsoft Internet Controls"(SHDOCVW.DLL) 中添加對(duì)項(xiàng)目的引用。 請(qǐng)確保這是從引用對(duì)話框和不只是從組件對(duì)話框。
- 一般聲明中插入以下代碼部分:
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
- 修改在調(diào)用該 URL 定位根據(jù),關(guān)閉所有正在運(yùn)行的實(shí)例的 IE,并從運(yùn)行菜單中選擇開(kāi)始。
- 在名字文本框中輸入您的姓名,選擇一個(gè)的風(fēng)格,然后單擊提交命令按鈕。 Visual Basic 窗體數(shù)據(jù)將過(guò)帳到 HTTP 服務(wù)器,并且響應(yīng)將顯示在可見(jiàn)的瀏覽器窗口中。
Visual C++
要演示在 Visual C++ 中的 POST,執(zhí)行下面的步驟:
- 確保安裝了 ActiveX 或 Internet Client SDK。
- 啟動(dòng) Visual C++,并創(chuàng)建一個(gè)新的 Win 32 控制臺(tái)項(xiàng)目。
- 創(chuàng)建一個(gè)新的文本文檔并添加下面的代碼:
#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;
}
- 修改適當(dāng),URL 引用,并保存代碼。 將其添加到該的項(xiàng)目,然后生成。
- 關(guān)閉所有瀏覽器實(shí)例并運(yùn)行該應(yīng)用程序。
- 切換到正在運(yùn)行的實(shí)例的 IE,以查看數(shù)據(jù)的過(guò)帳。