粗看看发现俩问题。问题1,参数被你重新赋值了
stream:=TStringStream.Create('');
解决方法:
删除这行,由外部创建类对象后传入问题2,有一处内存泄漏
GetMem(hBuf, 65536);
解决方法:
最后补上
FreeMem(hBuf);先解决以上俩问题吧。
stream:=TStringStream.Create('');
解决方法:
删除这行,由外部创建类对象后传入问题2,有一处内存泄漏
GetMem(hBuf, 65536);
解决方法:
最后补上
FreeMem(hBuf);先解决以上俩问题吧。
好,谢谢先!
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返回的句柄值要判断是否有效再继续。
你好,谢谢你回答我的问题。我传入函数的缓冲区是hBuf,stream:=TStringStream.Create('');这个是初始化,用来读取缓冲区的内容的。内存泄露的也安按你说的解决了,还是不行,见鬼了。
你好,谢谢你回答我的问题。我传入函数的缓冲区是hBuf,stream:=TStringStream.Create('');这个是初始化,用来读取缓冲区的内容的。内存泄露的也安按你说的解决了,还是不行,见鬼了。
看我代码,测试通过的。
好,谢谢先!
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