内存泄漏的问题,大家帮忙看看!

Chimae 2005-10-20 10:59:08
兄弟们帮我看看,内存泄露的问题,谢谢!
DLL:
extern "C" __declspec(dllexport) AnsiString __stdcall GetCondition(bool bVisiable,
AnsiString sCaption, TADOQuery* adoQuery);

AnsiString __stdcall GetCondition(bool bVisiable, AnsiString sCaption, TADOQuery* adoQuery)
{
AnsiString sTemp = "";
if (!adoQuery->Active)
return sTemp;
TfrmSearchCondtion *frmMain = new TfrmSearchCondtion(NULL);
frmMain->Caption = sCaption + "自定义查询条件";
frmMain->ADOQuery1 = adoQuery;
frmMain->LoadData(bVisiable);
if (frmMain->ShowModal() != mrOk)
{
delete frmMain;
return sTemp;
}
sTemp = frmMain->GetSQL();
if (sTemp.SubString(1, 5) == " AND ")
sTemp = sTemp.SubString(6, sTemp.Length() - 5);
if (sTemp.SubString(1, 4) == " OR ")
sTemp = sTemp.SubString(5, sTemp.Length() - 4);
delete frmMain;
return sTemp;
}
调用:
typedef AnsiString (GetSQL)(bool, AnsiString, TADOQuery*);
extern "C" __declspec(dllimport) AnsiString __stdcall GetCondition(bool bVisiable,
AnsiString sCaption, TADOQuery* adoQuery);

HINSTANCE nDLL;
GetSQL *theValue;
nDLL = LoadLibrary("TWSOFTSEARCH.dll");
if(nDLL != NULL)
{
theValue = (GetSQL*)GetProcAddress(nDLL, "GetCondition");
if(theValue != NULL)
Memo1->Text = (*theValue)(true, Caption, ADOQuery1);
}
theValue = NULL;
FreeLibrary(nDLL);

调用应该是没有问题的,在打开的DLL窗体里,点击“取消”按钮一切正常,点击“确定”按钮,注释掉这句话sTemp = frmMain->GetSQL();也是一切ok,就是这句话出现内存泄漏的问题,想不出问题出在哪里,程序里只执行GetSQL()函数本身,也是一切正常,能够返回值;
...全文
140 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Chimae 2005-10-20
  • 打赏
  • 举报
回复
解决了,谢谢大家!就如同“sxzqlzx() ”和“constantine(飘遥的安吉儿) ”所说的,感谢!
Chimae 2005-10-20
  • 打赏
  • 举报
回复
DLL和调用程序都是CBUILDER编的,应该不存在“sxzqlzx() ”说得“AnsiString和Char”的问题吧!
constantine 2005-10-20
  • 打赏
  • 举报
回复
参数跟返回类型一般不要用AnsiString,如果用了你有没有按照dll前那段说明去做,要用ShareMem

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
hy1080 2005-10-20
  • 打赏
  • 举报
回复
是不是没打补丁?
sxzqlzx 2005-10-20
  • 打赏
  • 举报
回复
不要用AnsiString参数类型,用Char
Chimae 2005-10-20
  • 打赏
  • 举报
回复
DLL下载地址:http://www.twsoft.cn/download/software/twsoftsearch.dll

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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