找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4072|回复: 14

[求助] 怎么区分arx是手动卸载还是CAD关闭卸载?

[复制链接]

已领礼包: 184个

财富等级: 日进斗金

发表于 2016-4-10 10:50:47 | 显示全部楼层 |阅读模式

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

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

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

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-4-10 10:57:20 | 显示全部楼层
ACAD有关闭事件

点评

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

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-10 11:03:17 | 显示全部楼层

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

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2016-4-10 11:30:57 | 显示全部楼层
还有数据库关闭事件吧

点评

acrxEntryPoint这个函数为什么会执行两次? extern "C" AcRx::AppRetCode acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { CString str; str.Format(L"%d",msg); AfxMessageBox(str); switch (ms  详情 回复 发表于 2016-4-10 13:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-10 13:30:13 | 显示全部楼层
iLisp 发表于 2016-4-10 11:30
还有数据库关闭事件吧

acrxEntryPoint这个函数为什么会执行两次?
extern "C" AcRx::AppRetCode
acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt)
{
CString str;
str.Format(L"%d",msg);
AfxMessageBox(str);
    switch (msg)
     {
  case AcRx::kInitAppMsg:
   acrxDynamicLinker->unlockApplication(pkt);
   acrxRegisterAppMDIAware(pkt);
   initApp();
   Regiter();
   break;
  case AcRx::kQuitMsg:
   AfxMessageBox(L"CAD关闭!!!");
   unloadApp();
   break;
  case AcRx::kUnloadAppMsg:
   unloadApp();
   AfxMessageBox(L"CAD手动卸载arx!!!");
   unRegiter();
   break;
  case AcRx::kLoadDwgMsg:
   break;
  default:
       break;
    }
    return AcRx::kRetOK;
}
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-4-10 14:59:16 | 显示全部楼层
你打开了两个窗口了吧?

点评

肯定没有。我使用的天正加载的。用的也是最经典的手动创建arx步骤。。。这个函数的确会进行四次afxmessagebox。。。。  详情 回复 发表于 2016-4-10 15:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-10 15:10:34 | 显示全部楼层
XDSoft 发表于 2016-4-10 14:59
你打开了两个窗口了吧?

肯定没有。我使用的天正加载的。用的也是最经典的手动创建arx步骤。。。这个函数的确会进行四次afxmessagebox。。。。

点评

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-4-10 16:25:40 | 显示全部楼层
qq564837358 发表于 2016-4-10 15:10
肯定没有。我使用的天正加载的。用的也是最经典的手动创建arx步骤。。。这个函数的确会进行四次afxmessag ...

卸载的时候还要执行一次 kUnLoadDwg

点评

开多少张DWG,关闭就会执行多少次kUnLoadDwg。个人愚见。 另:我想实现的是这样的功能:ARX手动卸载时,清除在注册表的内容。但是CAD关闭时,如果没有手动卸载ARX,则下次启动时会自动加载。如附件所示。怎么实现?  详情 回复 发表于 2016-4-11 08:30
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-11 08:30:38 | 显示全部楼层
XDSoft 发表于 2016-4-10 16:25
卸载的时候还要执行一次 kUnLoadDwg

开多少张DWG,关闭就会执行多少次kUnLoadDwg。个人愚见。
另:我想实现的是这样的功能:ARX手动卸载时,清除在注册表的内容。但是CAD关闭时,如果没有手动卸载ARX,则下次启动时会自动加载。如附件所示。怎么实现?各位大大给点意见。

GetMyPath.cpp

1.34 KB, 阅读权限: 10, 下载次数: 6, 下载积分: D豆 -1 , 活跃度 1

点评

很明显这个不能在你的主程序代码里面实现,应该用反应器,监视文档的变化。  详情 回复 发表于 2016-4-11 10:02
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-4-11 10:02:18 | 显示全部楼层
qq564837358 发表于 2016-4-11 08:30
开多少张DWG,关闭就会执行多少次kUnLoadDwg。个人愚见。
另:我想实现的是这样的功能:ARX手动卸载时, ...

很明显这个不能在你的主程序代码里面实现,应该用反应器,监视文档的变化。

点评

首先是这样的,我一开始的目的是要1.加载ARX同时使该ARX下次启动CAD自动加载; 2.如果手动卸载ARX或程序非关闭状态卸载ARX则同时使得该ARX下次启动CAD不再跟随CAD启动。有了如上两个目的才会出现这个“怎么区分ar  详情 回复 发表于 2016-4-13 10:21
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-13 10:21:53 | 显示全部楼层
本帖最后由 qq564837358 于 2016-4-13 10:27 编辑
newer 发表于 2016-4-11 10:02
很明显这个不能在你的主程序代码里面实现,应该用反应器,监视文档的变化。

首先是这样的,我一开始的目的是要1.加载ARX同时使该ARX下次启动CAD自动加载;

2.如果手动卸载ARX或程序非关闭状态卸载ARX则同时使得该ARX下次启动CAD不再跟随CAD启动。有了如上两个目的才会出现这个“怎么区分arx是手动卸载还是CAD关闭卸载?”疑问。
然后是,如下是我的解决方案,基于关闭CAD时,是先执行kQuitMsg再执行kUnloadAppMsg,请大侠帮忙看看有什么不足?
  1. #include "StdAfx.h"
  2. #include "GetMyPath.h"
  3. //加载一次后,后续不用再次加载。
  4. void Regiter ()
  5. {
  6.   // TODO: Load dependencies here
  7.   AcadAppInfo appInfo;
  8.   ACHAR*Path=acedGetAppName();
  9.   ACHAR Drive[_MAX_DRIVE];
  10.   ACHAR Dir[_MAX_DIR];
  11.   ACHAR FileName[_MAX_FNAME];
  12.   ACHAR Ext[_MAX_EXT];
  13.   _wsplitpath(Path,Drive,Dir,FileName,Ext);
  14.   appInfo.setAppName(FileName); // Application name
  15.   appInfo.setModuleName(Path);// Module path
  16.   appInfo.setAppDesc(FileName); // Description
  17.   appInfo.setLoadReason(// Specify when we want these to load
  18.     AcadApp::LoadReasons(
  19.     AcadApp::kOnCommandInvocation |
  20.     AcadApp::kOnAutoCADStartup |
  21.     AcadApp::kOnProxyDetection |
  22.     AcadApp::kOnLoadRequest));
  23.   appInfo.writeToRegistry();
  24.   appInfo.writeGroupNameToRegistry(FileName);
  25.   appInfo.writeCommandNameToRegistry(FileName,FileName);
  26.   return;
  27. }
  28. //手动卸载ARX时,自动删除注册表内容
  29. void unRegiter(AcRx::AppMsgCode msg)
  30. {
  31.   AcadAppInfo appInfo;
  32.   ACHAR*Path=acedGetAppName();
  33.   ACHAR Drive[_MAX_DRIVE];
  34.   ACHAR Dir[_MAX_DIR];
  35.   ACHAR FileName[_MAX_FNAME];
  36.   ACHAR Ext[_MAX_EXT];
  37.   _wsplitpath(Path,Drive,Dir,FileName,Ext);
  38.   //AfxMessageBox(FileName);
  39.   appInfo.setAppName(FileName); // Application name
  40.   switch(msg)
  41.   {
  42.   case AcRx::kQuitMsg:
  43.     appInfo.readFromRegistry();//需要先readFromRegistry,否则下句代码会报错。
  44.     appInfo.setAppDesc(L"kQuitMsg");
  45.     appInfo.writeToRegistry();
  46.     break;
  47.   case AcRx::kUnloadAppMsg:
  48.     appInfo.readFromRegistry();
  49.     const ACHAR* ach=appInfo.appDesc();
  50.     if (wcscmp(ach,L"kQuitMsg") == 0)
  51.     {
  52.       appInfo.setAppDesc(FileName);//还原
  53.       appInfo.writeToRegistry();
  54.       break;
  55.     }
  56.     appInfo.delFromRegistry();
  57.     break;
  58.   }
  59.   return;
  60. }


GetMyPath.cpp

1.64 KB, 下载次数: 5, 下载积分: D豆 -1 , 活跃度 1

点评

你本意是 1、第一次加载的时候,自动写注册表,让你的ARX以后随着CAD自动加载吧? 2、如果用户用APPLOAD等手工卸载你的ARX时候,你想同时删除掉注册表里面的AutoLoader,以后CAD再启动时候不在自动加载你的ARX吧?  详情 回复 发表于 2016-4-13 10:27
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-4-13 10:27:21 | 显示全部楼层
qq564837358 发表于 2016-4-13 10:21
首先是这样的,我一开始的目的是要1.加载ARX同时使该ARX下次启动CAD自动加载;

2.如果手动卸载ARX或程 ...

你本意是
1、第一次加载的时候,自动写注册表,让你的ARX以后随着CAD自动加载吧?
2、如果用户用APPLOAD等手工卸载你的ARX时候,你想同时删除掉注册表里面的AutoLoader,以后CAD再启动时候不在自动加载你的ARX吧?而正常关闭CAD不删除AutoLoader.

点评

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

使用道具 举报

已领礼包: 184个

财富等级: 日进斗金

 楼主| 发表于 2016-4-13 10:28:41 | 显示全部楼层
XDSoft 发表于 2016-4-13 10:27
你本意是
1、第一次加载的时候,自动写注册表,让你的ARX以后随着CAD自动加载吧?
2、如果用户用APPLOA ...

是的。表达不是很到位。见谅。

点评

用反应器监视应用程序的加载和卸载 你试试下面的代码,看看APPLOAD卸载你的程序时候,打印是什么提示  详情 回复 发表于 2016-4-13 10:40
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2016-4-13 10:40:54 | 显示全部楼层
qq564837358 发表于 2016-4-13 10:28
是的。表达不是很到位。见谅。

用反应器监视应用程序的加载和卸载
你试试下面的代码,看看APPLOAD卸载你的程序时候,打印是什么提示

  1. class AppReactor: public AcRxDLinkerReactor {
  2. public:
  3.     virtual void
  4.     rxAppLoaded(
  5.         const char* moduleName);
  6.     {
  7.         acutPrintf("Event: rxAppLoaded '%s'\n", moduleName);
  8.     }
  9.     virtual void
  10.     rxAppUnloaded(
  11.         const char* moduleName);
  12.     {
  13.         acutPrintf("Event: rxAppUnloaded '%s'\n", moduleName);
  14.     }
  15. };

  16. AppReactor* apprtest = NULL;

  17. void enableNotification() {
  18.     acrxDynamicLinker->addReactor(apprtest);
  19. }

  20. void disableNotification() {
  21.     acrxDynamicLinker->removeReactor(apprtest);
  22. }

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

使用道具 举报

已领礼包: 14个

财富等级: 恭喜发财

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-24 16:33 , Processed in 0.397845 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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