QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的4 J- j5 n9 Q- g8 _
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
# M5 P3 @: Y; r* {/ }对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
4 N' n% j9 y1 P9 v; l+ N1 ^
/ z+ k1 U- ]6 w+ P1 X, m+ u但是目前还是碰到一些问题,就是这个函数:% g2 ]! Z8 s. h: _: [7 x/ j( S
acrxGetApiVersion,无法获取其代码.
" N  A/ r$ ?4 L  s& a8 t5 f% d; e因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
2 z& A' l0 `) m. J- d1 L# R/ ]! @( N1 n8 n
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???2 D' k5 \6 ~7 V* k& i1 U/ |( Q
+ Y+ ]7 y! U3 A2 Q2 p
我试过了以下几个办法来获取这个函数的办法:" N1 B8 `" h6 [3 R+ k
1. + ?% s+ D9 S! a0 L; v+ h
Quote0 }6 E6 W: ?( c' @7 `  @
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.+ |) @0 X- p2 W1 s5 n0 C3 b! z# G
void* acrxGetApiVersion()& F8 d! |  J7 l2 r0 W
{1 R' d1 @  Z$ p8 V) h
     char szHello[] = "Hello, world!"; / \& U! `+ s# O! C3 O9 e. d

- u2 A# \( X6 @" u0 S! D! |   __asm + R* q2 o  M) m/ O& u
   {
+ v9 p& W; k5 O7 F* D, z     PUSH 0
/ f8 ?/ ^5 }# c       PUSH OFFSET szAppName // 全局变量用OFFSET$ p& p% g; V/ g0 v. I& }5 G. f
//       LEA EAX, szHello // 局部变量用LEA
  D' g: H+ k/ [' L0 r! `4 l3 T- r, v//       PUSH EAX
7 f- A. t% H$ C! B" v* ]' T. a       LEA EAX, szHello- z# [" [8 g3 ?4 K9 [  }
       PUSH EAX
& r' \8 f; u  R' w       PUSH 0
2 l& {! [& R8 [1 [% B: Y& t       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
/ b% [" J, Z8 y7 [   }
4 ]9 a+ J7 y. Y8 f) i! j0 Z: a   // MessageBox(0,"asm","asm end",0); + e. i5 M" ~( t2 ~  i
8 b* Z# l6 ^* ^4 Z. y
   FILE* fp; /*定义一个文件指针*/0 ^' Q7 G# ~5 ?% N
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/) Q: w% a8 a$ U2 A
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   3 n, {. x$ Q7 c9 J
   fprintf(fp, "%d\n", 12345678);
: b9 C5 ?$ m* G/ r! KMessageBox(0,"fprintf","fprintf end",0); 2 \+ s9 l( I+ [7 j8 R" Q
   fclose(fp); /*关闭打开的文件*/3 t; v$ }. d# j+ C8 O

0 V6 C0 B6 W& M4 L5 w// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
7 f+ T1 n) l6 F" |& breturn acrxGetApiVersion_Mid();, V* }5 t# {1 e" ^% @' i' T, _& B
   }
) k" Y1 S, j, |# |5 H) Z& M! t1 P; H% ^2 d1 K4 G) _3 M# M
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
$ r. l7 M; g$ }  zQuote
# D2 O5 B  M' ?, u6 `5 F- o//   6.acrxGetApiVersion
( E% f9 H) O4 N4 O  B$ S* \8 }1 X& b   typedef void* ( WINAPI *PacrxGetApiVersion )();$ q5 i& C& r. p
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
' _) f: d& {+ J) x  H% ]4 x1 X::GetProcAddress( :oadLibrary( "AcArray.arx" ),
2 G0 D1 q! T7 m* T- V"acrxGetApiVersion" );
, k6 ~! z: z8 O
+ S: n, A# q" p' J3.从lib文件中获取,只有这个是可行的.
) @& S2 C, D. ?6 ^$ W#pragma comment( lib, "rxapi.lib" )
& F- E! w; P: A2 r( Z/ x) Z* u1 |4 h4 e7 C+ s. o
定义这样一个头文件 3 W6 m& ]  O! L; q
Quote
' D+ y9 \1 z7 [- q& _2 _/*自定义CAD函数*/) A2 P/ \$ W  \# E3 ?3 M  X5 d
struct AcRx {
+ N( o+ Y2 w$ t8 e0 u' }8 Y! W2 x+ w
' t1 x1 i# y4 [9 L! w& C) g6 z1 Mtypedef void (*FcnPtr) ();" q2 G) q2 P. @) Z+ k
& V& U0 i: |% r
enum   DictIterType { kDictSorted = 0,
2 L  v: y, L0 M2 s9 r4 E7 ?   kDictCollated = 1 };4 Q& n$ @( ]* ^( Z

$ {  h! h( h4 \! t* d2 Lenum   Ordering { kLessThan = -1,
4 o( l8 {1 h; A' o         kEqual   = 0,
7 u: y5 F8 `: }$ q1 h8 p; ^         kGreaterThan = 1,
1 a8 x* \5 u$ R# K         kNotOrderable = 2 };
4 Q$ T( d+ z0 w: D, t# T% q/ |' h
enum   AppMsgCode { kNullMsg   = 0,$ S" n" m( O! e/ N
         kInitAppMsg   = 1,1 i: A) p. Y+ V6 d. F' J' g' X& ^
         kUnloadAppMsg   = 2,
& \; \( v4 H5 m         kLoadDwgMsg   = 3,) D- r  r! `* E* K2 p
         kUnloadDwgMsg   = 4,
/ K" B* \( j$ Q( _" C: ZkInvkSubrMsg = 5,! o/ d/ ]; [, h" o/ [& t- m
kCfgMsg = 6,, J- s0 F% @% I/ X# U( ~% ~
kEndMsg = 7,
( @+ W. v' O0 c' ]! Y  M4 }8 e: k+ nkQuitMsg = 8,
- _+ B( J) p' \0 |kSaveMsg = 9,1 c6 I2 @" h% P: o
kDependencyMsg = 10,% z5 ?* s  C3 R% O; m- q  B
kNoDependencyMsg = 11,
8 E$ c8 Q. L' p0 p! ~kOleUnloadAppMsg = 12,! F; G- d2 a( g' u& j$ ]! C6 A
kPreQuitMsg = 13,) W7 y) S/ v5 o9 C! Z; H% P
kInitDialogMsg = 14,, L9 a2 Z3 c7 t0 F* O& w% _
kEndDialogMsg = 15 };
. t  |% U! @5 e) H9 j! B
2 P  N% |9 l- S# Y" I
. s& W' U( M! J9 }. l& u4 uenum   AppRetCode { kRetOK = 0,
: h" Q+ {  m" t8 G         kRetError   = 3 };
: R4 y$ H8 h' o% `1 A! W8 n5 W  K9 x};
  V/ V$ `! w6 e+ v* v. j0 E2 i: i  @" v" J0 n
#define RTERROR (-5001) // Some other error5 u2 v# f- d. @$ O6 W' c% ]1 W& Z
#define RTNORM 5100 /* Request succeeded */, R0 @7 p5 o- }+ {' Y- N
- ^5 U, z& N- i0 l. _
//1.
/ s2 L. h; m, `HMODULE hDll = ::LoadLibrary( "acad.exe" );/ d7 a* X2 j. l" B  U2 k
DWORD err = GetLastError();+ a& G6 K5 g" T5 G+ G+ f
//2.int acedPrompt (const char *str);
' i3 D# [, y5 _1 b1 rtypedef int ( WINAPI *PacedPrompt )(const char *str);
7 m$ U) s/ ~7 {/ U  }PacedPrompt acedPrompt = ( PacedPrompt )
2 B1 f3 |: o- t' V( d::GetProcAddress( hDll,
. [0 y* W. E" @  w1 n( G"acedPrompt" );
5 [. n* N) L; ~1 y* E( e) v// err = GetLastError();6 T1 K: l$ X( `* C, ~
//3.HWND adsw_acadMainWnd();
# ]7 l& L9 P+ P2 Xtypedef HWND ( WINAPI *Padsw_acadMainWnd )();" L* W) k# i4 w' z: y" T$ S6 w
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )0 A. k& h$ n1 }6 }; q, w  o
::GetProcAddress( hDll,$ b) Z; S7 E; v2 E
"adsw_acadMainWnd" );
; m8 o1 K" [+ n; U0 B//4.int acedDefun (const char *sname, short funcno);* J, h; q) A9 a" g
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);) C) B) C4 O( G) M! |& H: _" O, L. J$ d
PacedDefun acedDefun = ( PacedDefun )
( u9 ?" k9 J' U2 s4 n$ G::GetProcAddress( hDll,  I2 R& ]1 w* F% @
"acedDefun" );3 S% [- _5 o; s5 C9 u' f6 k  j
//5.int acedUndef (const char *sname, short funcno);; T4 Y# h& Q/ ~" D- d4 l9 l2 e
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);( i1 `& I. T$ f1 E+ J% z$ X
PacedUndef acedUndef = ( PacedUndef )' ?7 x" u; H: u1 {
::GetProcAddress( hDll,
: ]0 P4 E2 [8 s0 `  I, T! f/ D"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 )

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