zoukankan      html  css  js  c++  java
  • 用TWebBrowser组件在DELPHI中POST数据和取得网页源文件

    unit Unit1; 

    interface 

    uses 
     Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 
     Dialogs, StdCtrls, OleCtrls, SHDocVw; 

    type 
     TForm1 = class(TForm) 
       WebBrowser1: TWebBrowser; 
       Memo1: TMemo; 
       Button1: TButton; 
       procedure Button1Click(Sender: TObject); 
     private 
       { Private declarations } 
     public 
       { Public declarations } 
     end; 

    var 
     Form1: TForm1; 

    implementation 

    {$R *.dfm} 

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
     URL:OleVariant; 
     POST:OleVariant; 
     target:OleVariant; 
     flag:OleVariant; 
     header:OleVariant; 
     PostStr:String; 
     PostLen,Index:Integer; 
    begin 
     URL:='http://port.fudan.edu.cn:58080/amserver/UI/Login?goto=http%3A%2F%2Fwww.urp.fudan.edu.cn%3A81%2Fepstar%2Frs%2Fpr%2Fgwkh%2Fdzgwkh%2Fgr_dzgwkh_index.jsp&gotoOnFail=http://www.urp.fudan.edu.cn/portal?.flag=fail'; 
     PostStr:='Login.Token1=04538&Login.Token2=*******&Submit=%B5%C7+%C2%BC'; 
     target:=NULL; 
     flag:=0; 
     PostLen := Length(PostStr); 
     // 用构建 varByte 类型的 Variant array 
     Post := VarArrayCreate([0, (PostLen - 1)], varByte); 
     // 填充数据 
     for Index := 0 to PostLen - 1 do 
       Post[Index] := Ord(PostStr[Index + 1]); 
     // 填补头部数据注意:application 
     Header := 'Content-Type: application/x-www-form-urlencoded'; 

     WebBrowser1.Navigate2(URL,flag,target,POST,Header); 
     while WebBrowser1.Busy=True do 
        Application.ProcessMessages ; 
     if WebBrowser1.ReadyState <>READYSTATE_COMPLETE  then 
     Memo1.Text :=WebBrowser1.OleObject.Document.all.tags('HTML').Item(0).outerHTML; 
     else 
     Memo1.Text:='页面加载失败'; 
    end; 
    end. 

               < 2:WinInet函数相关 >

    DWORD dwConnectState; 
    CString strConnectState; 
    BOOL bOK = InternetGetConnectedState( &dwConnectState, 0); 
    if ( bOK ) 

      if ( dwConnectState & INTERNET_CONNECTION_LAN ) 
        strConnectState = "Local system uses a local area network to connect to the Internet. "; 
      if ( dwConnectState & INTERNET_CONNECTION_MODEM ) 
        strConnectState = "Local system uses a modem to connect to the Internet. "; 
      if ( dwConnectState & INTERNET_CONNECTION_MODEM_BUSY ) 
        strConnectState = "No longer used. "; 
      if ( dwConnectState = INTERNET_CONNECTION_PROXY ) 
        strConnectState = "Local system uses a proxy server to connect to the Internet. "; 

    测试连接是否有效,可以用:InternetCheckConnection 

    检测计算机是否联网比较简单的做法可以通过一个 Win32 Internet(WinInet) 函数 InternetCheckConnection来实现; 
    这个函数的功能是检查是否能够建立 Internet 连接。 
    它的实现是在 %SystemRoot%\System32\wininet.dll 中,Delphi 调用声明在 WinInet.pas 中, 
    其 API 声明如下: 

    BOOL InternetCheckConnection( 
        IN LPCSTR lpszUrl, 
        IN DWORD dwFlags, 
        IN DWORD dwReserved 
    ); 

    参数的意义是: 

    lpszUrl: 需要测试能否建立连接的 URL 地址,可以为空; 
    dwFlags: 目前只能是 FLAG_ICC_FORCE_CONNECTION(这个常量 Delphi 中没有声明,其值为 $00000001); 
    dwReserved: 目前只能为 0。 

    调用的说明: 

    如果 lpszUrl 是非空的,Windows 从中解析出 Host 名然后 Ping 这个指定的 Host。 
    如果 lpszUrl 是空的,并且 WinInet 内部服务器的 database 中有一个关于最近的 Server 的纪录,Windows 就从这条纪录中解析出 Host 名然后 Ping 它。 

    如果能够成功的连接返回 True,否则返回 False; 

    以下是一个判断当前计算机是否联网的例子: 

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
        if InternetCheckConnection('http://www.yahoo.com/', 1, 0) then 
            edit1.text:= 'Connected' 
        else 
            edit1.text:= 'Disconnected'; 
    end; 

    通过上述的方法只能检测出当前计算机是否物理联网,即网线是否接好,网卡是否能顺利工作,不能确定是否能够实现获得 Internet 服务,即是否能和 ISP 进行 Internet 连接。 
    这时可以通过另一个 Win32 Internet(WinInet) 函数 InternetQueryOption 来检测; 
    这个函数的功能是查询指定 Internet 句柄的状态、选项。 
    其 API 声明如下: 

    BOOL InternetQueryOption( 
        IN HINTERNET hInternet, 
        IN DWORD dwOption, 
        OUT LPVOID lpBuffer, 
        IN OUT LPDWORD lpdwBufferLength 
    ); 

    参数的意义是: 

    hInternet:查询对象的 Internet 句柄(全局查询时为 nil), 
    dwOption:查询的项目; 
    lpBuffer:返回的查询结果; 
    lpdwBufferLength:查询结果的字节长度(包括 IN 和 OUT); 

    查询成功返回 True,否则返回 False; 

    我们要查询当前计算机的 Internet 连接状态时可以使用查询项目 INTERNET_OPTION_CONNECTED_STATE, 

    得到的 ConnectState 返回值可能是以下值的一个或几个值之和: 

    INTERNET_STATE_CONNECTED               :$00000001 连接状态; 
    INTERNET_STATE_DISCONNECTED            :$00000002 非连接状态(和 INTERNET_STATE_CONNECTED 对应); 
    INTERNET_STATE_DISCONNECTED_BY_USER    :$00000010 用户请求的非连接状态 
    INTERNET_STATE_IDLE                    :$00000100 连接状态,并且空闲 
    INTERNET_STATE_BUSY                    :$00000200 连接状态,正在响应连接请求 

    以下是一个判断当前计算机是否可以获得 Internet 服务的例子: 

    function TForm1.CheckOffline: boolean; 
    var 
        ConnectState: DWORD; 
        StateSize: DWORD; 
    begin 
        ConnectState:= 0; 
        StateSize:= SizeOf(ConnectState); 
        result:= false; 
        if InternetQueryOption(nil, INTERNET_OPTION_CONNECTED_STATE, @ConnectState, StateSize) then 
            if (ConnectState and INTERNET_STATE_DISCONNECTED) <> 2 then result:= true; 
    end; 

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
        if CheckOffline then 
            edit1.text:= 'Connect To ISP' 
        else 
            edit1.text:= 'Disconnect To ISP'; 
    end; 

    需要说明的是 InternetQueryOption 函数的检测结果只能表明当前的 Internet 设置是可用的, 
    并不能表示计算机一定能访问 Internet,例如网线掉了,网卡突然坏了之类的错误就没法检测出来, 
    要想检测当前计算机是否能够获得 Internet 服务了必须两个函数结合起来使用。 

    以上程序在 Win2000, Delphi5.0 下调试通过。 

    最后要提醒大家注意的是在 uses 中要加上 WinInet。
  • 相关阅读:
    Uva 10779 collector's problem
    poj 2728 最优比率树(最小生成树问题)
    LA 3126 二分图匹配 最小路径覆盖
    poj 1149 最大流构图
    Step By Step(Java XML篇)
    Step By Step(Java 输入输出篇)
    Step By Step(Java 集合篇)
    Step By Step(Java 线程篇)
    Step By Step(Java 反射篇)
    Step By Step(Java 国际化篇)
  • 原文地址:https://www.cnblogs.com/MaxWoods/p/1289330.html
Copyright © 2011-2022 走看看