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_DlgstNcDestroy() 函数内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