idhttp在DLL中的一个奇怪问题 ( 积分: 50 )

  • 主题发起人 主题发起人 rsina
  • 开始时间 开始时间
R

rsina

Unregistered / Unconfirmed
GUEST, unregistred user!
最近写一个小程序,就是从公司网站上下载一些数据(文本),由于要分模块,我写了一个DLL,很简单,如下:
with TIdHttp.Create(nil) do
try
Sresult := Get('http://www.xxx.com/update.txt');
finally
Free;
end;
//showmessage('');
result := pchar(Sresult);

这样的一个简单函数,我使用exe调用的时候发现,如果update.txt很大的时候,exe调用DLL返回的数据就只有update.txt的前一部分。但是!!!大家注意我这个转折连词,但是我只要在DLL中,加一行showmessage(''),无论我showmessage什么,那么DLL都会正确的返回update.txt的内容,无论update.txt内容有多大!

真是奇怪了,我一开始以为idhttp的缓冲区设置过小,于是在代码中,指定了缓冲区大小超过update.txt的大小,但是不行。还是老问题,奇怪的是我即使不加大缓冲区大小,只要在DLL中showmessage一下就可以了。

DLL是动态加载的。郁闷啊。。郁闷。。。。
 
最近写一个小程序,就是从公司网站上下载一些数据(文本),由于要分模块,我写了一个DLL,很简单,如下:
with TIdHttp.Create(nil) do
try
Sresult := Get('http://www.xxx.com/update.txt');
finally
Free;
end;
//showmessage('');
result := pchar(Sresult);

这样的一个简单函数,我使用exe调用的时候发现,如果update.txt很大的时候,exe调用DLL返回的数据就只有update.txt的前一部分。但是!!!大家注意我这个转折连词,但是我只要在DLL中,加一行showmessage(''),无论我showmessage什么,那么DLL都会正确的返回update.txt的内容,无论update.txt内容有多大!

真是奇怪了,我一开始以为idhttp的缓冲区设置过小,于是在代码中,指定了缓冲区大小超过update.txt的大小,但是不行。还是老问题,奇怪的是我即使不加大缓冲区大小,只要在DLL中showmessage一下就可以了。

DLL是动态加载的。郁闷啊。。郁闷。。。。
 
那你将ShowMessage() 替换为 Application.ProcessMessages;
 
试了,好像没什么效果。

说实话,我现在已经可以得到全部的update.txt文件内容了,但是每次调用DLL总是有两个内存读取错误,虽然有这个错误提示,但是还是可以获得update.txt文件内容。
 
with TIdHttp.Create(nil) do
try
Sresult := Get('http://www.xxx.com/update.txt');
finally
Free;
end;
getmem(result,length(Sresult)+1);
strcopy(result,pchar(Sresult);
注意,在主调程序中释放空间。
当然最好的方法是在主调程序中给pchar分配空间,将指针传入dll,取得结果,再释放空间
 
迷糊,我按照你的方法的确解决了问题,但是我还有有两点不太明白,请教一下:
1。为什么要用getmem函数呢。
2。我一开始的方法为什么会出现那样的错误?

十分感谢你的解答。
 
后退
顶部