找回密码 注册 QQ登录
一站式解决方案

iCAx开思网

CAD/CAM/CAE/设计/模具 高清视频【积分说明】如何快速获得积分?快速3D打印 手板模型CNC加工服务在线3D打印服务,上传模型,自动报价
查看: 18322|回复: 15
打印 上一主题 下一主题

ug 与 MFC 接口问题

[复制链接]
跳转到指定楼层
1
发表于 2006-1-17 15:12:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多同行朋友,交流,分享,学习。

您需要 登录 才可以下载或查看,没有帐号?注册

x
我用以下代码编写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 );

}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 赞一下!赞一下!
2
发表于 2006-1-17 15:15:44 | 只看该作者
注:我已在MFC对话框关闭时释放如下:
void Assem_Tree_Dlg:ostNcDestroy()
{
        // TODO: Add your specialized code here and/or call the base class
        delete this;
        CDialog:ostNcDestroy();
}
3
发表于 2006-1-22 21:53:29 | 只看该作者
1 建议你在ufusr_cleanup(void)中释放内存
2 内存没有释放和(内存不释放的判据:不重启ug,重新编译会出现:”无法重写**.dll“的提示).没有关系。出现这种情况是应用你让你的程序一直没有卸载,你可以看看参数UF_UNLOAD_UG_TERMINATE 的说明。
4
发表于 2006-1-25 00:23:32 | 只看该作者
谢谢zhjb113的回复。但我还是试不出来。
前面没交待,我输出的动态庫是在menuscript调用的,即用菜单来调用,我不知道这会对卸载动态庫有没有影响?
我想,我所说的内存释放应该是动态庫没有unload,因此动态库内的全局变量就无法删除。如果能在void Assem_Tree_DlgstNcDestroy() 函数内FreeLibrary(??);应该就没问题了,可是我没办法求得FreeLibrary(什么?);
zhjb113所说的两点似乎都要关闭ug才后才执行啊?因为我只能用 return( UF_UNLOAD_UG_TERMINATE );而不能用 return ( UF_UNLOAD_IMMEDIATELY );(那样ug就会马上关闭)
5
发表于 2006-1-25 16:40:03 | 只看该作者
你的做法没有错误,因为你使用的是UF_UNLOAD_UG_TERMINATE。
你必须关闭UG才能重新编译也是对的。这个不是判断你没有释放内存的依据
头像被屏蔽
6
发表于 2006-1-26 20:09:45 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
7
发表于 2006-2-1 08:47:47 | 只看该作者
楼上兄弟的方法不能解决什么问题,多想想上面兄弟的正解吧。
8
发表于 2006-2-4 20:30:55 | 只看该作者
首先祝大家新年快乐,财运亨通!
我试了很多方法,目前还不能解决。
按断点来调试,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函数的动态庫那会不会有什么冲突?
9
发表于 2006-2-5 09:22:49 | 只看该作者
return ( UF_UNLOAD_IMMEDIATELY );是正确的。UG是通过 UF_UNLOAD_IMMEDIATELY 来判断是不是该卸载这个DLL。你的 UF_UNLOAD_IMMENITRY,是什么意思?

你的问题:
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
2.不会发生冲突的。虽然函数同名,但是在不同的模块内,各模块都有自己的ID的,系统能够辨识。
10
发表于 2006-2-16 08:13:07 | 只看该作者
1.全局变量的内存,DLL生命终止后,就会被系统清除了。
是否也就是说,关闭ug全局变量是不会清除的?另外动态库被加载后所占用的内存是否是固定的,如果我要关闭对话框的时候释放所有的变量、函数、类,那内存是否也会被释放出来?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3D打印手板模型快速制作服务,在线报价下单!

QQ 咨询|手机版|联系我们|iCAx开思网  

GMT+8, 2024-12-27 03:03 , Processed in 0.031180 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.3

© 2002-2024 www.iCAx.org

快速回复 返回顶部 返回列表