library Project1;uses
  SHDocVw,
  mshtml,
  Windows;{$R *.res}
var
  WebBrowser1: TWebBrowser;function chkUser(id,pwd:string):boolean;stdcall;
var
  input1 : IHTMLInputTextElement;
  input2 : IHTMLInputTextElement;
  Doc : IHTMLDocument2;
  frm : IHTMLFormElement;
  str,str1 : string;
  iTick1:DWORD;
begin
  result:=false;
  WebBrowser1.Create(nil);
  WebBrowser1.Navigate('url');
  Doc := IHTMLDocument2(WebBrowser1.Document);
  input1 := Doc.all.item('mgid_enc', 0) as IHTMLInputTextElement;
  input2 := Doc.all.item('mgpwd_enc', 0) as IHTMLInputTextElement;
  frm := Doc.all.item('f',0) as IHTMLFormelement;
  input1.value:='a22911';
  input2.value:='b22911000';
  frm.submit;
  iTick1:=GetTickCount();
  //while (GetTickCount()-iTick1<=3000) do Application.ProcessMessages;
  str:=WebBrowser1.LocationURL;
  str1:='suburl';
  if pos(str1,str)=-1 then Result:=true;
  WebBrowser1.Free;
end;exports
chkUser;
beginend.想实现的效果,在代码WebBrowser1.Navigate('url');执行后,等到WebBrowser1下载完成了再向下执行,行frm.submit;也是,但是不能用sleep,因为用了之后似乎WebBrowser1下载的动作也停了。
在Form里面可以通过
iTick1:=GetTickCount();
  while (GetTickCount()-iTick1<=3000) do Application.ProcessMessages;
来实现想要的效果,但是在dll中无法使用 Application.ProcessMessages,在此请假各位。

解决方案 »

  1.   

    大概怎么用,我印象中多线程会可能常用到waitfor
      

  2.   

    大概怎么用,我印象中多线程会可能常用到waitfor
      

  3.   

    把Application传入DLL中,再用Application.ProcessMessages不行吗?
      

  4.   

    查一下是否WebBrowser处于Busy状态,即Busy属性(Boolean型).
      

  5.   


    Application 应该如何传递呢。
      

  6.   


    测试了一下,不行,我才在触发事件的时候WebBrowser的状态是not busy的
      

  7.   

    function chkUser(id,pwd:string;App:TApplication):boolean;stdcall;把主程序的Application当参数传入DLL
      

  8.   

    library 里面uses Forms单元,就可以用Application,只是这个Application并不是主程序的Application,ProcessMessages应该能解除消息阻塞