QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的
4 N. [# b  g5 ~! o: T. |通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
  C! R! Y) \' p) }6 E. W对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了., g, u/ ]; E% L9 i2 H2 v; Y/ O0 z
- r* W, s  P6 S( w$ D, i
但是目前还是碰到一些问题,就是这个函数:0 y# u& \3 t2 i& Z# H. V
acrxGetApiVersion,无法获取其代码.
0 @" Z3 N8 m# `  X  L5 l因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
3 q% D% P+ ?  A5 H) ~. I; R/ k) m) v, F* ]
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
( t$ Y% B6 o; r0 O6 ]6 ]# R/ b( o* K+ f$ w6 c
我试过了以下几个办法来获取这个函数的办法:' [) c2 m$ X- r1 C" e  A) n# d+ ?
1. " [1 g  U# ^! E! ]  I+ ?& \; g2 ]
Quote; q, Z4 p5 [* W; {! m9 M" O
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
- j- J. I1 i  }% D4 C' Fvoid* acrxGetApiVersion()$ _5 ^1 F- u8 z6 e( ]8 T# d+ c
{8 A. D& o) ?- _& f. v
     char szHello[] = "Hello, world!";
* b: W; d! ~3 ?% b8 @" z4 p7 b% R
   __asm " Y0 ?/ ^" H$ M
   {
  D" z. i) C$ s( `* ^$ q, K     PUSH 0
# \1 \5 g" s/ c       PUSH OFFSET szAppName // 全局变量用OFFSET* F0 S6 r* J2 @5 \
//       LEA EAX, szHello // 局部变量用LEA
1 M7 k% R3 N, q, @8 V/ H) j//       PUSH EAX
5 c- f. T7 @1 Y/ J& ]       LEA EAX, szHello5 ?" N8 w" U, |/ z8 V0 j& ]
       PUSH EAX # {) l, M7 n, ?. G- `8 X( j8 F
       PUSH 0 4 n& _0 y: S* l- |
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
* H+ O! B* S2 w6 T$ N# @: j: P   } * ]/ W. U* ]; E- s  ]% Y
   // MessageBox(0,"asm","asm end",0); 4 \; P& f" ^5 f; w6 g! I

8 N0 j! K9 j+ e" ?3 x) B   FILE* fp; /*定义一个文件指针*/5 ^1 I* ^: s; W- ~: f2 v
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
# c& o' ^, n7 B7 T2 T. B! d* SMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   * U- R* t" T; h
   fprintf(fp, "%d\n", 12345678);# Z6 R" y- Y! q2 V2 A8 J7 w
MessageBox(0,"fprintf","fprintf end",0); & t' A. ~6 x4 u5 @+ A
   fclose(fp); /*关闭打开的文件*/
" d# u) Q7 j: v* @# Y/ `% _& A# B( r* _2 T6 U) |6 E+ x# u
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); $ Q2 s9 u$ G$ _7 L9 R* m
return acrxGetApiVersion_Mid();6 @% R( x9 z/ g. e( A1 E
   }. s0 [+ {6 G0 A3 y, ^( I5 S1 @5 }
7 G6 y+ R/ m0 Y! M' A
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. 8 t8 T: C5 z  C% y: b
Quote) m$ {6 z& b. Y  D# x: x
//   6.acrxGetApiVersion6 u# k7 [1 L3 z% {# d
   typedef void* ( WINAPI *PacrxGetApiVersion )();
  ~; w' y4 a7 p. H: i& hPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
+ _  c) V% B  I, n( M::GetProcAddress( :oadLibrary( "AcArray.arx" ),
/ P; f% y% u( }5 x: l/ w"acrxGetApiVersion" );  y2 N" u3 q5 K% O. q* @

" y0 t0 T, g' _0 u! \3.从lib文件中获取,只有这个是可行的.
9 A8 S/ n5 g. X( r- R( l( ^: S#pragma comment( lib, "rxapi.lib" )
& g& P/ }1 M# E& q; ]2 N# D8 Y" a" l3 G4 n) `2 e3 F
定义这样一个头文件
) z' e- m$ f" R, O6 b) bQuote' i8 U) y( ?- x" c5 f
/*自定义CAD函数*/
7 L% t( B! F/ n/ R9 Istruct AcRx {8 \2 W: h* c% |5 l1 l0 n

) k( L  b/ \1 T" f  p: H# {typedef void (*FcnPtr) ();. }' K  @! D4 C& z

2 M! m& y3 d! G3 E9 y/ Zenum   DictIterType { kDictSorted = 0,
! z" U8 J8 A/ E) I+ ~5 t1 e: `   kDictCollated = 1 };0 W* R8 P3 x$ O3 T1 `3 j
" g8 e+ n4 x' \0 M3 O9 P: C& W+ k0 d
enum   Ordering { kLessThan = -1,' V" o# p; H2 V: s6 N* K! i
         kEqual   = 0,
3 D+ I' s( d4 K         kGreaterThan = 1,# b: n& q  Q+ c0 R5 J
         kNotOrderable = 2 };, l4 L! f; Y3 W9 U* U

+ V+ a0 {& i! ?, F3 x) nenum   AppMsgCode { kNullMsg   = 0,
6 {' ~8 S6 r& S% E) e; h4 \) y         kInitAppMsg   = 1,* ~. }# F  x, G& z* p
         kUnloadAppMsg   = 2,, r5 D) C& I/ `  U
         kLoadDwgMsg   = 3,
6 Z  P9 H' K! e; o0 f9 I         kUnloadDwgMsg   = 4,
$ z3 d  j1 F9 `5 d- C3 K; FkInvkSubrMsg = 5,
, ]" [6 ^$ ~4 h1 p! d- qkCfgMsg = 6,
0 `" T% E8 Q) O6 y. \3 FkEndMsg = 7,
* l! R+ h' }$ E% x7 gkQuitMsg = 8,1 a! ~' Z, b9 c$ Z! e0 {
kSaveMsg = 9,9 L- Q# X- Z5 [' k6 l: F( j: T
kDependencyMsg = 10,
! [% M) `( F) s" }kNoDependencyMsg = 11,, r* }3 [" g. `: F; k$ ~
kOleUnloadAppMsg = 12,
% L. j7 ~1 Y* ]6 X0 L4 J  o' I! hkPreQuitMsg = 13,( A/ R; C9 F6 j. `5 r
kInitDialogMsg = 14,2 c: D9 g" ?0 p7 S# o" a
kEndDialogMsg = 15 };
, N7 Q" X8 H4 K" \0 S
" p4 D0 I. ^" R1 a7 c, h5 V, ~/ B3 x5 d! i, z" ~$ w
enum   AppRetCode { kRetOK = 0,
& \0 k" T% L: H$ y- q: P         kRetError   = 3 };
7 T5 H- H( ]" H+ x& g};
. ?7 o2 [, ^8 X1 q" D5 F, s# l( z" ]' b7 g- [+ E
#define RTERROR (-5001) // Some other error
. a+ K  t( {+ K- V0 U: y+ d#define RTNORM 5100 /* Request succeeded */! p% }% b, @7 |9 O4 _; `/ k* S
" D% h+ z8 u, i
//1.5 {4 O* Z5 K, U
HMODULE hDll = ::LoadLibrary( "acad.exe" );
# Y1 V, L9 Y( s$ P& d- wDWORD err = GetLastError();
; ?! J9 e0 r9 Z- D  c6 D//2.int acedPrompt (const char *str);9 C1 D0 H1 s! X' ^% [1 N
typedef int ( WINAPI *PacedPrompt )(const char *str);: O5 M5 M/ l2 J2 G: ^2 a3 [9 N
PacedPrompt acedPrompt = ( PacedPrompt )
' A; W$ L4 m( x5 ?::GetProcAddress( hDll,
$ Q: P5 V8 ~4 @* C* @"acedPrompt" );
. Z& z# h, K, M/ R// err = GetLastError();
1 J9 o: [6 ?5 v% a2 L% c1 B1 O3 Y//3.HWND adsw_acadMainWnd();- p- j; S  i1 o, s5 j7 r9 W
typedef HWND ( WINAPI *Padsw_acadMainWnd )();( c% @' x. T% r, e( T8 \
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
3 R  ^6 i: v& ?+ A) q/ B, N4 C::GetProcAddress( hDll,0 Q9 @$ Q/ j3 \5 o4 x0 `; B
"adsw_acadMainWnd" );
( k) H4 [- a, A/ J9 z//4.int acedDefun (const char *sname, short funcno);. O. v4 O7 o. o, G$ |
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);! S9 E* v5 j! ]
PacedDefun acedDefun = ( PacedDefun )
+ R! i3 y; }: l, ?$ b5 X  V::GetProcAddress( hDll,$ G$ G' e9 }4 j' K
"acedDefun" );4 O) y( G; f4 X6 [5 v" ^
//5.int acedUndef (const char *sname, short funcno);
1 [1 f* M" y( B- ttypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);% }( G* q1 d  P2 h& ~
PacedUndef acedUndef = ( PacedUndef )
) f! y+ x/ X0 v  Z& [::GetProcAddress( hDll,
% H0 {3 C4 S4 i% \3 }9 L$ ~" G"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 )

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