iCAx开思工具箱
标题:
ug 与 MFC 接口问题
[打印本页]
作者:
boliang99
时间:
2006-1-17 15:12
标题:
ug 与 MFC 接口问题
我用以下代码编写ug 执行的动态库,为什么关闭对话框后,内存没有释放?(内存不释放的判据:不重启ug,重新编译会出现:”无法重写**.dll“的提示).各位有没遇到同样的问题?
extern "C" DllExport void ufusr( char *param, int *returnCode, int rlen )
{
int errorCode=UF_initialize();
if ( errorCode != 0 )
return;
AFX_MANAGE_STATE(AfxGetStaticModuleState());
Assem_Tree_Dlg *PNMDlg;
PNMDlg= new Assem_Tree_Dlg;
PNMDlg->Create(IDD_DIALOG1,NULL);
PNMDlg->ShowWindow(SW_SHOW);
if ( 0 == errorCode )
{
errorCode = UF_terminate();
}
}
extern "C" void ufusr_cleanup(void)
{
}
extern "C" int ufusr_ask_unload( void )
{
return( UF_UNLOAD_UG_TERMINATE );
}
作者:
boliang99
时间:
2006-1-17 15:15
注:我已在MFC对话框关闭时释放如下:
void Assem_Tree_Dlg:
ostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
delete this;
CDialog:
ostNcDestroy();
}
作者:
zhjb113
时间:
2006-1-22 21:53
1 建议你在ufusr_cleanup(void)中释放内存
2 内存没有释放和(内存不释放的判据:不重启ug,重新编译会出现:”无法重写**.dll“的提示).没有关系。出现这种情况是应用你让你的程序一直没有卸载,你可以看看参数UF_UNLOAD_UG_TERMINATE 的说明。
作者:
boliang99
时间:
2006-1-25 00:23
谢谢zhjb113的回复。但我还是试不出来。
前面没交待,我输出的动态庫是在menuscript调用的,即用菜单来调用,我不知道这会对卸载动态庫有没有影响?
我想,我所说的内存释放应该是动态庫没有unload,因此动态库内的全局变量就无法删除。如果能在void Assem_Tree_Dlg
stNcDestroy() 函数内FreeLibrary(??);应该就没问题了,可是我没办法求得FreeLibrary(什么?);
zhjb113所说的两点似乎都要关闭ug才后才执行啊?因为我只能用 return( UF_UNLOAD_UG_TERMINATE );而不能用 return ( UF_UNLOAD_IMMEDIATELY );(那样ug就会马上关闭)
作者:
zhjb113
时间:
2006-1-25 16:40
你的做法没有错误,因为你使用的是UF_UNLOAD_UG_TERMINATE。
你必须关闭UG才能重新编译也是对的。这个不是判断你没有释放内存的依据
作者:
along533
时间:
2006-1-26 20:09
一个很简单的方法,就是在ufusr函数中什么代码都不要写:像下面这样
extern "C" DllExport void ufusr( char *param, int *returnCode, int rlen )
{
int errorCode=UF_initialize();
if ( 0 == errorCode )
{
ug_openapi();
errorCode = UF_terminate();
}
}
把你所有要做的代码放到ug_openapi这个函数中,就不会出现你刚才的那个情况。这是小弟个人经验。
作者:
深夜摔键盘
时间:
2006-2-1 08:47
楼上兄弟的方法不能解决什么问题,多想想上面兄弟的正解吧。
作者:
boliang99
时间:
2006-2-4 20:30
首先祝大家新年快乐,财运亨通!
我试了很多方法,目前还不能解决。
按断点来调试,UG在执行UFUSR()以后就马上执行 ufusr_ask_unload( void ),如果
extern "C" int ufusr_ask_unload( void )
{
return( UF_UNLOAD_UG_TERMINATE );
}
则UG正常运行,动态庫也没有释放,如果
extern "C" int ufusr_ask_unload( void )
{
return( UF_UNLOAD_IMMENITRY);
}
则UG马上自动关闭,动态庫也得到了释放,这有点像UG/API外部命令模式啊!
但为什么用UISTYLER就没有这个问题?(应用UISTYLER时执行UFUSR()后马上释放动态庫)这是不是UG与MFC接口有缺陷?如果是那看来就不那么好解决了。我一直认为动态庫不释放,那么内存就没有释放,这也许有误了。现在请教各位一下:
1、如果动态庫不释放,MFC那么怎么释放.CPP文件内全局变量的内存?有比用delete一个一个释放好的办法吧?
2、如果动态庫不释放,也就是函数UFUSR还在运行中,假如我现在又要运行另一个UFUSR函数的动态庫那会不会有什么冲突?
作者:
深夜摔键盘
时间:
2006-2-5 09:22
return ( UF_UNLOAD_IMMEDIATELY );是正确的。UG是通过 UF_UNLOAD_IMMEDIATELY 来判断是不是该卸载这个DLL。你的 UF_UNLOAD_IMMENITRY,是什么意思?
你的问题:
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
2.不会发生冲突的。虽然函数同名,但是在不同的模块内,各模块都有自己的ID的,系统能够辨识。
作者:
boliang99
时间:
2006-2-16 08:13
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
是否也就是说,关闭ug全局变量是不会清除的?另外动态库被加载后所占用的内存是否是固定的,如果我要关闭对话框的时候释放所有的变量、函数、类,那内存是否也会被释放出来?
作者:
boliang99
时间:
2006-2-16 08:14
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
是否也就是说,关闭ug之前全局变量是不会被自动清除的?另外动态库被加载后所占用的内存是否是固定的,如果我要关闭对话框的时候释放所有的变量、函数、类,那内存是否也会被释放出来?
作者:
boliang99
时间:
2006-2-16 08:15
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
是否也就是说,关闭ug之前全局变量是不会被自动清除的?另外动态库被加载后所占用的内存是否是固定的,如果我要关闭对话框的时候释放所有的变量、函数、类,那内存是否也会被释放出来?
作者:
ami999
时间:
2006-3-28 17:02
我也觉得他的UG没有关掉的条件下做的,
所以会出现这样的错误
作者:
ami999
时间:
2006-3-28 17:03
我也觉得他的UG没有关掉的条件下做的,
所以会出现这样的错误
作者:
ddpo1982
时间:
2006-4-1 23:40
你的DLL被UG加载了,必须关闭UG才会释放掉DLL,楼主试试。
作者:
ljjaiwk
时间:
2009-7-6 22:36
这个问题我也遇到了 不关闭UG 如法释放DLL,也就不能调试 ,
这样做起来很麻烦 高手指点下
欢迎光临 iCAx开思工具箱 (https://t.icax.org/)
Powered by Discuz! X3.3