• 盒子 收藏帖子 转移-实现向网页自动填写用户名密码并自动点击登录按钮 完成全自动凳录


    //实现向网页自动填写用户名密码并自动点击登录按钮  完成全自动凳录
    
    Function FillForm(WebBrowser: TWebBrowser2; FieldName: String; Value: String):
      Boolean;
    Var
      i, j: Integer;
      FormItem: Variant;
    Begin
      Result := False;
      //no form on document
      If WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 Then
        Begin
          Exit;
        End;
      For I := 0 To WebBrowser.OleObject.Document.forms.Length - 1 Do
        Begin
          FormItem := WebBrowser.OleObject.Document.forms.Item(I);
          For j := 0 To FormItem.Length - 1 Do
            Begin
              Try
              //when the fieldname is found, try to fill out
              If FormItem.Item(j).Name = FieldName Then
              Begin
              FormItem.Item(j).Value := Value;
              Result := True;
              End;
              Except
              Exit;
              End;
            End;
        End;
    End;
    
    FillForm(浏览器控件名称, 编辑框名称, 内容)

     str := (Webbrowser1.Document as IHTMLDocument2).cookie;

    Ver: TFixedFileInfo;
    begin
    Ver := FileInfo(Application.ExeName);
    Edition.Caption := '软件版本:' + IntToStr(Ver.wFileVersionLS) + '.' +
          IntToStr(Ver.wFileVersionMS) + '.' +
          IntToStr(Ver.wProductVersionLS) + '.' +
          IntToStr(Ver.wProductVersionMS) + ' - [正式版]';
    end;

    这样,明白了吗?
    ---------------------------------------------- 
    有空来俺们的小站逛逛(http://www.e8e.net)
    作者:
    男 star5 (星五) ▲▲▲▲△ -
    盒子活跃会员
    2008-12-25 18:41:32
    2楼: 其他,如文件大小什么什么的,自己搜索下。
    ---------------------------------------------- 
    SOS!关于Record初始值一个问题! 浏览:1247
    加入我的收藏
    楼主: 我有个结构是这样子的
      TConfig = record
          A: Boolean;
          B: Integer;
          C: Boolean;
          D: Integer;
          //以此类推  非常多,下面还有数组
       sName: array[0..8] of string;
       boUse: array[0..8] of Boolean;
       wNum:  array[0..8] of Word;
      end;

    var
      Config: TConfig = (
          A: False;
          B: 0;
          C: True;
          D: 2;
          //以此类推  非常多,下面还有数组
       sName:('1','2','3','4','5','6','7','8');
       boUse:(False, True, False, False, True, False, True, False, False); 
       wNum: (0, 1, 0, 4, 0, 3, 0, 0, 0);
       );



    当定义时,初始了,在程序运行中,需要初始成定义时的数据,只能一个个赋值吗?还是有其它办法吗?
    ---------------------------------------------- 
    delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
     
    作者:
    男 wr960204 (武稀松) ▲▲▲▲▲ -
    盒子活跃会员
    2010-12-15 21:31:49
    1楼: 全局变量或Const定义的常量可以给初始值
    ---------------------------------------------- 
    武稀松http://www.raysoftware.cn
    作者:
    男 wqyfavor (wqyfavor) ▲▲▲▲△ -
    普通会员
    2010-12-15 21:44:32
    2楼: 不懂得你说的在程序中初始是什么意思。应该是你想说在程序运行时为整个Record赋值吧,那直接 := 就可以了。
    ---------------------------------------------- 
    http://hi.baidu.com/wqyfavor
    作者:
    男 q34625474 (q34625474) ▲▲▲▲△ -
    盒子活跃会员
    2010-12-15 21:48:10
    3楼: TO wqyfavor 

    在程序运行的时候 用户可以修改 结构中的类型数据    用户还可以执行恢复默认设置,  当他恢复默认设置的时候 能否将这个结构初始化成    结构定义那里的值     只能一个一个的赋予给结构中的成员吗?
    ---------------------------------------------- 
    delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
    作者:
    男 supermay (supermay) ▲▲▲▲▲ -
    盒子活跃会员
    2010-12-15 22:35:16
    4楼: 没有办法
    统一值的话,你可以用fillchar
    ---------------------------------------------- 
    卖源码http://item.taobao.com/item.htm?spm=686.1000925.1000774.16.gmrHsT&id=37407600038每天点一下广告,支持盒子不关闭按此在新窗口浏览图片
    作者:
    男 wqyfavor (wqyfavor) ▲▲▲▲△ -
    普通会员
    2010-12-15 23:17:55
    5楼: 恢复成定义那里的值,你可以把那个定义改成const啊,就是一个常量。然后赋值给你的变量就可以了啊。
    ---------------------------------------------- 
    http://hi.baidu.com/wqyfavor
    作者:
    男 q34625474 (q34625474) ▲▲▲▲△ -
    盒子活跃会员
    2010-12-16 2:32:19
    6楼: to wqyfavor  
    你还是不懂得我的意识
    结构内非常多  如果一个一个赋值  会很麻烦  我想整个RECORD初始值
    ---------------------------------------------- 
    delphi众人拾柴火焰高!支持盒子~~~~~~~~~~
    作者:
    男 wr960204 (武稀松) ▲▲▲▲▲ -
    盒子活跃会员
    2010-12-16 9:29:30
    7楼: 都告诉你了.
    全局变量或Const定义的常量可以给初始值.
    你先定义一个全局变量或常量.
    当想赋初始值的时候就等于这个变量或常量不就得了.
    ---------------------------------------------- 
    武稀松http://www.raysoftware.cn
    作者:
    男 adamwu (AdamWu) ▲▲▲△△ -
    注册会员
    2010-12-16 10:38:44
    8楼: 不知道string, interface等能不能自动处理。
    不过如果有动态数组或者对象引用那肯定是不能直接等于的。
    ---------------------------------------------- 
    -
    作者:
    男 lbq971101 (lbq971101) ▲▲▲▲▲ -
    盒子活跃会员
    2010-12-17 18:42:21
    9楼: 用CopyMemory就可以了,不用一个一个赋值
    ---------------------------------------------- 
    兼金软件工作室
    作者:
    男 egust (欢迎访问 Delphi@smth.org) ▲▲▲▲△ -
    普通会员
    2010-12-17 19:02:27
    10楼: 像 lz 给出来的 record(成员包括自动管理生存期的 string 类型),CopyMemory/Move 属于找死的行为,必须要用“:=”标准赋值语句,或者自己调 system._CopyRecord 才行(后者还很麻烦)。FillChar/ZeroMemory 除非在还没使用过该局部变量的时候用,否则只要任何一个 string 里有指向非常量的内容,就会产生内存泄露。
    ---------------------------------------------- 
    cnblogs中我写的关于Delphi的blog,欢迎访问:
    http://www.cnblogs.com/egust/
    作者:
    男 bmsr (白忙剩人) ▲▲▲▲△ -
    普通会员
    2010-12-17 19:24:29
    11楼: 给你个例子自己去看
      RecBskyCust = record
        Ver: integer;
        Cust_ID: integer;
        Cust_name: string[40];
        Cust_NiName: string[40];
        Email: shortstring;
        MPhone: string[80];
        Phone: string[80];
        SFZ: string[18];
        pass: string[40];
        Func: integer;
        Reg_Time: TDateTime;
        UpDate_Time: TDateTime;
        QQ: integer;
        Msn: shortstring;
        OtherIM: shortstring;
        Company: shortstring;
        Area_Code: integer;
        PostCode: integer;
        Address: shortstring;
        CUST_STATES: TPassStates;
        Descr: string;
      end;

    function CopyRecord(Rs: RecBskyCust; var RD: RecBskyCust): boolean; overload;
    begin
      Result := False;
      try
        DisposeRecord(RD);
        System.move(Rs, RD, sizeof(Rs) - sizeof(string));
        RD.Descr := Rs.Descr;
        Result := True;
      except
        on E: Exception do
          Application.MessageBox(PChar(E.Message + '错误号:' + IntToStr(E.HelpContext)), '错误!', MB_OK + MB_ICONERROR + MB_TOPMOST);
      end;

    end;

    function DisposeRecord(Var R: RecBskyCust): boolean;
    begin
      Result := False;
      try
        R.Descr := '';
        zeromemory(@R, sizeof(R));
        Result := True;
      except
        on E: Exception do
          Application.MessageBox(PChar(E.Message + '错误号:' + IntToStr(E.HelpContext)), '错误!', MB_OK + MB_ICONERROR + MB_TOPMOST);
      end;
    end;
    除了string 类型  还有动态数组和其它指针类型也需要单独处理,所以尽量把这类数据类型放到record的最后

    网上有这种代码了,只是因为写的较早,有些地方写的不那么言简意赅,而且在XE后的版本中有问题(因为Unicode字符的关系)

    下面是精简修改过的代码,只取第一块硬盘的序列号,Win7 + XE 测试通过。需要先安装JwApi函数库,因为有些结构体在库中有声明了

    [delphi] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. unit uGetHDSN;  
    2.   
    3. interface  
    4.   
    5. uses  
    6.   Windows, JwaWinIoctl;  
    7.   
    8. function GetIdeSerialNumber: AnsiString;  
    9.   
    10. implementation  
    11.   
    12. type  
    13.   
    14.   TIdSector = packed record  
    15.     wGenConfig: USHORT;  
    16.     wNumCyls: USHORT;  
    17.     wReserved: USHORT;  
    18.     wNumHeads: USHORT;  
    19.     wBytesPerTrack: USHORT;  
    20.     wBytesPerSector: USHORT;  
    21.     wSectorsPerTrack: USHORT;  
    22.     wVendorUnique: array [0 .. 2] of USHORT;  
    23.     sSerialNumber: array [0 .. 19] of AnsiChar;  
    24.     wBufferType: USHORT;  
    25.     wBufferSize: USHORT;  
    26.     wECCSize: USHORT;  
    27.     sFirmwareRev: array [0 .. 7] of AnsiChar;  
    28.     sModelNumber: array [0 .. 39] of AnsiChar;  
    29.     wMoreVendorUnique: USHORT;  
    30.     wDoubleWordIO: USHORT;  
    31.     wCapabilities: USHORT;  
    32.     wReserved1: USHORT;  
    33.     wPIOTiming: USHORT;  
    34.     wDMATiming: USHORT;  
    35.     wBS: USHORT;  
    36.     wNumCurrentCyls: USHORT;  
    37.     wNumCurrentHeads: USHORT;  
    38.     wNumCurrentSectorsPerTrack: USHORT;  
    39.     ulCurrentSectorCapacity: ULONG;  
    40.     wMultSectorStuff: USHORT;  
    41.     ulTotalAddressableSectors: ULONG;  
    42.     wSingleWordDMA: USHORT;  
    43.     wMultiWordDMA: USHORT;  
    44.     bReserved: array [0 .. 127] of Byte;  
    45.   end;  
    46.   
    47.   PIdSector = ^TIdSector;  
    48.   
    49. const  
    50.   IDE_ATA_IDENTIFY = $EC;  
    51.   
    52. function LittleToBig(Data: Word): Word;  
    53. asm  
    54.   xchg ah, al  
    55. end;  
    56.   
    57. function GetIdeSerialNumber: AnsiString;  
    58. var  
    59.   hDevice: THandle;  
    60.   Size, cbBytesReturned: DWORD;  
    61.   SCIP: TSendCmdInParams;  
    62.   SCOP: PSendCmdOutParams;  
    63.   P: PWORD;  
    64.   I: Integer;  
    65. begin  
    66.   Result := '';  
    67.   
    68.   hDevice := CreateFile('\.PhysicalDrive0', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or  
    69.     FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);  
    70.   
    71.   if hDevice = INVALID_HANDLE_VALUE then  
    72.     Exit;  
    73.   
    74.   Size := SizeOf(TSendCmdOutParams) + IDENTIFY_BUFFER_SIZE - 1;  
    75.   SCOP := AllocMem(Size);  
    76.   
    77.   SCIP.irDriveRegs.bCommandReg := IDE_ATA_IDENTIFY;  
    78.   
    79.   if DeviceIoControl(hDevice, SMART_RCV_DRIVE_DATA, @SCIP, SizeOf(TSendCmdInParams) - 1, SCOP, Size,  
    80.     cbBytesReturned, nil) = False then  
    81.   begin  
    82.     FreeMem(SCOP);  
    83.     CloseHandle(hDevice);  
    84.     Exit;  
    85.   end;  
    86.   
    87.   // 处理一下序列号在内存中的顺序  
    88.   with PIdSector(@SCOP^.bBuffer[0])^ do  
    89.   begin  
    90.     SetLength(Result, Length(sSerialNumber));  
    91.     P := @Result[1];  
    92.     CopyMemory(P, @sSerialNumber[0], Length(sSerialNumber));  
    93.     for I := to Length(sSerialNumber) div do  
    94.     begin  
    95.       P^ := LittleToBig(P^);  
    96.       Inc(P);  
    97.     end;  
    98.   end;  
    99.   FreeMem(SCOP);  
    100. end;  
    101.   
    102. end.  
  • 相关阅读:
    读书笔记之:高级Linux编程(ch14)
    读书笔记之:C++编程惯用法——高级程序员常用的方法和技巧
    读书笔记之:sed与awk
    读书笔记之:Linux——命令、编辑器与shell编程
    读书笔记之:C++必知必会
    读书笔记之:Linux程序设计(第4版)(ch17)
    读书笔记之:Linux管理员指南与Linux系统一本通
    读书笔记之:C++语言的设计与演化(2002)
    读书笔记之:Linux一站式学习
    读书笔记之:GNU/Linux编程指南
  • 原文地址:https://www.cnblogs.com/CodeGear/p/4290929.html
Copyright © 2020-2023  润新知