找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4205|回复: 22

[求助] 关于ARX卸载是acedDefun定义的函数如何卸载问题

[复制链接]
发表于 2013-9-11 12:46:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

×
本帖最后由 Love-Lisp 于 2013-9-11 22:28 编辑

在arx被卸载后,除当前文档中acedDefun定义的函数被卸载外,其他已打开的文档中acedDefun定义的函数却并没有被卸载,问题出在哪?请老大指点一下!
我的代码是这样的:
  1. struct func_entry { TCHAR *func_name; int (*func) (); };
  2. /* 定义函数. */
  3. struct func_entry func_table[] =
  4. {
  5.     {_T("xlrx-OnorInPoly"), XL_OnorInPoly}, /*判断封闭曲线1是否在封闭曲线2内  */
  6.     {_T("xlrx-GetHull"), XL_GetHull}, //根据点表计算凸包
  7.     {_T("xlrx-Spl_Ell2LWPoly"), XL_Spl_Ell2LWPoly}, //LWPOLYLINE模拟SPline
  8. };

  9. //加载自定义函数
  10. static int funcload()
  11. {
  12.     int i;
  13.     for (i = 0; i < ELEMENTS(func_table); i++) {
  14.         if (!acedDefun(func_table.func_name, (short)i))
  15.             return RTERROR;
  16.     }
  17.     return RTNORM;
  18. }

  19. //执行函数
  20. int dofun()
  21. {
  22.     int val;

  23.      if ((val = acedGetFunCode()) < 0 || val >= ELEMENTS(func_table)) {
  24.         acdbFail(_T(/*MSG2*/"Received nonexistent function code."));
  25.         return RTERROR;
  26.     }

  27.     //pArgs = acedGetArgs();

  28.     val = (*func_table[val].func)();
  29.      return val;
  30. }
  31. //卸载加载的自定义函数
  32. void unloadApp()  
  33. {   
  34.     int i;
  35.     for (i = 0; i < ELEMENTS(func_table); i++) {
  36.         acedUndef(func_table.func_name, (short)i);
  37.     }
  38.   
  39. }  

  40. //主程序入口
  41. class CAPIApp : public AcRxArxApp {

  42. public:
  43.     CAPIApp () : AcRxArxApp () {}

  44.     virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
  45.         // TODO: Load dependencies here
  46.         acrxDynamicLinker->unlockApplication(pkt);
  47.         acrxDynamicLinker->registerAppMDIAware(pkt);
  48.         // You *must* call On_kInitAppMsg here

  49.         AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;

  50.         // TODO: Add your initialization code here
  51.         initApp() ;
  52.         acutPrintf(_T("\nAPI 已加载!"));
  53.         return (retCode) ;
  54.     }
  55.     virtual AcRx::AppRetCode On_kLoadDwgMsg (void *pkt) {
  56.         // TODO: Load dependencies here
  57.         // You *must* call On_kInitAppMsg here
  58.         AcRx::AppRetCode retCode =AcRxArxApp::On_kLoadDwgMsg (pkt) ;

  59.         // TODO: Add your initialization code here
  60.                 //加载自定义函数
  61.         funcload();
  62.         return (retCode) ;
  63.     }
  64.         //On_kUnloadDwgMsg  误写成On_kUnLoadDwgMsg 让我调试了好几天{:soso_e110:}
  65.         virtual AcRx::AppRetCode On_kUnloadDwgMsg (void *pkt) {
  66.                 // TODO: Load dependencies here
  67.                 AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadDwgMsg(pkt) ;

  68.                 // TODO: Add your initialization code here
  69.                 unloadApp() ;

  70.                 return (retCode) ;
  71.         }
  72.     virtual AcRx::AppRetCode On_kInvkSubrMsg (void *pkt) {
  73.         // TODO: Load dependencies here
  74.         acrxDynamicLinker->registerAppMDIAware(pkt);
  75.         // You *must* call On_kInitAppMsg here
  76.         AcRx::AppRetCode retCode =AcRxArxApp::On_kInvkSubrMsg (pkt) ;

  77.         // TODO: Add your initialization code here
  78.                 //执行函数
  79.         dofun();
  80.         return (retCode) ;
  81.     }
  82.     virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
  83.         // TODO: Add your code here
  84.         acrxDynamicLinker->unlockApplication(pkt);
  85.         // You *must* call On_kUnloadAppMsg here
  86.     acedRegCmds->removeGroup(_T("XLRX_ADDENTITY_COMMANDS"));  
  87.        AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;

  88.         // TODO: Unload dependencies here
  89.          return (retCode) ;
  90.     }

  91.     virtual void RegisterServerComponents () {

  92.     }
  93. public:

  94. };

  95. IMPLEMENT_ARX_ENTRYPOINT(CAPIApp)


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 13:15:15 | 显示全部楼层
在 kUnloadDwgMsg 里面卸载你的函数,kloadDwgMsg 里面加载你的函数,这两个消息处理是在打开、关闭图形的时候调用

而kUnloadAppMsg是在主程序框架退出的时候调用。

点评

我是在某个打开的文档里将ARX主程序卸载了,但是在其他打开的文档里arx函数却并未卸载,按说On_kUnloadAppMsg 事件里进行函数卸载acedUndef后在所有打开的文档里函数应该被卸载,但是unloadApp()没起作用!哪里做的  详情 回复 发表于 2013-9-11 14:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2013-9-11 14:06:21 来自手机 | 显示全部楼层
呵呵,xdrxapi卸载后那些函数在vlide内还是亮显的,但查询为nil
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 14:15:19 | 显示全部楼层
XDSoft 发表于 2013-9-11 13:15
在 kUnloadDwgMsg 里面卸载你的函数,kloadDwgMsg 里面加载你的函数,这两个消息处理是在打开、关闭图形的 ...

我是在某个打开的文档里将ARX主程序卸载了,但是在其他打开的文档里arx函数却并未卸载,按说On_kUnloadAppMsg 事件里进行函数卸载acedUndef后在所有打开的文档里函数应该被卸载,但是unloadApp()没起作用!哪里做的不对?

点评

你在一楼贴的代码没全? 没 unloadapp函数, 没 kUnLoadDwg 事件响应函数?  详情 回复 发表于 2013-9-11 15:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 15:02:00 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 14:15
我是在某个打开的文档里将ARX主程序卸载了,但是在其他打开的文档里arx函数却并未卸载,按说On_kUnloadAp ...

你在一楼贴的代码没全?

没 unloadapp函数, 没 kUnLoadDwg 事件响应函数?

点评

一楼有unloadapp函数,然后我在加上 kUnLoadDwg 事件响应,效果还是一样,arx卸载后,函数未被卸载! virtual AcRx::AppRetCode On_kUnLoadDwgMsg (void *pkt) { // TODO: Load dependencies here // You *m  详情 回复 发表于 2013-9-11 15:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 15:09:27 | 显示全部楼层
本帖最后由 Love-Lisp 于 2013-9-11 15:11 编辑
XDSoft 发表于 2013-9-11 15:02
你在一楼贴的代码没全?

没 unloadapp函数, 没 kUnLoadDwg 事件响应函数?

一楼有unloadapp函数,然后我在加上 kUnLoadDwg 事件响应,效果还是一样,arx卸载后,其他已打开的文档中函数未被卸载!
        virtual AcRx::AppRetCode On_kUnLoadDwgMsg (void *pkt) {
                // TODO: Load dependencies here
                // You *must* call On_kInitAppMsg here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadDwgMsg(pkt) ;

                // TODO: Add your initialization code here
                unloadApp() ;
                return (retCode) ;
        }

点评

看到了,你调试或者在unLoadDwg 和unLoadApp 还有卸载函数里面加上打印语句,看看你下载时候哪个没执行到。 移除命令那句要放到 On_kUnloadAppMsg 事件里面处理,不能在On_kUnloadDwgMsg里面运行。unloadFunc 在O  详情 回复 发表于 2013-9-11 15:24
卸载函数你咋写的?  详情 回复 发表于 2013-9-11 15:13
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 15:13:30 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 15:09
一楼有unloadapp函数,然后我在加上 kUnLoadDwg 事件响应,效果还是一样,arx卸载后,其他已打开的文档中 ...

卸载函数你咋写的?

点评

[*]//卸载加载的自定义函数 [*]void unloadApp() [*]{ [*] acedRegCmds->removeGroup(_T("XLRX_ADDENTITY_COMMANDS")); [*] int i; [*] for (i = 0; i < ELEMENTS(func_table); i+  详情 回复 发表于 2013-9-11 15:19
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 15:19:09 | 显示全部楼层
XDSoft 发表于 2013-9-11 15:13
卸载函数你咋写的?


论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 15:24:34 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 15:09
一楼有unloadapp函数,然后我在加上 kUnLoadDwg 事件响应,效果还是一样,arx卸载后,其他已打开的文档中 ...

看到了,你调试或者在unLoadDwg 和unLoadApp 还有卸载函数里面加上打印语句,看看你下载时候哪个没执行到。

移除命令那句要放到 On_kUnloadAppMsg 事件里面处理,不能在On_kUnloadDwgMsg里面运行。unloadFunc 在On_kUnloadDwgMsg里面。


移除应用程序和移除外部函数要分开。

点评

On_kUnloadDwgMsg事件是刚添加上去的,其实应该没用!我删掉了! 经测试,发现卸载ARX后,卸载函数unloadapp()和 On_kUnloadAppMsg事件的代码只在当前文档里运行,在其他文档里根本没有运行!  详情 回复 发表于 2013-9-11 15:46
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 15:46:43 | 显示全部楼层
XDSoft 发表于 2013-9-11 15:24
看到了,你调试或者在unLoadDwg 和unLoadApp 还有卸载函数里面加上打印语句,看看你下载时候哪个没执行到 ...

On_kUnloadDwgMsg事件是刚添加上去的,其实应该没用!我删掉了!
经测试,发现卸载ARX后,卸载函数unloadapp()和 On_kUnloadAppMsg事件的代码只在当前文档里运行,在其他文档里根本没有运行!

点评

API 的卸载部分 On_kUnloadDwgMsg 不能删除的,和当前文档相关的事件就通过它,有个资料,AUTOCAD运行后各个事件的发生顺序的,等晚上回家找到给你贴上来。  详情 回复 发表于 2013-9-11 16:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 16:02:55 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 15:46
On_kUnloadDwgMsg事件是刚添加上去的,其实应该没用!我删掉了!
经测试,发现卸载ARX后,卸载函数unloa ...

API 的卸载部分


  1. AcRx::AppRetCode UnloadFunctions()
  2. {
  3.         int i;

  4.         // Undefine each function we defined

  5.         for (i = 1; i < ELEMENTS(exfun); i++) {
  6.                 acedUndef(exfun.name,i);
  7.         }

  8.         return AcRx::kRetOK;
  9. }


On_kUnloadDwgMsg 不能删除的,和当前文档相关的事件就通过它,有个资料,AUTOCAD运行后各个事件的发生顺序的,等晚上回家找到给你贴上来。


点评

目前在我的API的UnLoadDwgMsg事件里没有事情代码,只是放在程序里! virtual AcRx::AppRetCode On_kUnLoadDwgMsg (void *pkt) { // TODO: Load dependencies here AcRx::AppRetCode retCode =AcRxArxApp::On  详情 回复 发表于 2013-9-11 16:16
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 16:16:33 | 显示全部楼层

目前在我的API的UnLoadDwgMsg事件里没有事情代码,只是放在程序里!
        virtual AcRx::AppRetCode On_kUnLoadDwgMsg (void *pkt) {
                // TODO: Load dependencies here
                AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadDwgMsg(pkt) ;

                // TODO: Add your initialization code here
#ifdef RX_DEBUG
                acutPrintf(_T("\n卸载载文档。。。"));
#endif
                return (retCode) ;
        }

问题是我的 unloadapp()函数放在UnLoadAppMsg事件里,只在当前文档里执行一次,卸载掉函数,但是在其他打开文档里并没有执行 unloadapp()卸载函数!

点评

你必须得把 卸载外部函数 的代码就是 acedUndef 放到 UnLoadDwgMsg 里面,程序卸载的过程是流程各个事件执行的顺序晚上我贴上来。  详情 回复 发表于 2013-9-11 16:34
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 16:34:25 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 16:16
目前在我的API的UnLoadDwgMsg事件里没有事情代码,只是放在程序里!
        virtual AcRx::AppRetCode On_kUnL ...

你必须得把 卸载外部函数 的代码就是 acedUndef 放到 UnLoadDwgMsg 里面,程序卸载的过程是流程各个事件执行的顺序晚上我贴上来。

点评

还是没整明白! 我把acedUndef 放到 UnLoadDwgMsg 里面,结果还是一样!  详情 回复 发表于 2013-9-11 16:52
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-9-11 16:52:30 | 显示全部楼层
XDSoft 发表于 2013-9-11 16:34
你必须得把 卸载外部函数 的代码就是 acedUndef 放到 UnLoadDwgMsg 里面,程序卸载的过程是流程各个事件 ...

还是没整明白!
我把acedUndef 放到 UnLoadDwgMsg 里面,结果还是一样!{:soso_e127:}

点评

你把DEBUG里面的打印语句拿出来,看看卸载时候,执行到这个unloaddwg里面没,如果没,说明你的框架有问题了。 另外你先别用函数,把卸载函数循环部分直接拿到 OnUnloadDwg里面来。  详情 回复 发表于 2013-9-11 17:15
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-9-11 17:15:47 | 显示全部楼层
Love-Lisp 发表于 2013-9-11 16:52
还是没整明白!
我把acedUndef 放到 UnLoadDwgMsg 里面,结果还是一样!

你把DEBUG里面的打印语句拿出来,看看卸载时候,执行到这个unloaddwg里面没,如果没,说明你的框架有问题了。
另外你先别用函数,把卸载函数循环部分直接拿到 OnUnloadDwg里面来。

点评

试过了,On_kUnLoadDwgMsg 事件根本没有被执行!问题出在哪呢?  详情 回复 发表于 2013-9-11 20:25
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 12:32 , Processed in 0.444029 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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