一、 建立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程式框架程式碼採納哦
一、 建立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程式框架程式碼採納哦