被整崩溃了,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() 之后就会变化的了