很奇怪的问题,在XE7的DLL工程里面,用idhttp,get方法返回数据太多的话,会崩溃。

不一样的鞭炮 2018-05-27 10:38:53
extern "C" __declspec(dllexport) char * __stdcall test(char *url) //导出函数
{
TIdSSLIOHandlerSocketOpenSSL *IdSSLIOHandlerSocketOpenSSL1=new TIdSSLIOHandlerSocketOpenSSL(NULL);

TIdHTTP *http=new TIdHTTP(NULL);

http->IOHandler=IdSSLIOHandlerSocketOpenSSL1;
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method= sslvSSLv2;
IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmBoth;
IdSSLIOHandlerSocketOpenSSL1->ReadTimeout=10000;
http->ReadTimeout=10000;

AnsiString html;
try {
html=http->Get(url);   // 执行到这里的时候,如果返回的数据不是很多的话,没有问题。如果返回的数据很多,会崩溃,貌似连catch都捕获不了,然后跳出来个内存错误,我是用xe7写的DLL。BCB6调用。
return html.c_str();
} catch ( Exception &e) {
return html.c_str() ;
}
}
...全文
1102 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
titan_ysl 2018-05-29
  • 打赏
  • 举报
回复
要调用的我的函数也很简单, extern "C" __declspec(dllexport) char * __stdcall test(char *url) //导出函数 { AnsiString html; html=GetUrlText(url); return html.c_str() ; } 即可。
ooolinux 2018-05-28
  • 打赏
  • 举报
回复
AnsiString html; 栈变量改成static或者全局变量试试。
不一样的鞭炮 2018-05-28
  • 打赏
  • 举报
回复
引用 2 楼 titan_ysl 的回复:
谢谢,晚会我试试。
不一样的鞭炮 2018-05-28
  • 打赏
  • 举报
回复
只是在DLL里 会出现这个问题,在form application 里不会。
titan_ysl 2018-05-28
  • 打赏
  • 举报
回复
可能是Get(url);方法处理不了太多的数据,一般常用TIdCustomHTTP.Get (string, TIdStream) ; 如: TStringStream *StringStream1=new TStringStream("",TEncoding::Default,true); IdHTTP1->Get(url, StringStream1); StringStream1->Position = 0; StringStream1->Position = 0; AnsiString html = StringStream1->DataString.Trim(); //DataString就是网页内容 不过,上面的代码有几个问题没解决,如网页是utf8就会是乱码,网络访问出错时,也没有处理。我自己有个专用函数,就贴出来好了。 //--------------------------------------------------------------------------- UnicodeString __fastcall TForm1::GetUrlText(UnicodeString strUrl) { TIdSSLIOHandlerSocketOpenSSL *IdSSLIOHandlerSocketOpenSSL1=new TIdSSLIOHandlerSocketOpenSSL(this); IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Method=sslvSSLv3; IdSSLIOHandlerSocketOpenSSL1->SSLOptions->Mode=sslmClient; //可执行程序下要放ssleay32.dll和libeay32.dll两个动态库,否则打开https协议的网页会报错。 //OpenSSL Indy版下载 http://indy.fulgan.com/SSL/ //最新的32位 openssl-1.0.2o-i386-win32.zip //最新的64位 openssl-1.0.2o-x64_86-win64.zip TIdHTTP *IdHTTP2 = new TIdHTTP(this); IdHTTP2->ConnectTimeout = 6000; IdHTTP2->ReadTimeout = 6000; IdHTTP2->Request->Accept="text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"; IdHTTP2->Request->UserAgent="Mozilla/5.0 (Windows NT 6.0; rv:5.0) Gecko/20100101 Firefox/5.0"; IdHTTP2->Request->AcceptCharSet="GB2312,utf-8;q=0.7,*;q=0.7"; IdHTTP2->Request->AcceptLanguage="zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3"; IdHTTP2->Request->Connection="keep-alive"; IdHTTP2->Request->ContentType="application/x-www-form-urlencoded"; IdHTTP2->ProtocolVersion=pv1_1; IdHTTP2->ConnectTimeout = 6000; IdHTTP2->ReadTimeout = 6000; IdHTTP2->IOHandler=IdSSLIOHandlerSocketOpenSSL1; //IdSSLIOHandlerSocketOpenSSL1,TIdHTTP似乎看需要会内部生成,不new和设置也能用。 TMemoryStream *StreamMSG=new TMemoryStream(); UnicodeString responsestr; try { IdHTTP2->Get(strUrl.Trim(),StreamMSG); StreamMSG->Position = 0; if(IdHTTP2->ResponseCode==200) { StreamMSG->Position = 0; ((char*)StreamMSG->Memory)[(int)StreamMSG->Size]=0; responsestr=UnicodeString((char*)StreamMSG->Memory); if(IdHTTP2->Response->CharSet.LowerCase()=="utf-8") { _di_IIdTextEncoding TextEncoding1=CharsetToEncoding("utf-8"); responsestr=ReadStringFromStream(StreamMSG,-1,TextEncoding1); //或 responsestr=ReadStringFromStream(StreamMSG,-1,IndyTextEncoding(TEncoding::UTF8)); } } else responsestr=L"网页未正常回应。"; } catch (const EIdHTTPProtocolException &E) { // HTTP error // E.ErrorCode contains the ResponseCode // E.Message contains the ResponseText // E.ErrorMessage contains the content of the error body, if any UnicodeString xingxi; xingxi="HTTP error:\r\n"; xingxi+="ErrorCode:"; xingxi+=E.ErrorCode; xingxi+="\r\n"; xingxi+="Message:"; xingxi+=E.Message; xingxi+="\r\n"; xingxi+="ErrorMessage:"; xingxi+=E.ErrorMessage; ShowMessage(xingxi); } catch (const EIdSocketError &E) { // Socket error // E.LastError contains the socket error code // E.Message contains the socket error message if (E.LastError == Id_WSAECONNREFUSED) ShowMessage(L"Your connection is refused"); else ShowMessage(E.Message); } catch (const EIdException &E) { // any other Indy error ShowMessage("Error:"+E.Message); } catch(Exception &E) { // any other non-Indy error ShowMessage("Error:"+E.Message); } delete StreamMSG; delete IdHTTP2; return responsestr; } //---------------------------------------------------------------------------

552

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 茶馆
社区管理员
  • 茶馆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧