首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

被整崩溃了,MDI子窗体调用DLL到底应该在什么时候释放?解决方案

2012-03-14 
被整崩溃了,MDI子窗体调用DLL到底应该在什么时候释放?在我的程序中,子窗体A动态调用了一个DLL中的几个导出

被整崩溃了,MDI子窗体调用DLL到底应该在什么时候释放?
在我的程序中,子窗体   A   动态调用了一个DLL中的几个导出函数,这些DLL的导出函数中有的只是返回一个字符串,有的进行更复杂的处理才返回。
比如有一个导出函数是:
extern   "C "   __declspec(dllexport)
LPSTR   __stdcall   GetFilter()
{
        return   lpFilter;//其中lpFilter定义为static   LPSTR   lpFilter   =   "Excel文档(*.XLS)|*.XLS ";
}
另一个导出函数,这个函数对数据库中指定表单进行一些处理
extern   "C "   __declspec(dllexport)
LPSTR   __stdcall   DoDisperse(TADOConnection   *adocon,char*   TableName,bool   g_bDispInteger);
该函数在一开始会给一些TADOQuery和TADOTable分配内存,执行完毕会delete。

现在的问题是,如果只是调用了GetFilter,那么不管FreeLibrary放在   A   窗体的OnClose里面还是哪里都不写FreeLibrary,关闭主窗体的时候都不会出错。而只要调用了DoDisperse,那么在OnClose就不能写FreeLibrary,否则肯定出错。
我就不明白了,为什么在OnClose里面不能FreeLibrary?难道不是谁调用谁释放么?
OnClose代码如下:
while(vHinstances.size()> 0)
{
                FreeLibrary(vHinstances[vHinstances.size()-1]);
                vHinstances.pop_back();
}//vHinstances的类型为:vector     <HINSTANCE> 。
Action   =   caFree;
--g_nMDICount;//这是个全局变量,记录着当前有几个子窗体,因为我发现关闭所有子窗体的时候,即使每个子窗体都调用了Close并且关闭了,主窗体的MDICount还是原先值

[解决办法]
写在OnDestroy事件里MDICount会自动减少的。

为什么会出错就不知道了,我也碰到过,后来干脆不管它了。
[解决办法]
我是说在OnDestroy里判断MDICount值,而不是在OnClose里。
[解决办法]
开CODEGUARD看看
写了这个没有

switch(reason)
{
case DLL_PROCESS_ATTACH:
CoInitialize(NULL);
break;
case DLL_PROCESS_DETACH:
CoUninitialize();
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return 1;
[解决办法]
如果你的DoDispose是为了释放DLL中的资源的话,应该放在DllMain或者类似的入口函数中。比如:

switch (dwReason)
{
case DLL_PROCESS_ATTACH:
Initialize();
break;
case DLL_PROCESS_DETACH:
Dispose();
break;
}

只要你创建了一个子窗口,就应该用LoadLibrary函数将DLL映射进来,而系统会将DLL映射的计数递增。当你销毁窗口的时候,应该调用FreeLibrary函数递减DLL映射计数。当DLL映射计数降为0的时候,系统就会自动调用你的Dispose函数释放DLL的资源。
[解决办法]
关于 MDICount 的问题:你在循环中这个值是不变化的
在循环中加入 Application-> ProcessMessages() 之后就会变化的了

热点排行