S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

如何实现自动化 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 方法类似于以下:
HRESULT Navigate([in] BSTR URL, [in] VARIANT* Flags,
                [in] VARIANT* TargetFrameName, [in] VARIANT* PostData,
                [in] VARIANT* Headers);
,以便执行 POST,仅,URL、 PostData 和 Headers 参数才相关。 在其他一个参数,请参阅 Internet Client SDK 文档信息。

要调用导航 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,执行下面的步骤:

  1. Visual Basic 中,请启动新的标准 EXE 项目。 默认情况下会创建 Form 1。 将下列控件添加到 Form 1:
       Object                     Name                  Caption
       -------------------------------------------------------------------
    
       Label                      lblName                First Name
       Label                      lblFlavor              Flavor
       CommandButton              cmdSubmit              Submit
    
       ComboBox                   cboFlavor
       TextBox                    txtName
       TextBox                    edtPostData
    (将多行 edtPostData 应和有滚动条)
  2. 从项目菜单中调用"参考",并 for"Microsoft Internet Controls"(SHDOCVW.DLL) 中添加对项目的引用。 请确保这是从引用对话框和不只是从组件对话框。
  3. 一般声明中插入以下代码部分:
          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
  4. 修改在调用该 URL 定位根据,关闭所有正在运行的实例的 IE,并从运行菜单中选择开始。
  5. 在名字文本框中输入您的姓名,选择一个的风格,然后单击提交命令按钮。 Visual Basic 窗体数据将过帐到 HTTP 服务器,并且响应将显示在可见的浏览器窗口中。

Visual C++

要演示在 Visual C++ 中的 POST,执行下面的步骤:

  1. 确保安装了 ActiveX 或 Internet Client SDK。
  2. 启动 Visual C++,并创建一个新的 Win 32 控制台项目。
  3. 创建一个新的文本文档并添加下面的代码:
          #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;
          }
  4. 修改适当,URL 引用,并保存代码。 将其添加到该的项目,然后生成。
  5. 关闭所有浏览器实例并运行该应用程序。
  6. 切换到正在运行的实例的 IE,以查看数据的过帐。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理