• 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。当然中间还有一些文件名,后缀之类的检查,这里就不再赘述了。
    作者:W.M.steve
    出处:http://www.cnblogs.com/weisteve/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    jsp 特殊标签
    poj 1753 Flip Game 高斯消元 异或方程组 求最值
    zoj 3155 Street Lamp 高斯消元 异或方程组 求方案数
    poj1222 EXTENDED LIGHTS OUT 高斯消元解异或方程组 模板
    zoj 3930 Dice Notation 模拟
    zoj 3157 Weapon 线段树求逆序对数
    hdu 1242 Rescue BFS+优先队列
    hdu 3466 Proud Merchants 贪心+01背包
    zoj 3689 Digging 贪心+01背包
    hdu 2602 Bone Collector 01背包模板
  • 原文地址:https://www.cnblogs.com/weisteve/p/2203793.html
Copyright © 2020-2023  润新知