本帖最后由 baitang36 于 2023-12-7 14:46 编辑
一般情况下,用appload或者直接拖拽一个arx文件到绘图区,arx文件就加载成功了。 如果用autollisp加载arx文件,用语句(arxload "abc.arx") 这个arxload函数是如何实现的呢?从内存中挖出来,它的代码是这样的: 00000000: 14 03 01 01 01 00000005: 64 02 00000007: 05 01 00000009: 29 00000010: 0d 07 00 00000013: 5f 00 2e 30 00 00 00000019: 0a 00000020: 05 00 00000022: 02 00000023: 51 01 a9 01 01 00 ;box 00000029: 51 02 9c 01 01 00 ;ads-arxload 00000035: 08 02 00000037: 05 02 00000039: 25 0c 00000041: 0d 1e 00 00000044: 05 01 00000046: 0d 04 00 00000049: 05 01 00000051: 28 00000052: 16 00000053: 09 b4 02 ;"VLMSG.DLL" 00000056: 33 b6 35 00 00 00000061: 51 02 b3 02 01 00 ;string-resource 00000067: 51 01 e2 02 01 00 ;_msg-err 00000073: 16 00000074: 05 02 00000076: 16 可以看出,它调用了一个函数ads-arxload,这是个没有公开的内部保留函数,它是用c++写的。 它的代码反汇编一下是这样的: 可以看出,ads-arxload这个函数又调用了acedArxLoad这个函数,它是acad.exe定义的 继续找acedArxLoad的代码,发现它调用了一个acdb17.dll中的一个函数(版本不同文件名不同在acad2008中是acdb17.dll) ?loadModule@AcRxImpDynamicLinker@@UAE_NPB_W_N1@Z 它是 public: virtual bool __thiscall AcRxImpDynamicLinker::loadModule(wchar_t const *, bool, bool) 结论:arx文件的加载过程是;arxload==>ads-arxload==>acedArxLoad==> ?loadModule@AcRxImpDynamicLinker@@UAE_NPB_W_N1@Z arxload和ads-arxload都是在vl.arx中定义的,vl.arx是acad.exe加载的第一个arx程序,那它是怎么加载的?毕竟它在被加载之前无法自己加载自己。跟踪发现,答案是acad.exe直接调用了 ?loadModule@AcRxImpDynamicLinker@@UAE_NPB_W_N1@Z这个函数。
|