QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3504|回复: 1
收起左侧

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

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

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

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

x
在网上看到的4 u7 s3 p9 s; c( y, h3 }: O
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
5 H0 h! T* e$ f6 z对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
3 ]; k. w3 w9 @; n% O, {! g
" g/ ]* C9 J8 @, @% v但是目前还是碰到一些问题,就是这个函数:$ T, b. |5 h9 ^  G6 W: D; M& @6 _
acrxGetApiVersion,无法获取其代码.
4 d6 u' v. {* v7 G因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.& d; C  N7 k1 B
4 D: _1 ]0 k5 F6 [+ X1 g3 u
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???/ _. Z! ~" g; J4 v* K

! `9 |8 N- K8 t6 {+ \+ W! q我试过了以下几个办法来获取这个函数的办法:
5 D9 @/ H% v  E5 C4 C1.
5 \' m1 x7 |8 _6 y( O8 m# QQuote7 ]' F; W5 X/ Y; `* _1 j# [0 e
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.5 F) I0 c3 f+ V& v9 e
void* acrxGetApiVersion()
: v% J' ?0 H( n{1 P$ K1 J7 ]+ e# i
     char szHello[] = "Hello, world!"; ; m2 G* ~9 I+ J- A( ?
' [" v7 t. e6 F+ C  n# ?8 R
   __asm
! y- ^; Z& T; u; N  }   { 4 _! {( y7 S( Z' t
     PUSH 01 ]/ g6 V- `; U# F& @& Y2 X
       PUSH OFFSET szAppName // 全局变量用OFFSET
% f- M- }3 ?2 }. U7 h//       LEA EAX, szHello // 局部变量用LEA
: R( Z# r' X, _! E6 w  |/ g//       PUSH EAX1 U$ v2 o: M4 a% q" |0 ~' z+ T, F
       LEA EAX, szHello
+ V. Q$ X! p7 a       PUSH EAX + Y% Z$ Y3 |0 \' }* k  c
       PUSH 0
& }! U( p' v2 y1 ?5 E       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
3 f3 c- E% T6 l   }
" Y# s" @0 I  j: E9 @! {. G& d! Z   // MessageBox(0,"asm","asm end",0);
( x$ e" W9 n' {7 V3 Q: T
  P5 Q+ L) J! I8 v; U   FILE* fp; /*定义一个文件指针*/
3 c, ]  q  N  f" g9 @& U   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
! e8 V) q% y' ]MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   , \3 r; u+ |3 w  d
   fprintf(fp, "%d\n", 12345678);
, g. N+ u  x) h0 e. Y0 RMessageBox(0,"fprintf","fprintf end",0); 1 s/ N* |0 M4 T/ r( U
   fclose(fp); /*关闭打开的文件*/1 ?6 x' j& D9 f) J7 A* o  Y- }, x" V* P

. k3 P6 D8 v% O6 P2 i// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   o! e. S2 Q* u% x2 L, a
return acrxGetApiVersion_Mid();
$ }4 V& W+ |% a9 _   }
! ]3 }! ?- V- e2 u% E
' N( R* R6 W" e2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. 8 t+ O7 ?" V$ m2 G: q2 B( K7 p% Y
Quote! d, y9 z# u; k! H# L
//   6.acrxGetApiVersion) ~9 S8 W7 X4 I: L9 U
   typedef void* ( WINAPI *PacrxGetApiVersion )();, b0 ~9 w$ g2 x( I1 X+ d
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )4 D% E/ b% _1 H6 Q
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
9 S; d' e) v9 a' a9 f"acrxGetApiVersion" );& V* u8 s; F, _- e+ W

9 U$ z7 k1 K5 o8 z3.从lib文件中获取,只有这个是可行的.
0 P) F7 |5 L1 n' W3 z+ z3 B: R/ R#pragma comment( lib, "rxapi.lib" ) , e7 s# z: E) F" O

& T7 w+ y$ s& p; V; O, y定义这样一个头文件 ; j  x4 v& f& z) q+ `- G0 k
Quote
1 C( V. p" _* {- H$ a' j/*自定义CAD函数*/
; M* U( s5 X4 qstruct AcRx {
* s/ v. y0 ~* V) d7 ^
' O4 _% m! b$ h1 ztypedef void (*FcnPtr) ();
% S/ K3 z8 n9 x2 ^9 }( u' d4 u. J" A. S0 Y& _0 B0 J) {
enum   DictIterType { kDictSorted = 0,5 J' v" a* X9 E& x) i2 h, @
   kDictCollated = 1 };' q5 u* l# e* U* _" y# o

3 T4 s  l9 r# p: O  `) |- J, Kenum   Ordering { kLessThan = -1,
0 I( e; A; d' y         kEqual   = 0,
- c9 T1 v0 p0 H/ M2 q# l         kGreaterThan = 1,
9 {3 G) J& T% }1 k+ @         kNotOrderable = 2 };
" i4 A; o+ x8 i! D( r. |0 b1 l# @$ M' c0 S7 C" b( r
enum   AppMsgCode { kNullMsg   = 0,
; P) w7 @& I) `7 k" h         kInitAppMsg   = 1,4 f: l: L+ P, p4 v' ?: f
         kUnloadAppMsg   = 2,0 F  u+ u; \8 V. N+ d1 }7 v
         kLoadDwgMsg   = 3,
! `& P+ c* z5 k4 h2 n         kUnloadDwgMsg   = 4,
8 x7 m  J5 V% K1 fkInvkSubrMsg = 5,- V5 J# H* C7 g  ~$ B$ _
kCfgMsg = 6,
3 |. F5 b* e  R  \! I3 WkEndMsg = 7,
5 n: @% ^5 S4 Y6 Q8 G- T) s+ @kQuitMsg = 8,
2 @# |6 q9 W. L: JkSaveMsg = 9,
& ~0 Z" [/ x. E2 \+ }* S* c- vkDependencyMsg = 10,
, q, @% K+ s' L% s* ?% z% z: jkNoDependencyMsg = 11,/ o0 }. Q" |9 S( B
kOleUnloadAppMsg = 12,6 A9 o2 h4 p* ?* K0 f8 Z  e6 N
kPreQuitMsg = 13,
: G2 x5 s8 T, P  jkInitDialogMsg = 14,3 D' w/ V; j5 k3 E' x; B3 i9 ]6 z
kEndDialogMsg = 15 }; ! ^5 \6 S5 z" L8 B; w" L& X
+ i1 H" m& ~, \0 [1 B1 m
2 [5 n; N3 J/ o
enum   AppRetCode { kRetOK = 0,$ w& t9 Z/ q" _% Z0 Z
         kRetError   = 3 };
% _! ^% P/ W5 K- U};
, c, d7 c' X$ [" ^7 d$ @) b* g) `; p) y" Q$ s% x6 m
#define RTERROR (-5001) // Some other error  `# j' @& }7 a5 j
#define RTNORM 5100 /* Request succeeded */1 U* q# O# L0 t) q) Z
9 V4 d% r) y$ o9 G: i( C
//1.$ i7 d$ |7 z7 u6 j3 |9 Q. B4 w' ?
HMODULE hDll = ::LoadLibrary( "acad.exe" );4 m6 F7 C! V+ u4 |& m5 q  s
DWORD err = GetLastError();/ v* o- T9 o! m+ t2 Y1 k! `
//2.int acedPrompt (const char *str);& Y: `9 ~- a  h! S( p
typedef int ( WINAPI *PacedPrompt )(const char *str);6 k! G8 y, F' n) [& M6 N. v5 a% ?9 O
PacedPrompt acedPrompt = ( PacedPrompt ), \' h; N+ Y2 c
::GetProcAddress( hDll,( [1 x8 n% o+ r. K% U+ y  X. D
"acedPrompt" );
5 V, y5 u, Y8 B. \3 ~3 h// err = GetLastError();7 K. L. l' K( b: y& E9 h
//3.HWND adsw_acadMainWnd();
, t- O9 j$ c9 z) S; Xtypedef HWND ( WINAPI *Padsw_acadMainWnd )();1 P/ y$ q8 P3 c. r& {: n/ ~
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )% u0 q  {# x( _9 T+ ?4 O
::GetProcAddress( hDll,4 ?  V, P, x6 q" _3 F5 a8 `5 X
"adsw_acadMainWnd" );% U. b) \) S' ~5 L9 F
//4.int acedDefun (const char *sname, short funcno);
  o& y  ?2 B5 V% N/ J: Ktypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);9 K# T# H+ ]) ?! m
PacedDefun acedDefun = ( PacedDefun )7 h0 P2 \2 V) T* \5 e/ t' I
::GetProcAddress( hDll,
/ H) v1 _2 d6 O& e1 {  S9 n"acedDefun" );7 r1 W( [0 l4 X! w/ ]* x( ^
//5.int acedUndef (const char *sname, short funcno);4 I% M6 Q: ^. y9 e5 I
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);6 \% ^* c: S1 x8 D
PacedUndef acedUndef = ( PacedUndef )
0 I& w7 \  `! h; J! g::GetProcAddress( hDll," N5 p2 ]( F8 r  k& g$ Z
"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 )

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