2010-01-18 50 views
0

我的程序中有以下代码。当我尝试检查代理是否是有效代理时,它会使我的程序崩溃。任何想法如何解决这一问题?我使用的是印10为什么此代码用于检查代理有效性崩溃?

if checkproxy('http://www.google.com') label1.text:='Good' else label1.text:='bad'; 

如果我尝试调用另一个idHTTP请求checkproxy崩溃的程序之后连接。

这是实际的代码....这将返回错误......


function TregForm.webSession(sURL : ansistring) : ansistring; 
    var sstream : Tstringstream; 
     httpcon : TIdHTTP; 
     antifreeze : TIdAntiFreeze; 
begin 
    result := ''; 
    sstream := tstringstream.Create(''); 
    try 
    if length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0 
    if checkproxy(' http://www.google.com ') then 
    begin 
     antifreeze := TIdAntiFreeze.Create(nil); 
     httpcon := TIdHTTP.create; 
     httpcon.ProxyParams.BasicAuthentication:=true; 
     httpcon.ProxyParams.ProxyPassword:=SettingsForm.edtProxyPass.Text; 
     httpcon.ProxyParams.ProxyPort:=strtoint(SettingsForm.edtProxyPort.Text); 
     httpcon.ProxyParams.ProxyServer:=SettingsForm.edtProxyServer.Text; 
     httpcon.ProxyParams.ProxyUsername:=SettingsForm.edtProxyUserName.Text; 
    end 
    else 
    begin 
     showmessage('Proxy Server Not Working.. Attempting to bypass the Proxy'); 
     antifreeze := TIdAntiFreeze.Create(nil); 
     httpcon := TIdHTTP.create; 
     //httpcon.Request.ProxyConnection:=''; 
     //httpcon.ProxyParams.BasicAuthentication:=false; 
     //httpcon.ProxyParams.ProxyPassword:=''; 
     //httpcon.ProxyParams.ProxyPort:=0; 
     //httpcon.ProxyParams.ProxyServer:=''; 
     //httpcon.ProxyParams.ProxyUsername:=''; 
    end; 
    httpcon.HandleRedirects := true; 
    antifreeze.Active := true; 
    HttpCon.Get(sURL,sstream); 
    result := utf8towidestring(sstream.DataString); 
    except 
    httpcon.Disconnect; 
    end; 
    antifreeze.Active := false; 
    freeandnil(httpcon); 
    freeandnil(antifreeze); 
    freeandnil(sstream); 
end;

function TregForm.checkproxy(sURL : ansistring) : boolean; var //sstream : Tstringstream; httpcon : TIdHTTP; antifreeze : TIdAntiFreeze; begin result := true; try antifreeze := TIdAntiFreeze.Create(nil); httpcon := TIdHTTP.create; //sstream := tstringstream.Create(''); httpcon.ProxyParams.BasicAuthentication:=true; httpcon.ProxyParams.ProxyPassword:=SettingsForm.edtProxyPass.Text; httpcon.ProxyParams.ProxyPort:=strtoint(SettingsForm.edtProxyPort.Text); httpcon.ProxyParams.ProxyServer:=SettingsForm.edtProxyServer.Text; httpcon.ProxyParams.ProxyUsername:=SettingsForm.edtProxyUserName.Text;

httpcon.HandleRedirects := true; 
antifreeze.Active := true; 
HttpCon.Request.ProxyConnection:=SettingsForm.edtProxyServer.Text; 
HttpCon.head(sURL); 
httpCon.Disconnect; 

除了 在E:EIdException就开始 结果:= FALSE; 结束; 关于E:例外开始 // showmessage('外部错误:'+#13#10 + E.Message); showmessage('Proxy Settings Error'); 结果:= false; 结束; 结束; antifreeze.Active:= false; freeandnil(httpcon); freeandnil(防冻液); // freeandnil(sstream); 结束;

错误消息:E001B844A模块key.exe中的异常AccessViolation。 模块'key.exe'中地址为005B844A的访问冲突。读地址00000000

+0

你是什么意思,当你说“它崩溃”? – 2010-01-18 06:21:30

+0

我得到一个运行时错误,并且程序崩溃了,并且想要将崩溃数据发送到微软。 – Brad 2010-01-18 07:02:36

+0

我剪切/粘贴的实际代码...当我使用调试器运行程序关闭它立即弹出与请告诉微软有关此问题的消息。然后提供错误信息。当我使用调试器运行时,会给我一个中断通知,但不会导致导致问题的代码行。 – Brad 2010-01-18 07:39:31

回答

4

的在上面的代码,如果“SettingsForm.edtProxyServer.text”小于7个字符,你将不得不在您使用防冻液和HttpCon无需先创建它们的情况。

我试验了一下你的代码,并在我的WinXP SP3(D2010,Indy v10.5.5)上进行了测试。这应该是工作代码...

procedure TForm1.Button1Click(Sender: TObject); 
Var 
    Resp : String; 
begin 
    Resp := webSession('http://www.celarius.com'); 
    if Length(Resp)>0 then 
     MessageDlg('Got the body ok',mtInformation,[mbOk],0); 
end; 

function TForm1.webSession(sURL : ansistring) : ansistring; 
var 
    SStream : Tstringstream; 
    HTTPCon : TIdHTTP; 
    AntiFreeze : TIdAntiFreeze; 
begin 
    Result := ''; 
    if Length(SettingsForm.edtProxyServer.text) >= 7 then // 0.0.0.0 
    Try 
     SStream := NIL; 
     AntiFreeze := NIL; 
     HTTPCon := NIL; 
     Try 
      SStream := tstringstream.Create(''); 
      { Create & Set IdHTTP properties } 
      HTTPCon := TIdHTTP.create; 
      HTTPCon.HandleRedirects := true; 
      { Check Proxy } 
      if checkproxy('http://www.google.com') then 
      Begin 
       HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text; 
       HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text); 
       HTTPCon.ProxyParams.BasicAuthentication := True; 
       HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text; 
       HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text; 
      End; 
      { Create another AntiFreeze - only 1/app } 
      AntiFreeze := TIdAntiFreeze.Create(nil); 
      AntiFreeze.Active := true; 
      HTTPCon.Get(sURL,SStream); 
      Result := UTF8ToWideString(SStream.DataString); 
     Finally 
      If Assigned(HTTPCon) then FreeAndNil(HTTPCon); 
      If Assigned(AntiFreeze) then FreeAndNil(AntiFreeze); 
      If Assigned(SStream) then FreeAndNil(SStream); 
     End; 
    Except 
     { Handle exceptions } 
     On E:Exception do 
      MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); 
    End; 
end; 

function TForm1.checkproxy(sURL : ansistring) : boolean; 
var 
    HTTPCon : TIdHTTP; 
    AntiFreeze : TIdAntiFreeze; 
begin 
    Result := False; 
    Try 
     { Inti vars } 
     AntiFreeze := NIL; 
     HTTPCon := NIL; 
     Try 
      { AntiFreeze } 
      AntiFreeze := TIdAntiFreeze.Create(NIL); 
      AntiFreeze.Active := true; 
      { Create & Set IdHTTP properties } 
      HTTPCon := TIdHTTP.Create(NIL); 
      HTTPCon.ProxyParams.ProxyServer := SettingsForm.edtProxyServer.text; 
      HTTPCon.ProxyParams.ProxyPort := StrToInt(SettingsForm.edtProxyPort.Text); 
      HTTPCon.ProxyParams.BasicAuthentication := True; 
      HTTPCon.ProxyParams.ProxyUsername := SettingsForm.edtProxyServer.Text; 
      HTTPCon.ProxyParams.ProxyPassword := SettingsForm.edtProxyUserName.Text; 
      HTTPCon.HandleRedirects := true; 
      HTTPCon.ConnectTimeout := 1000; 
      HTTPCon.Request.Connection := 'close'; 
      HTTPCon.Head(sURL); 
     Finally 
      { Cleanup } 
      if Assigned(HTTPCon) then 
      Begin 
       { Return Success/Failure } 
       Result := HTTPCon.ResponseCode = 200; 
       If HTTPCon.Connected then HTTPCon.Disconnect; 
       FreeAndNil(HTTPCon); 
      End; 
      if Assigned(AntiFreeze) then FreeAndNil(AntiFreeze); 
     End; 
    Except 
     On E:EIdException do ; 
     { Handle exceptions } 
     On E:Exception do 
      MessageDlg('Exception: '+E.Message,mtError, [mbOK], 0); 
    End; 
end; 
+0

我不敢相信我错过了!感谢您的信息和代码。 -Brad – Brad 2010-01-18 10:09:59

+0

不客气。第二双眼睛通常会看到第一对错过的东西! – 2010-01-18 10:25:25