QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
6天前
查看: 3501|回复: 1
收起左侧

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

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

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

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

x
在网上看到的
/ r% A' D& d" n  i. k! ?5 l通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,- G& H, t0 V/ a' R" M5 M* L, t
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
" C" r: B% d' C' G- j
8 Z( ~9 U+ N4 q8 Z6 p, j# y" H5 P但是目前还是碰到一些问题,就是这个函数:1 x2 F5 O: k( `1 H) M8 E
acrxGetApiVersion,无法获取其代码.) i' H6 O/ r( t2 Q8 d, C
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
  b1 p0 A. a# R8 A' V1 n. F- ~; i( `6 s
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???: }- _* a2 D! A: v6 _6 U' l7 G5 I

: ~  r9 B! c4 L- c7 t" `3 ]我试过了以下几个办法来获取这个函数的办法:$ S& G4 P+ B! [; [$ F" _+ H
1.
3 [# @9 m6 @$ {! P1 \* u, kQuote6 c- F/ A0 D( w9 P% O
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
) A$ |7 R4 e3 L- o% s6 yvoid* acrxGetApiVersion()/ z6 \# B8 ~$ ~1 ?5 |; h: h8 _( z
{
& h$ n" e" G  D8 s3 c1 P8 `+ R     char szHello[] = "Hello, world!";
, q* w0 _7 M: @# S
1 b* S; G" {: J: k+ ^% c- o   __asm
/ W# R9 m0 e* B. y' K! n0 P- g1 W6 B# ^   {
, h" J5 y6 s  B- c) t     PUSH 0
3 }* Z1 r* a% f  A" R       PUSH OFFSET szAppName // 全局变量用OFFSET5 n6 U- @0 k) Q1 J6 h5 H
//       LEA EAX, szHello // 局部变量用LEA2 H: t% f1 i! @+ @% \# q5 d
//       PUSH EAX: U5 ~5 F& b: v' s* w4 J! ~
       LEA EAX, szHello
5 m9 d  u, X( W* i" q  b1 P       PUSH EAX ) @5 O1 e: k/ Y
       PUSH 0 4 ]: q+ @# v  D2 `: K" H
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
* Z4 }$ e/ C% @; W3 @$ R   }
" h, e& c4 y8 {% s/ ~9 Z% a" _   // MessageBox(0,"asm","asm end",0);
0 G% u) f' w% T- U. g( A" |
9 ~; y0 y5 E+ r5 K9 o5 y" m   FILE* fp; /*定义一个文件指针*/( M% ^- o# J+ X. S/ v
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/" }- z* h+ U+ M/ L7 p- f
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   * G  ]8 R" m& X. j( y6 z( c
   fprintf(fp, "%d\n", 12345678);
& e1 W5 N* I0 A& T& v+ d8 JMessageBox(0,"fprintf","fprintf end",0);
6 o- O( B& c0 }8 N( m0 L   fclose(fp); /*关闭打开的文件*/! s9 K+ k% k  c* z. Z8 H- z

- f6 ~; K0 I' ?3 h5 g9 Z/ ?// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 6 `! G8 k+ \) l$ w/ f" ~
return acrxGetApiVersion_Mid();
/ H* j' k* o8 {   }
% }% ^; V% u# N) s+ X) Q/ ^
' p! U6 R4 w* F6 u0 W  |2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
  d# a9 [1 X8 j2 ]2 `Quote: Y( `3 m( F% j- D$ u
//   6.acrxGetApiVersion) K$ O0 S7 Q7 z; o; a
   typedef void* ( WINAPI *PacrxGetApiVersion )();( L& }. H# F: D' E: a
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )- p# h( @, |1 N" y
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
+ [! f; {2 v* r" Y+ }4 ~"acrxGetApiVersion" );: k3 r) H) J, K4 v  H
9 G8 Q2 r$ f7 P* m# X
3.从lib文件中获取,只有这个是可行的.
9 f8 A; b, d8 c+ v3 w6 X4 B. |/ ~( L#pragma comment( lib, "rxapi.lib" ) 4 ?( b7 u  ~/ h$ a5 h4 N$ {
( }5 i' q3 @4 j
定义这样一个头文件 ! P- Q3 D. T- V' V3 }
Quote
; H. @! I/ y3 b; j/*自定义CAD函数*/
( L. N! S7 s. {struct AcRx {
* y  h4 k! I8 V4 S* {+ A1 Y4 ~* U* J" t0 v0 D& y
typedef void (*FcnPtr) ();
3 B7 K* n. x, @+ i, T, w; i
+ l; {: {, S" {0 e' l! r$ Wenum   DictIterType { kDictSorted = 0,7 c4 J7 Z2 l9 ^3 s4 w) z
   kDictCollated = 1 };
2 f) [; k* x* n% F3 {' \
0 _* t$ S1 j( W& M6 y* \+ j/ p0 zenum   Ordering { kLessThan = -1,$ g' @  A5 B. ^8 A" O
         kEqual   = 0,
& Z" F. a5 K+ q; [/ B         kGreaterThan = 1,6 Q% v/ I; ?, Z: k9 s7 y
         kNotOrderable = 2 };2 j9 A5 `. |$ v2 B$ w2 F) o* P

7 e  F0 i) B4 n  j" q" G; C  benum   AppMsgCode { kNullMsg   = 0,+ ~! K5 t1 e$ ]
         kInitAppMsg   = 1,
7 G' [; ?/ n0 g0 I! `5 W, k* B         kUnloadAppMsg   = 2,
* }. @  p9 M. Z' P         kLoadDwgMsg   = 3,
3 X7 _9 e! S( J2 O9 B) ~         kUnloadDwgMsg   = 4,5 I/ Z8 d/ {7 K# ?6 h
kInvkSubrMsg = 5,  r" |5 C! H$ o7 d! Q& E. N
kCfgMsg = 6,
" H* a2 X' P' B0 bkEndMsg = 7,
. w* H* ~3 f( z  ?; wkQuitMsg = 8,
$ Z1 T& j: W& I" I$ fkSaveMsg = 9,8 E; H. z6 S3 w% b% L4 i
kDependencyMsg = 10,# Q1 I8 Q5 b5 ^5 }( L' w
kNoDependencyMsg = 11,3 f. H. l- ?& S4 Q1 Y
kOleUnloadAppMsg = 12,
* e% F) E7 P. j) Q! OkPreQuitMsg = 13,
' t: C- p2 t* x7 e+ A# X: QkInitDialogMsg = 14,! O( f0 i3 j, @/ \
kEndDialogMsg = 15 };
% U: [3 P$ M) ?# K5 ~4 K$ j2 G7 Z$ I; I  T: q3 }( Q

4 v+ a, x8 A7 A2 p7 ^3 Genum   AppRetCode { kRetOK = 0,9 I5 a) u1 N' c  [  V# G
         kRetError   = 3 };9 n+ o' C$ z2 B4 ]
};
7 U; j6 y/ g6 @& J( T$ u. z# Y. k0 {) J% m- f+ t1 B
#define RTERROR (-5001) // Some other error, H  D; e9 J4 r+ j7 `$ j
#define RTNORM 5100 /* Request succeeded */
5 L$ R  p) ^) y+ r. ]6 f1 Q
: Q; Z. V) P0 V* u6 p//1.
  \: J0 h7 c3 F3 ]3 kHMODULE hDll = ::LoadLibrary( "acad.exe" );
1 V3 G( k/ a; ~3 `( }DWORD err = GetLastError();5 z/ t# T3 J9 I# ^$ _
//2.int acedPrompt (const char *str);( l- g$ v. L- n% _
typedef int ( WINAPI *PacedPrompt )(const char *str);5 c" }0 r3 w7 P0 S
PacedPrompt acedPrompt = ( PacedPrompt )
! Z5 o$ h; ]# m$ u::GetProcAddress( hDll,: r' T; E1 Z& M4 N
"acedPrompt" );1 o+ P* ]$ N; x; @- A
// err = GetLastError();
. A' c$ @/ B4 n# }4 r: t! X/ b- h) Z//3.HWND adsw_acadMainWnd();. c5 y! m/ y  \/ s: Q
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
/ V3 N/ U4 f' d# W# m* \Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
/ [, c+ ~4 A7 y# m::GetProcAddress( hDll,8 r# m  _) z  T3 e
"adsw_acadMainWnd" );
8 G/ U( F9 w, Z* [//4.int acedDefun (const char *sname, short funcno);5 q8 ~9 H- z0 J5 m
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);. ^6 P) A0 [1 U. x% \- _9 r
PacedDefun acedDefun = ( PacedDefun ): I/ B* D8 \3 b
::GetProcAddress( hDll,  D/ L* |8 r" d' s0 c( e
"acedDefun" );
5 J; T: U* X" Q//5.int acedUndef (const char *sname, short funcno);
* I3 W6 d: a, [5 ]+ Ttypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);! a( e( n" ]+ T& n
PacedUndef acedUndef = ( PacedUndef )
9 j# C- w. n, u::GetProcAddress( hDll,
/ Q5 J3 S! u4 `. s5 f"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 )

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