粗看看发现俩问题。问题1,参数被你重新赋值了
stream:=TStringStream.Create('');
解决方法:
删除这行,由外部创建类对象后传入问题2,有一处内存泄漏
GetMem(hBuf, 65536);
解决方法:
最后补上
FreeMem(hBuf);先解决以上俩问题吧。
stream:=TStringStream.Create('');
解决方法:
删除这行,由外部创建类对象后传入问题2,有一处内存泄漏
GetMem(hBuf, 65536);
解决方法:
最后补上
FreeMem(hBuf);先解决以上俩问题吧。
解决方案 »
- 互联上如何缩短TSocketConnection 连接时间
- Delphi使用Variant操作EXCEL时,怎么知道打印范围
- GetAsyncKeyState能判断按键单击吗?而不是按下
- 怎样让JPG图片加亮
- 急!!!,动态控件的事件处理,100分
- 请问如何让控件在不同的分辨率下自动调整大小和相对位置
- delphi 自带的报表设计器,怎么设置预览中的窗体标题栏中的内容
- 挑战极限 - 测试驱动开发实战及DUnit 使用
- ★CSVMM散分帖★ 答谢所有给与我帮助的各位老大,和即将帮助我的朋友们,同时庆祝本人结帖率100%
- 请问一个优秀的程序员,学习delphi,5个月应该达到什么水平?
- 几组字符串生成树形结构的问题
- delphi使用idhttp提取到内容,如何提取到其中一行或几行
好,谢谢先!
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