ARX开发环境与ARX加载的秘密[转]

回想曾经开始学做ARX的日子,帮助文档不详尽,例子太少,苦不堪言啊。所以今天兴致好,发个贴子,让走过弯路的朋友们少走弯路,也算为这个注册N久的坛子尽点力。希望与大家多交流,共同提高。
回到正题,首先我们来了解一下ARX开发环境,大家普遍的情况应该是ACAD+SDK+VS。但这中间有一个版本问题,困扰大家,不同版本可能加载不上,不能用,有些朋友在升级ARX,移植到高版本上都有些头痛。下面来解释一下这个问题
第一要明确的是ACAD的版本从2006-2007中间有一个跳跃。2006之前是非Unicode版本的,包括它所有的API中,如加入Command传的字符串参数。而07开始都是Unicode版本的,所以如果有人试图跨这道界线去升级(没有代码的情况)的话,我的建议是放弃。而如果你有源代码,那恭喜你,你还有机会。
其次,ACAD/ARX的SDK版本都说三年一版,那究竟什么是三年一个版本所指?简单来说就是CAD04,05,06是一代,CAD07,08,09是一代,CAD 10 11又是一代。同一代ACAD平台上的ARX可以相互通用,可以加载成功。这是为什么呢?根本原因在于,它们所依赖的运行时库不同。举例来说,CAD07,08,09依赖的是mfc80u.dll等这一套,CAD 2010和2011依赖的是mfc90u.dll这一套,它们的底子不一样,所以才会造成加载的问题。再回到和VS关系的问题上来说,我们知道说07 08 09要用VS2005, 10 11要用 VS 2008。如同上面所讲,根本原因就在于VS2005默认引用mfc80这套库,而VS2008默认引用mfc90这套库。那用VS2008能不能开发CAD 07 08 09呢?答案是可以的。但需要做一些设置,具体参见我在新浪的Blog。http://blog.sina.com.cn/s/blog_41299a970100mg04.html
在明确了上面这些之后,要做的就是在开发之前,配置好相应的环境。一个最最重要的就是要保证,你的ACAD和你的SDK是配套的,(如果不配套?不是说完全不行,但是我劝你还是去下载个配套的,否则任何后果要自负)。至于VS?如果对于链接的工程设置熟悉的话,05还是08都是一样的。再低的版本?我已经不用了很久了,所以还是推荐VS05以上版本。
接下来来说一下ARX的升级,最后我会谈ARX的加载。
关于升级,包括2种情况,一种有源码,你是ARX的开发者。另一种是没有源码,你是它的使用者。关于第一种情况,配合新版本的编译环境,重新编译,如果版本跨过06-07这道界线的话,你需要修改所有的字符串为Unicode。(记得CAD07刚出来的时候,它对应的SDK的向导,应该有一个插件可以帮助你找到需要改动的字符串,当然还是要你自己来改)。至于第二种情况,就会相当烦锁了。首先,你需要没跨那道坎,否则希望基本是渺茫。第二你需要了解,DLL组织,ARX文件特点,运行时库版本控制与修改这些才有可能做到。在我Blog中有一些这方面内容的介绍。
最后我们再说ARX的加载,它到底做了哪些操作呢?首先,要明确,ARX是DLL文件,只不过是一个特殊的DLL文件,它要求实现acrxGetAPIVersion和acrxEntryPoint这2个导出函数。acrxEntryPoint相信大家都已经实现过了,而acrxGetAPIVersion这个呢,似乎并没有做嘛,答案藏在你链接的Lib文件里。它的默认实现在rxapi.lib中,按推断这个rxapi.lib应该算做叫静态库?
当ACAD加载一个ARX的时候,它会首先读入你的ARX文件,比较它的Link版本号,其实就是VS链接程序时写入的版本信息,如果你用的不同版本的VS去编译的ARX,那你就需要在这一步去改一下,根据DLL文件的组织,找到Link版本所对应的偏移,里面应该写着9或者8,9代码VS2008,8代码VS2005。类推,7代码撒就不说了吧。。。之后加载程序会去查找你的模块有没有实现上面说的那二个函数,之后调用LoadLibrary去加载DLL进内存,接着就去调用acrxGetApiVersion来检查你这个ARX版本是否匹配,如果你没用对SDK版本,可能就死在这步了。最后会调用EntryPoint。当然中间还有一些文件名,后缀之类的检查,这里就不再赘述了。
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值