粗看看发现俩问题。问题1,参数被你重新赋值了
stream:=TStringStream.Create('');
解决方法:
删除这行,由外部创建类对象后传入问题2,有一处内存泄漏
GetMem(hBuf, 65536);
解决方法:
最后补上
FreeMem(hBuf);先解决以上俩问题吧。

解决方案 »

  1.   


    好,谢谢先!
    procedure Get(const url: string; head, res: TStream);
    var
      hInt, hUrl: HINTERNET;
      buffer: PChar;
      dwRead: cardinal;
      flag: Boolean;
      len, index: Cardinal;
    begin
      GetMem(buffer, 65536);
      hInt := InternetOpen('Delphi', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      hurl := InternetOpenUrl(hInt, PChar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      len := 65536;
      index := 0;
     //查询响应头信息
      flag := HttpQueryInfo(hUrl, HTTP_QUERY_RAW_HEADERS_CRLF, buffer, len, index);
      if flag then
      begin
        head.Write(buffer^, len);
        repeat
          if not InternetReadFile(hUrl, buffer, 1000, dwRead) then
            Break;
          if dwRead <> 0 then
            res.Write(buffer^, dwRead);
        until dwRead = 0;
      end;
      InternetCloseHandle(hUrl);
      InternetCloseHandle(hInt);
      FreeMem(buffer);
    end;
    procedure TForm1.btn1Click(Sender: TObject);
    var
      head, res: TStringStream;
    begin
      res := TStringStream.Create('');
      head := TStringStream.Create('');
      try
        Get('http://www.ip138.com', head, res);
        ShowMessage(head.DataString);
        ShowMessage(res.DataString);
      finally
        head.Free;
        res.Free;
      end;
    end;帮你简单修改了下,你参考下吧,很多地方要加判断,比如InternetOpen、InternetOpenUrl返回的句柄值要判断是否有效再继续。
      

  2.   


    你好,谢谢你回答我的问题。我传入函数的缓冲区是hBuf,stream:=TStringStream.Create('');这个是初始化,用来读取缓冲区的内容的。内存泄露的也安按你说的解决了,还是不行,见鬼了。
      

  3.   


    你好,谢谢你回答我的问题。我传入函数的缓冲区是hBuf,stream:=TStringStream.Create('');这个是初始化,用来读取缓冲区的内容的。内存泄露的也安按你说的解决了,还是不行,见鬼了。
    看我代码,测试通过的。
      

  4.   


    好,谢谢先!
    procedure Get(const url: string; head, res: TStream);
    var
      hInt, hUrl: HINTERNET;
      buffer: PChar;
      dwRead: cardinal;
      flag: Boolean;
      len, index: Cardinal;
    begin
      GetMem(buffer, 65536);
      hInt := InternetOpen('Delphi', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
      hurl := InternetOpenUrl(hInt, PChar(url), nil, 0, INTERNET_FLAG_RELOAD, 0);
      len := 65536;
      index := 0;
     //查询响应头信息
      flag := HttpQueryInfo(hUrl, HTTP_QUERY_RAW_HEADERS_CRLF, buffer, len, index);
      if flag then
      begin
        head.Write(buffer^, len);
        repeat
          if not InternetReadFile(hUrl, buffer, 1000, dwRead) then
            Break;
          if dwRead <> 0 then
            res.Write(buffer^, dwRead);
        until dwRead = 0;
      end;
      InternetCloseHandle(hUrl);
      InternetCloseHandle(hInt);
      FreeMem(buffer);
    end;
    procedure TForm1.btn1Click(Sender: TObject);
    var
      head, res: TStringStream;
    begin
      res := TStringStream.Create('');
      head := TStringStream.Create('');
      try
        Get('http://www.ip138.com', head, res);
        ShowMessage(head.DataString);
        ShowMessage(res.DataString);
      finally
        head.Free;
        res.Free;
      end;
    end;帮你简单修改了下,你参考下吧,很多地方要加判断,比如InternetOpen、InternetOpenUrl返回的句柄值要判断是否有效再继续。非常感谢你能在百忙之中帮我修改代码,测试了你的代码,已经成功了。好奇怪,为什么非要在外面TStringStream传进来才行。对了,我看了下id,我前面的一个问题也是你给我解决的,真的非常感谢你!这边有两个问题没人回答,你去随便写些东西,我把C币都给你!
    http://ask.csdn.net/questions/161474
    http://ask.csdn.net/questions/161343