QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

查看: 3524|回复: 1
收起左侧

[分享] 任意版本CAD均可加载的arx文件的研究

[复制链接]
发表于 2010-10-1 16:31:38 | 显示全部楼层 |阅读模式 来自: 中国广东肇庆

马上注册,结识高手,享用更多资源,轻松玩转三维网社区。

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

x
在网上看到的
! m: V. V8 p) L0 R/ N通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,# r! U% l: v9 V/ X6 k! D
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.6 l( E- z, _6 v! o$ @
2 N9 Z0 F2 E/ K% e( u8 _
但是目前还是碰到一些问题,就是这个函数:
2 {' ~) n% @: u5 M: Z2 M; o3 MacrxGetApiVersion,无法获取其代码.; f6 d% O) d: Q+ f
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.3 o7 }5 L4 d: m% L" h3 c& y- \

- m6 w% d" I! [# h2 C4 T: I& q8 y而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
& [2 S7 W* |$ x  P8 W) B6 R5 @: ?4 e& {- a: c* o; L5 Y
我试过了以下几个办法来获取这个函数的办法:
% ^3 H# `) T6 d7 q7 V+ [1. ! A/ P% v1 ~$ [$ {, ?$ A5 A
Quote. I5 b" j+ Q2 `) ^$ j- q
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对., t! ^' B( B. o
void* acrxGetApiVersion()6 @/ y" E* l# t& F
{
+ `: T- |2 i0 Y" M5 w     char szHello[] = "Hello, world!";
  `! {6 k- a4 ]. l0 e9 ], O, \4 W$ P1 k% h5 r1 T
   __asm # |2 Y' J! [* g* ]' K# T  ~
   {
- }! ]( U/ W) F  ?. q     PUSH 0
: ~. z! \- V3 q9 b- v7 P       PUSH OFFSET szAppName // 全局变量用OFFSET3 C" G0 Z  m9 P4 n2 ~( a
//       LEA EAX, szHello // 局部变量用LEA, {% ^$ M& H% k! J5 G0 N/ q1 }
//       PUSH EAX
, _* q" F. X- W$ h! \       LEA EAX, szHello! I7 L) }+ D6 ]5 P3 }
       PUSH EAX 7 @1 ]/ ]0 `" O: g7 @2 ?& j
       PUSH 0 ; Y: f% f$ ~8 h% v& Y% v+ t0 O, [
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
% a& J) T  F9 s: J! l1 g3 Y% i5 E' A0 |   }
" c9 E2 S6 q: \* [4 F- j1 ~$ f8 J   // MessageBox(0,"asm","asm end",0);
2 J0 p8 i9 }+ v+ N- y) j' r( t& J* ]) {: z. {7 N1 b
   FILE* fp; /*定义一个文件指针*/5 N  H! ]( c2 `0 Z) K5 W- F
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/0 T6 u, @1 g: C8 l; f9 @
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   
/ `$ C/ Z6 C+ v) b5 z   fprintf(fp, "%d\n", 12345678);  D' g% a& L. l
MessageBox(0,"fprintf","fprintf end",0); 4 H  ~) @3 o4 f( J7 T! w: g! a
   fclose(fp); /*关闭打开的文件*/0 c( Z2 x) z. ]* W
0 N  v' V: e3 L' U
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); , {! u4 f- o( v7 ]2 T$ R% q% k
return acrxGetApiVersion_Mid();
8 @3 n- d8 X* T0 J4 m, [* {4 h' m   }/ E  C$ [* W0 G( @

; B" L. Q: T4 @) P% G' q4 ?$ n" x2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. : ~6 P  \+ _" e4 k. \! F; V' y- p
Quote1 E$ Q0 @# N2 }( W
//   6.acrxGetApiVersion
% q: r2 \, z  X4 r. A2 N/ w4 O6 L   typedef void* ( WINAPI *PacrxGetApiVersion )();
/ r2 N" [5 X6 D8 y4 PPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )* U2 e( N+ B# J4 F; b, W* M
::GetProcAddress( :oadLibrary( "AcArray.arx" ),, b8 M; x9 o9 a) \
"acrxGetApiVersion" );1 m* ^  u: z  y& V9 @/ [6 _

" S/ v8 J: w  u1 A% I5 j% ^3.从lib文件中获取,只有这个是可行的.
7 G9 u, j" D' h+ q) e1 }#pragma comment( lib, "rxapi.lib" ) 0 `/ d. B" b/ e' Y( [
( r: ~1 f( J% d$ x
定义这样一个头文件
9 j6 z' y8 a# H# n, H6 M6 ^Quote2 U5 l; r* A$ G: U
/*自定义CAD函数*/! C3 m9 {# z9 U. o! N
struct AcRx {. q' q* c. q2 @* v' g
1 q( U5 w& F! z0 C
typedef void (*FcnPtr) ();
2 m! z# U( R& P, r) C3 E2 }" t/ j2 m+ V& b4 E3 i% F+ u  f7 ~
enum   DictIterType { kDictSorted = 0,
$ ~5 e6 s# X/ d$ Y/ n   kDictCollated = 1 };
" Z) C3 Q8 i: \, h1 C0 i7 V. ]
+ m; T* q& d6 _# z  Q- l  qenum   Ordering { kLessThan = -1,
" W/ ^4 @8 S  Q% z         kEqual   = 0,6 A% G  k7 E# \" \9 Y( ]) g
         kGreaterThan = 1,7 P/ ~! k  j$ J) p
         kNotOrderable = 2 };
6 H" I( o% ]( B. [/ c8 }
6 Q0 [4 `  D* c5 f. ienum   AppMsgCode { kNullMsg   = 0,4 `9 [& j" U9 I
         kInitAppMsg   = 1,% o# Q/ E4 B" e' g3 j
         kUnloadAppMsg   = 2,/ ?* ^4 b  I+ b+ g; }% g$ x: Y6 Q1 n
         kLoadDwgMsg   = 3,; i3 \: {2 F9 s9 V% n, ~. ^
         kUnloadDwgMsg   = 4,/ b5 g7 x0 g% W3 ^  X9 g( a
kInvkSubrMsg = 5,4 l  `* s& `, B
kCfgMsg = 6,% F6 N% O% A7 L+ i! s1 E5 [
kEndMsg = 7,' {0 F, f# t: M7 T6 p& z% A
kQuitMsg = 8,
& r) K/ c5 m3 j, n$ F$ _+ {, R4 E1 ^kSaveMsg = 9,' ^  w8 j6 X9 L) g
kDependencyMsg = 10,' \4 `+ [( W+ |/ G
kNoDependencyMsg = 11,
" B: d+ ?* t: F4 G9 lkOleUnloadAppMsg = 12,
5 F: b; \9 Y  v: Z( u, e: wkPreQuitMsg = 13,
* E+ M& y6 _0 z& ?# P/ n( ?kInitDialogMsg = 14,
$ ]0 ]/ {7 ^2 O/ F, t* ~& |kEndDialogMsg = 15 };
  I' o5 v- p& t  l5 O* }' R' K/ i7 f1 D
0 h6 Y# Q! R1 {/ o7 ~6 G4 x8 S2 T
enum   AppRetCode { kRetOK = 0,
% l$ H+ I% W0 _' Q# |         kRetError   = 3 };( J' \* j2 ]) `/ G* m+ r$ z6 R
};
+ U. T2 U  P/ z$ N( k- W% ^  f' y4 P# ^( [9 }
#define RTERROR (-5001) // Some other error# `+ |9 S0 R% }; D
#define RTNORM 5100 /* Request succeeded */. w1 n% f1 t1 }9 q/ t
2 P( }% r3 g; D0 ?
//1.
- [2 ^- T  G0 ?7 ]5 JHMODULE hDll = ::LoadLibrary( "acad.exe" );
9 G2 P& z7 x0 {DWORD err = GetLastError();
3 I9 y0 I  h+ g1 c7 a& a0 m) E0 U; H//2.int acedPrompt (const char *str);
. A5 I& r6 G/ k+ ^+ [$ Vtypedef int ( WINAPI *PacedPrompt )(const char *str);! m' |' [( h  R* u
PacedPrompt acedPrompt = ( PacedPrompt )) C& {* Z  ^- V
::GetProcAddress( hDll,
1 v; J- U* R; e; o"acedPrompt" );
0 I+ g5 I3 e0 |! _; R// err = GetLastError();
5 ?* ]3 y, r1 D//3.HWND adsw_acadMainWnd();) N- a" f# R, A; L4 l; e
typedef HWND ( WINAPI *Padsw_acadMainWnd )();% O! `/ T3 L+ I% D  w
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
& n: i  N" J* c::GetProcAddress( hDll,
5 w( g9 X5 y3 h- }6 C) L! {$ Q"adsw_acadMainWnd" );/ n% b, j6 B& M  ^1 O8 O
//4.int acedDefun (const char *sname, short funcno);6 u$ P. Z+ t2 C* i* N
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
+ c/ v0 Z! g7 G6 PPacedDefun acedDefun = ( PacedDefun ): T& ]: R9 g1 U! x7 C
::GetProcAddress( hDll,
  ^' U/ D, U$ m- P8 M, }2 h"acedDefun" );
3 Z) f. G& `2 `//5.int acedUndef (const char *sname, short funcno);$ a* r. q9 X, d; B' B% i
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);8 x- Z- I0 H/ K
PacedUndef acedUndef = ( PacedUndef )
# W+ ]$ s6 `! L::GetProcAddress( hDll,
! ]2 @+ p; K( z) q"acedUndef" );
发表于 2010-10-4 14:27:08 | 显示全部楼层 来自: 中国辽宁鞍山
我说LZ 麻烦你发帖子的时候选择 禁用URL识别  DZ代码 还有图标 代码里面有图标 让我们没有办法看呀
发表回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则


Licensed Copyright © 2016-2020 http://www.3dportal.cn/ All Rights Reserved 京 ICP备13008828号

小黑屋|手机版|Archiver|三维网 ( 京ICP备2023026364号-1 )

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