这是调用的代码
typedef char** ShowDataofbaseExAA(int n,int nl,char* fdText[7],CString strSelect);
ShowDataofbaseExAA *ShowDataFun;
his=::LoadLibrary("DbaseIF.dll");
ShowDataFun= (ShowDataofbaseExAA*)GetProcAddress(his,"ShowDataofbaseExAA");
char** chvalue;
chvalue=new char*[5];
chvalue=(*ShowDataFun)(5,0,fdText,string);
FreeLibrary(his);
for(int i=0;i<=4;i++)
{
szvalue.Format("%s",chvalue[i]);
AfxMessageBox(szvalue);
}
调用之后释放吗?
解决方案 »
- 非计算机专业毕业生如何成为程序员?
- 如何用UI线程控制主线程产生的子窗口
- 我想在一个dialog上放两个静态文本框,然后有文字在上面滚动显示.大家说说思路,或者有没有别的好办法..谢谢..急
- 谁玩天堂的?一个技术问题,从目前的情况来看,似乎开发商把用户认证放在一台服务器,这样一来对每个请求的响应超时时间会很短,如何保证
- 动画光标怎样加载
- 截取键盘输入后的三个疑问?
- 大家谁能给我讲一下!COM分类的问题
- 如何改变控件的焦点?
- 父对话框传递初始化参数问题,求教
- 我在用directX编程,搜索驱动程序时,提示如下错误,望有朋友能够解答,非常感谢!急!急!急!
- 请教redefinition 的问题
- 如何利用ADO 方式处理excel文件?
这一句不要了,下面一掉指针被改掉了,导致内存泄漏调用完之后释放不过你这种Dll函数的设计感觉很别扭,何不自己外面申请,作为参数传进去再填充呢
chvalue=(*ShowDataFun)(5,0,fdText,string); // 这个函数调用之后,原来申请的5个char*就丢失了,造成了内存的泄漏具体的释放办法得考虑你在ShowDataofbaseExAA的申请情况,也就是说先对chvalue[0]~chvalue[n]进行释放,然后再释放chvalue本身。
for(int j=0;j<5;j++)
{
delete []chvalue[j];
}
delete []chvalue;
DllExport char** ShowDataofbaseExAA(int nSyflag,int nSyf,char* fdText[],CString strSelect)
{ AFX_MANAGE_STATE(AfxGetStaticModuleState());
_bstr_t strsql=strSelect;
CString szhr;
char** chvalue;
chvalue=new char*[nSyflag];
if(theApp.GetConState())
{
if(theApp.GetRecordState()) theApp.m_set->Close();
theApp.m_set=theApp.m_con->Execute(strsql,NULL,adCmdText);
FieldsPtr m_pFields=theApp.m_set->GetFields();
FieldPtr fd;
_variant_t hr;
long i=0;
if(!theApp.m_set->adoEOF)
{
for(long j=0;j<nSyflag;j++)
{
hr=theApp.m_set->GetCollect(fdText[j]);
szhr.Format("%s",(char*)(_bstr_t)hr);
szhr.TrimRight();
chvalue[j]=new char[nSyflag];
// chvalue[j]=szhr.GetBuffer(szhr.GetLength());
strcpy(chvalue[j],szhr);
}
}
return chvalue;
}
else
{
AfxMessageBox("连接对象不存在!");
return chvalue;
}
}
if(!theApp.m_set->adoEOF)
或再提供一个函数,来释放DLL中分配的内存。