找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 521|回复: 4

[ARX程序]:ObjectARX编程在VC++中的处理

[复制链接]
发表于 2004-7-16 21:39:18 | 显示全部楼层 |阅读模式

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

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

×
一、 创建ObjectARX的DLL程序
  1、首先在项目选项中选“MFC AppWizard(DLL)",然后选MFC Extension DLL,然后输入项目名
  2、在“Project Settings"对话框中“General"标签项中“Microsoft Foundation Classes "域    选“Use MFC in a Shared DLL ."
  3、打开由AppWizard所建立的.cpp项目文件,删除AFX_EXTENSION_MODULE宏,并且增加AC_IMPLEMENT_EXTENSION_MODULE(emx)宏。Emx用于提供缺省资源和模块资源,切换资源状态。并且删除不需要代码、添加必要的代码(后文讲述)
  4、在Link标签项中,“General"栏“Output file name"项输入编译后的应用程序名,后缀为.arx
  5、在Link标签项中,“Output"栏,“Base address"项输入“0x1c000000","Entry-point symbol"项输入“DllEntryPoint@12"
  6、在C/C++标签项中,"Code Generation"栏“Use Run-time library"项选“Multithread DLL"
  7、在C/C++标签项中,“Preprocessor"栏中定义_WINDLL,_AFXDLL
  
  二、 MFC 模块状态执行和资源处理
  在每个使用了Microsoft Foundation Classes (MFC)的模块(EXE,DLL)中,都存在一种“全局”数据,MFC正是依靠这种全局数据才能执行正确的操作。这种全局数据就叫做MFC 模块状态。设计为扩展DLL的ARX应用程序通常假设当前的模块状态是AutoCAD的。应该确认AutoCAD的模块状态已置为当前,ARX应用程序可以通过调用AFX_MANAGE_STATE(AfxGetAppModuleState())来实现这一功能。CacModuleResourceOverride创建一个变量,一个新资源提供者由构造函数交换,缺省资源由析构函数交换。在AutoCAD中,CAcExtensionModule提供AFX_EXTENSION_MODULE结构的位置标识符和追踪模块资源和缺省资源。只有正确处理资源转台才能使ARX程序不出问题。在ARX中加入AC_IMPLEMENT_EXTENSION_MODULE(emx)宏,可以由emx.AttachInstance切换模块资源,由emx..DetachInstance()恢复缺省资源。
  三、 ARX的框架代码
  如下:
  #include "stdafx.h"
  #include "AsdkAcUiSample.h"
  #include "AsdkAcUiDialogSample.h"
  #include "AcExtensionModule.h"
  
  #ifdef _DEBUG
  #define new DEBUG_NEW
  #undef THIS_FILE
  static char THIS_FILE[] = __FILE__;
  #endif
  extern "C" HWND adsw_acadMainWnd();
  
  // Define the sole extension module object.
  AC_IMPLEMENT_EXTENSION_MODULE(theArxDLL);
  static void initApp()
  {
  
  CAcModuleResourceOverride resOverride;
  }
  
  static void unloadApp()
  {  }
  
  extern "C" int APIENTRY
  DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
  {
  UNREFERENCED_PARAMETER(lpReserved);
  
  if (dwReason == DLL_PROCESS_ATTACH)
  {    theArxDLL.AttachInstance(hInstance); }
  else if (dwReason == DLL_PROCESS_DETACH)
  {    theArxDLL.DetachInstance();  }
  return 1;  // ok
  }
  
  extern "C" AcRx::AppRetCode acrxEntryPoint( AcRx::AppMsgCode msg, void* appId)
  {
  switch( msg )
  {
  case AcRx::kInitAppMsg:
  acrxDynamicLinker->unlockApplication(appId);
  acrxDynamicLinker->registerAppMDIAware(appId);
  initApp();
  break;
  case AcRx::kUnloadAppMsg:
  unloadApp();
  break;
  case AcRx::kInitDialogMsg:
  break;
  default:
  break;
  }
  return AcRx::kRetOK;
  }
  应用以上框架代码就可以添加自己的程序功能
  四、 应用向导
  在ObjectARX 2000 SDK中有一个应用向导可以生成ARX程序框架代码

顺便给出一个链接,感兴趣的朋友可以去看看
http://www.czhx.net/article/wsjc/cad/cad1.htm
*-*1
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2004-7-29 09:30:49 | 显示全部楼层
楼主提供的连接好象无效!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

发表于 2006-7-27 22:22:05 | 显示全部楼层
楼主提出的这几点倒是十分正确的,虽然链接无效!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-14 20:33 , Processed in 0.319948 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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