ObjectARX编程在VC++中的处理

转载自:http://www.mjtd.com/caddevelop/info-62-993.html
一、 创建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程序框架代码

 

posted on 2014-10-18 18:16  竹林剑客  阅读(1672)  评论(0)    收藏  举报

导航