NASA 发表于 2005-8-2 09:06

[灌水]ObjectARX编程在VC++中的处理

本帖最后由 wdhd 于 2016-3-30 16:02 编辑

  一、 创建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程序框架代码

vehicle 发表于 2006-7-24 10:00

谢谢!
好久没用过了

huright 发表于 2006-11-6 17:59

楼主,请问有没有objectARX软件包啊?能不能发给俺一份阿。先谢谢了
页: [1]
查看完整版本: [灌水]ObjectARX编程在VC++中的处理