找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4470|回复: 23

[原创]:任意版本CAD均可加载的arx文件的研究

[复制链接]
发表于 2006-11-5 17:03:30 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.

但是目前还是碰到一些问题,就是这个函数:
acrxGetApiVersion,无法获取其代码.
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.

而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???

我试过了以下几个办法来获取这个函数的办法:
1.
[php]
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
void* acrxGetApiVersion()
{
                char szHello[] = "Hello, world!";

        __asm
        {
                    PUSH    0
                        PUSH    OFFSET szAppName    // 全局变量用OFFSET
//                        LEA     EAX, szHello        // 局部变量用LEA
//                        PUSH    EAX
                        LEA     EAX, szHello
                        PUSH    EAX
                        PUSH    0
                        CALL    DWORD PTR [MessageBoxA]     // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
        }
        //    MessageBox(0,"asm","asm end",0);

        FILE* fp;                /*定义一个文件指针*/
        fp=fopen("d:\\CLIBt.txt", "a+");  /*打开当前目录名为CLIB的文件只读*/
    MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);        
        fprintf(fp, "%d\n", 12345678);
    MessageBox(0,"fprintf","fprintf end",0);
        fclose(fp);            /*关闭打开的文件*/

// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
  return acrxGetApiVersion_Mid();
         }
[/php]

2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
[php]
//        6.acrxGetApiVersion
            typedef void* ( WINAPI *PacrxGetApiVersion )();
    PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
                                    ::GetProcAddress( ::LoadLibrary( "AcArray.arx" ),
                                                      "acrxGetApiVersion" );
[/php]

3.从lib文件中获取,只有这个是可行的.
#pragma comment( lib, "rxapi.lib" )

定义这样一个头文件
[PHP]
/*自定义CAD函数*/
struct AcRx {

    typedef void (*FcnPtr) ();

    enum         DictIterType { kDictSorted   = 0,
                                kDictCollated = 1 };

    enum         Ordering     { kLessThan     = -1,
                                kEqual              = 0,
                                kGreaterThan  = 1,
                                kNotOrderable = 2 };

    enum         AppMsgCode   { kNullMsg         = 0,
                                kInitAppMsg         = 1,
                                kUnloadAppMsg         = 2,
                                kLoadDwgMsg         = 3,
                                kUnloadDwgMsg         = 4,
                                kInvkSubrMsg     = 5,
                                kCfgMsg          = 6,
                                kEndMsg          = 7,
                                kQuitMsg         = 8,
                                kSaveMsg         = 9,
                                kDependencyMsg   = 10,
                                kNoDependencyMsg = 11,
                                kOleUnloadAppMsg = 12,
                                kPreQuitMsg      = 13,
                                kInitDialogMsg   = 14,
                                kEndDialogMsg    = 15 };                                
        

    enum         AppRetCode   { kRetOK          = 0,
                                kRetError        = 3 };
};

#define RTERROR          (-5001) // Some other error
#define RTNORM    5100 /* Request succeeded */



//1.
    HMODULE hDll = ::LoadLibrary( "acad.exe" );
    DWORD err = GetLastError();
//2.int            acedPrompt (const char *str);
    typedef int ( WINAPI *PacedPrompt )(const char *str);
    PacedPrompt acedPrompt = ( PacedPrompt )
                                    ::GetProcAddress( hDll,
                                                      "acedPrompt" );
//   err = GetLastError();
//3.HWND           adsw_acadMainWnd();
    typedef HWND ( WINAPI *Padsw_acadMainWnd )();
    Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
                                    ::GetProcAddress( hDll,
                                                      "adsw_acadMainWnd" );
//4.int       acedDefun (const char *sname, short funcno);
    typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
    PacedDefun acedDefun = ( PacedDefun )
                                    ::GetProcAddress( hDll,
                                                      "acedDefun" );
//5.int            acedUndef (const char *sname, short funcno);
    typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
    PacedUndef acedUndef = ( PacedUndef )
                                    ::GetProcAddress( hDll,
                                                      "acedUndef" );
[/PHP]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2006-11-6 08:21:33 | 显示全部楼层
楼主研究的够深,学习一下!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-8 21:35:31 | 显示全部楼层
好思路
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-9 11:00:11 | 显示全部楼层
关注中,虽然不是很明白。。。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-9 14:18:23 | 显示全部楼层
我也一直在关注这个问题,但是经常程序里面需要用到MFC的东西,这个问题基本不敢奢望了。
我们都是被微软绑架了。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-11-9 18:14:21 | 显示全部楼层
其实不是MFC的问题,而是CAD非要来个版本检查.
这个版本检查,目前要采用汇编的方法来研究,CAD是如果查出这个版本不一样的.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-9 19:20:38 | 显示全部楼层
不明白什么来的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-9 19:53:25 | 显示全部楼层
思路不错,可同一个函数,需通过不同的链接库才能适应AutoCAD的不同版本!
你可以做到一套代码来编译不同版本,但是一个ARX实现不同的版本好像不太可能!
楼主所写的方法也许能实现驱动,即加载,但仅限于R2000-R2006,无法兼容R14和R2007及以后版本,但无法运行也是没有意义的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-18 10:40:16 | 显示全部楼层
最好不要那样做,即使成功了,软件设计时要大量的考虑潜在的不兼容性,稍有不慎就会导致CAD完蛋。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-11-18 17:39:48 | 显示全部楼层
楼主的想法是好的,但是autodesk升级那么快,不太可能实现啊!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-5-31 17:49:56 | 显示全部楼层
我个人认为,你的思路是错误的。
建议不要这么做,版本和版本之间内部差异很大的。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2007-6-1 23:25:33 | 显示全部楼层
Autodesk就是靠这个赚钱,你这么干Autodesk就没生意了
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-9-19 22:23:37 | 显示全部楼层
想法好 可行性差
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-10-12 10:51:01 | 显示全部楼层
谁说不可以啊,只有想不到,没有作不到,支持楼主的想法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2008-10-16 10:29:38 | 显示全部楼层
攒爱心币过程中!!^_^
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-9-24 08:23 , Processed in 0.489286 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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