QT中的ARX配置
LoadQtDlls.pro
1 TARGET = QTARXLoadQtDlls 2 #the sdk include path 3 INCLUDEPATH += "D:\ObjectARX 2022\inc" 4 INCLUDEPATH += "D:\ObjectARX 2022\inc-x64" 5 6 #rxapi.lib; acdb21.lib; acge21.lib; acad.lib; ac1st21.lib; accore.lib; 7 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -lrxapi 8 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -lacdb24 9 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -lacge24 10 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -lacad 11 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -lac1st24 12 LIBS+= -L"D:\ObjectARX 2022\lib-x64" -laccore 13 14 #DEF_FILE 15 DEF_FILE += $$PWD/AcRxDefault.def 16 17 #use md dll 18 QMAKE_CXXFLAGS += /MD 19 20 #change .dll to .arx 21 TARGET_EXT = .arx 22 23 #remove _DEBUG 24 DEFINES -= _DEBUG 25 DEFINES += _OBJECT_ARX_VERSION_X64_=2022 26 27 QT += core 28 QT += gui 29 QT += widgets 30 QT += qml 31 32 #Qt project template 33 TEMPLATE = lib 34 35 SOURCES += this_main.cpp \ 36 form.cpp 37 38 RESOURCES += \ 39 images.qrc 40 41 DESTDIR = $$PWD/../../release/Autocad2022 42 43 FORMS += \ 44 form.ui 45 46 HEADERS += \ 47 form.h
ARX入口书写
this_main.cpp
1 #pragma warning( push) 2 #pragma warning (disable: 4189 4100 ) 3 #include <Windows.h> 4 #include <arxHeaders.h> 5 #pragma warning( pop) 6 7 #include <string_view> 8 9 using namespace std::string_literals; 10 11 #include <QtWidgets> 12 #include <QtQml> 13 #include<QMessageBox> 14 15 inline void HellowWorld() { 16 acutPrintf(LR"(Hellow Word! 17 )"); 18 } 19 inline void HellowWorldARX() { 20 // QJSEngine varE; 21 // varE.evaluate( QString("1+1") ); 22 { 23 QMessageBox varBox ; 24 varBox.setText(("Hellow World!")); 25 varBox.exec() ; 26 } 27 auto varDataTime = QDateTime::currentDateTime().toString().toStdWString(); 28 varDataTime = LR"(Hellow World!)" + varDataTime ; 29 acutPrintf(varDataTime.c_str()); 30 } 31 32 namespace { 33 namespace _cpp_private { 34 const std::string qtApplicationPath ="123";/*!!!*/ 35 //#if _OBJECT_ARX_VERSION_X64_ == 2018 36 // u8R"(D:\Program Files\AutoCAD 2018\acad.exe)"s; 37 //#else 38 // u8R"(D:\Program Files\AutoCAD 2022\AutoCAD 2022\acad.exe)"; 39 //#endif 40 inline int & getArgc() { 41 static int ans; 42 ans = 1; 43 return ans; 44 } 45 inline char** getArgv() { 46 static char acadpath[] =u8R"(D:\Program Files\AutoCAD 2022\AutoCAD 2022\acad.exe)"; 47 static char *argv[] = { nullptr }; 48 std::copy(qtApplicationPath.begin(), qtApplicationPath.end(), 49 static_cast<char*>(acadpath)); 50 argv[0] = static_cast<char *>(acadpath); 51 return argv; 52 } 53 } 54 }/*namespace*/ 55 56 extern "C" AcRx::AppRetCode 57 acrxEntryPoint(AcRx::AppMsgCode msg, void* pkt) { 58 switch (msg) { 59 case AcRx::kInitAppMsg: { 60 acrxDynamicLinker->unlockApplication(pkt); 61 acrxRegisterAppMDIAware(pkt); 62 /*****************************************/ 63 { 64 if (qApp == nullptr) { 65 /*create the qt applicaton and never destory it*/ 66 auto varQtApplication = 67 new QApplication(_cpp_private::getArgc(), _cpp_private::getArgv()); 68 (void)varQtApplication; 69 } 70 { 71 /*force to load images plugins*/ 72 QImage varImage{ QString(":/png/this.png") }; 73 varImage.width(); 74 varImage.height(); 75 } 76 77 } 78 /*****************************************/ 79 acedRegCmds->addCommand( 80 L"SSTD_GLOBAL_CMD_GROUP", 81 L"HellowWorld", 82 L"HellowWorld", 83 ACRX_CMD_MODAL, 84 &HellowWorldARX); 85 }break; 86 case AcRx::kUnloadAppMsg: {}break; 87 default:break; 88 } 89 return AcRx::kRetOK; 90 } 91 92 /********************************/
代码结构
结果展示
this.png
生成的arx
细节注意
arx同级目录的dll
arx同级目录的dll是qt编译出的,不然无法加载
使用的命令D:\Qt\5.15.2\msvc2019_64>windeployqt.exe C:\Users\yhx\Downloads\ObjectArxAutocad2018Vs2017Qt59-master\ObjectArxAutocad2018Vs2017Qt59-master\release\Autocad2022\QTARXLoadQtDlls.arx
CAD加载arx
使用命令arx