QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的" C& ^; Y7 g8 \& }2 ?
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
9 d: h. R1 w4 U: H) I( U1 r2 t( ?对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
+ w2 J1 s3 q- W8 q
0 F- y' N2 T7 D4 g但是目前还是碰到一些问题,就是这个函数:
1 T0 s0 y5 e5 H" V( }! AacrxGetApiVersion,无法获取其代码.
* y) Z" D  k) L6 [, B  Z& ]因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.* s/ }6 W2 m! h1 ^% }' Q

, m$ `0 [, o8 Z4 i: i而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???6 O0 \, H6 F: ?% T" f4 b" g0 u; h2 }# r
4 D  D, `* t6 y/ B
我试过了以下几个办法来获取这个函数的办法:- s2 r8 W! N# g# ~
1.
; [0 m, {6 ]2 wQuote. t: [2 J# Z0 i9 s
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.' |* f- t3 }4 ~+ l- g
void* acrxGetApiVersion()
) v. n! @+ b' w; D; d{7 B$ V* G: F: z9 H9 G4 G
     char szHello[] = "Hello, world!";
4 w) L6 T: _( o; x5 H( p: n; t/ C
! A% }) k+ J5 O: B   __asm
- Q9 H7 E( _" ?9 v! Z+ f+ H5 p7 ?   { ) q  Y% D2 |% S- B/ f6 l
     PUSH 00 D( K3 `: V/ Y! H
       PUSH OFFSET szAppName // 全局变量用OFFSET! y" H2 v) y- s6 B- _
//       LEA EAX, szHello // 局部变量用LEA  f; D/ U; o1 N9 X4 V
//       PUSH EAX; r8 U; c+ k1 i1 v$ L+ l6 i
       LEA EAX, szHello
; R4 g5 v. C- [5 `       PUSH EAX / P* M) O/ n5 {; g5 k! d2 Z
       PUSH 0
8 l  w- x. }5 M- N/ g& I       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
4 g  `2 _. h. z- N* G1 Z   }
& H. Q2 r) u, X3 H   // MessageBox(0,"asm","asm end",0);
: O9 Q- N1 z5 F2 R! K3 ^. U- W
9 V2 _/ q2 t3 j: j; E" X   FILE* fp; /*定义一个文件指针*/8 G+ [  U. x9 P& }8 G. M
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
8 P. f  y' L) `1 ]# w8 \1 p) u$ y) PMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   
- M) R$ |- `! Q  G& f   fprintf(fp, "%d\n", 12345678);. O. h/ {( ~3 Z
MessageBox(0,"fprintf","fprintf end",0); : h  u- t7 m8 H. L) j( w
   fclose(fp); /*关闭打开的文件*/( F2 S- }7 w! I1 m3 ~

4 h, |; b) r$ [, \! K/ N- n& s// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); * d6 V) [6 |: a/ `
return acrxGetApiVersion_Mid();
7 `) r$ B. d# w3 ^- v# l9 N+ a   }1 w) {/ N9 r& D6 n
& t! x* V! P7 E8 P! w. X
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. ( |  M$ o0 `* {0 _% Y2 M, O5 @0 V
Quote
& G( A/ K  t, H, K1 x//   6.acrxGetApiVersion3 p4 [, c* ~- e, y' S6 _
   typedef void* ( WINAPI *PacrxGetApiVersion )();
$ N0 U0 A8 `- w2 Q$ N4 g6 zPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )9 Y  l' R/ u: S2 t$ U% {
::GetProcAddress( :oadLibrary( "AcArray.arx" ),4 h( _1 J4 A% J5 t" ^/ }; @: t
"acrxGetApiVersion" );( t3 L0 s& v! a& m' P1 P
% ]& o& r; \  i9 T5 B
3.从lib文件中获取,只有这个是可行的.* Z. P4 F1 J! u0 ^! V: p
#pragma comment( lib, "rxapi.lib" ) 1 l+ o1 X- w7 j8 Q6 \
" Q' \- h4 J9 H" T$ t
定义这样一个头文件 ) @) }) |5 f. K0 g  d. G, T. o
Quote
- x) @! z' z! Z7 z/*自定义CAD函数*/
* w; t) d  |0 Fstruct AcRx {8 M; ~9 ^" S$ n9 ]: Z

! j4 [5 T+ c0 t: l" stypedef void (*FcnPtr) ();) z  t/ t8 e- b* o8 q

2 `% @9 m' U/ ]7 h$ Y8 I6 |enum   DictIterType { kDictSorted = 0,3 u3 \/ H# W9 R% C
   kDictCollated = 1 };
# t5 q2 S* C- g  S2 K  T. V/ [7 f9 o+ o3 Q
enum   Ordering { kLessThan = -1,; y  l# v1 P" U. h5 g
         kEqual   = 0,
0 H: H# `: j! X9 k3 M9 K6 ^         kGreaterThan = 1,
+ f7 ^. {3 b# u3 {         kNotOrderable = 2 };  I. w+ A5 R0 z  i( d- O

2 q# `1 n4 _; F) q: kenum   AppMsgCode { kNullMsg   = 0,
7 O$ v- k+ D; J! r" f( h! C         kInitAppMsg   = 1,( a8 @! J5 L6 G2 T! ]0 V+ [+ k
         kUnloadAppMsg   = 2,( ~, P! n0 S) H+ f3 w/ w
         kLoadDwgMsg   = 3,
( _  ?6 N8 b# ]1 {, ^+ ?+ [         kUnloadDwgMsg   = 4,
+ W1 N8 t# j  |0 C' A# okInvkSubrMsg = 5,
7 V: U" O% D! W* [; f; hkCfgMsg = 6,
: t) t/ n- F" S) |7 G- q' x6 X4 VkEndMsg = 7,2 _1 H5 C$ U7 C& B- ^' }) C
kQuitMsg = 8,
! D2 F; v+ |1 w, h; ZkSaveMsg = 9,
, G  W; q" w+ [kDependencyMsg = 10,
! F' {  w: J4 A1 @4 C. vkNoDependencyMsg = 11,, o" B, A* _0 ]6 y+ m; E& n! Z% W
kOleUnloadAppMsg = 12,
( u& u8 h% Y7 J2 ~kPreQuitMsg = 13,2 P: N2 }4 |  ^1 V, w# u* z
kInitDialogMsg = 14,+ @) ^7 {4 S+ L- X
kEndDialogMsg = 15 }; # [" O$ _  ]4 P. A5 c4 Y5 Q
  Q6 B( k. b8 u" U6 T
1 A  G3 j* Y" p5 w+ ]
enum   AppRetCode { kRetOK = 0,) n3 N8 O6 \! Q+ F' E# X* {( E9 N  K, X
         kRetError   = 3 };
, R* S! J& S! t, X- z1 j1 C};0 O3 S5 `/ ~# L7 R3 ~9 Q: W6 D- e
2 G) k4 l( R+ U# u% l& @$ J
#define RTERROR (-5001) // Some other error
# L! q8 c. [  c  m! ]#define RTNORM 5100 /* Request succeeded */; L! ?( n4 E6 h) G* D8 g" a5 D
( D' |6 M2 ^6 O4 m, A
//1.
# w7 |/ V4 T3 b" FHMODULE hDll = ::LoadLibrary( "acad.exe" );
2 ]: _6 h2 A7 J3 @) o* g' Z) B* ~/ O: yDWORD err = GetLastError();
7 B" N" B1 P! [7 v1 f//2.int acedPrompt (const char *str);8 x* Q9 K# P5 G) r" q
typedef int ( WINAPI *PacedPrompt )(const char *str);
# H  U! t% e) [* kPacedPrompt acedPrompt = ( PacedPrompt ): X0 z& \6 y. Z  Q, @& l
::GetProcAddress( hDll,$ p8 R7 Q7 U9 c0 t$ C* c/ q0 N
"acedPrompt" );3 {- @2 ^& R* S. p: O& \3 V
// err = GetLastError();
7 G/ q' o) n+ ~# i//3.HWND adsw_acadMainWnd();' ]/ E: |7 S& U% }
typedef HWND ( WINAPI *Padsw_acadMainWnd )();0 I0 \/ x3 y, S
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
+ N2 \+ m0 A  K* w* R: k::GetProcAddress( hDll,
1 ]2 w: `+ W" z# ]% X) e"adsw_acadMainWnd" );
1 F! p5 B( y* v$ X# e/ F9 p$ G//4.int acedDefun (const char *sname, short funcno);
2 a# e0 D9 @' E, r$ w' Rtypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
1 F  H, j3 G/ SPacedDefun acedDefun = ( PacedDefun )
; S+ D+ h6 l9 Y" k' }7 O8 R::GetProcAddress( hDll,
, Z$ y/ R5 P  u/ u"acedDefun" );
6 J4 q) z+ \$ X9 R: s4 Y//5.int acedUndef (const char *sname, short funcno);
) [5 f. v2 I: D8 G! Ptypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
; i# C+ ]- E: T( ]' K6 kPacedUndef acedUndef = ( PacedUndef )
; t" T8 Z, j* ~::GetProcAddress( hDll,
' `; E/ s, M& v/ l"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 )

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