在前段时间的ARX的改造过程中遇到一个ARX无论是放在.rx文件的什么位置都无法自动加载成功,但是在CAD打开之后,手动加载就能成功。
当时一直认为ARX既然能够手动加载成功应该就是没有问题,问题应该是出在加载上;然后反反复复查了这个ARX链接的所有的DLL都没有问题。今天一个朋友给了建议,说应该查查ARX的入口函数,才重新把调查的重心回到ARX本身。
在这个ARX的入口函数调用了系统初始化的接口,一路把下去,大概在经过了三四层的C++的工程之后,最后一个DLL中调用了一个C#的DLL;而这个C#的DLL的加载是写在.lsp文件中。查到这里我大概明白为什么手动加载能够成功了。CAD启动之后应该是先加载了.rx文件,后加载.lsp文件,所以自动加载的时候因为C#的DLL没有加载,导致了ARX无法加载成功;等到CAD完全启动之后C#的DLL也加载完毕了,所以手动加载ARX就能够成功。
最后的修改方案是在.lsp文件的最后通过arxload加载ARX文件成功结果这个问题:
(arxload “xxxx.ARX”)
另外,在参考arxload的时候还看到了另一个可以在.lsp文件中加载ARX的命令"autoarxload",它比"arxload"多了一个功能,就是需要指定命令进行声明:
(autoarxload “xxxx.ARX” '(“命令1” “命令2” “命令3”))
只是在使用autoarxload进行测试的时候,ARX加载成功了,但后面声明的命令以及没有声明的命令都可以使用,感觉和arxload没有区别,就不清楚这个声明的意思是什么了。
另外,在ZWCAD中使用autoarxload进行ZRX加载的时候,加载失败了,甚至ZRX的入口函数都没有进去,不知道是不是不支持autoarxload进行ZRX加载;不过在ZWCAD中arxload加载ZRX也是没有问题的。
参考:
arxload
autoarxload
【Objectarx】关于ARX自动加载失败,手动加载成功的问题调查
于 2023-10-17 17:01:16 首次发布