明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 11643|回复: 33

ARX开发环境与ARX加载的秘密

    [复制链接]
发表于 2010-12-24 13:11:10 | 显示全部楼层 |阅读模式
本帖最后由 bluelightcsy 于 2010-12-24 13:11 编辑

   这个坛子,人气有些不旺,检讨一下,我自己也不太上。
   回想曾经开始学做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。当然中间还有一些文件名,后缀之类的检查,这里就不再赘述了。

评分

参与人数 2明经币 +2 金钱 +10 收起 理由
ihc523 + 10 我很赞同
mccad + 2 精品文章

查看全部评分

发表于 2010-12-24 21:48:47 | 显示全部楼层
很强大!希望能向你学习VC++,强烈支持你!
发表于 2010-12-24 21:56:12 | 显示全部楼层
顶,学习ing
发表于 2010-12-26 00:21:47 | 显示全部楼层
謝謝您,提供相關知識讓我們了解
发表于 2011-1-14 14:27:02 | 显示全部楼层
謝謝,顶,学习了
发表于 2011-1-14 16:32:59 | 显示全部楼层
我用VS 2005和ARX 2008试验了一下编译连接成功,但是在ACAD 2007中不能加载,请教楼主什么原因,谢谢。
 楼主| 发表于 2011-1-14 17:26:34 | 显示全部楼层
成功以后,上面提到的MajorLinkVersion这些你都改了??介绍你一个叫LoadPE的工具,把你的文件打开,找文件头里面LinkVersion,改成8你再试一下。
 楼主| 发表于 2011-1-14 17:30:26 | 显示全部楼层
我有点乱,你这个跟我说的不是一个事吧?CAD 2007是不是原来就应该用VS2005?
对应的Lib应该是acdb17.lib这一套
发表于 2011-1-18 19:58:55 | 显示全部楼层
不错,学习
发表于 2011-1-22 12:03:13 | 显示全部楼层
好主意,谢谢楼主的帮助和指点。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-25 04:52 , Processed in 0.158396 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表