QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的
* ~9 e' h$ @2 m; c3 Y# R通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
- a9 o; @4 t- [  e/ O4 I对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
  T5 f# O- h( |( Y  E% B6 \# @/ B, Q/ t% I% `# L6 m% p0 S
但是目前还是碰到一些问题,就是这个函数:
+ c, @( a3 [" K# CacrxGetApiVersion,无法获取其代码.
3 m9 E7 z/ U8 |) S, Y/ |因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
) i0 g  o) K6 x5 L- ]2 \. L' ^
7 C' z  d* @, c" j& o0 i3 \而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
5 |* j, Q6 W- ?3 B: F/ d9 u2 \* R  E3 ~0 D1 M. t8 _
我试过了以下几个办法来获取这个函数的办法:; \# S: Y) j4 u3 n) J6 J0 @3 s
1.
9 B, y5 P5 m& C8 gQuote
3 J" b5 W# d  z" o1 d/ x% t自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
7 y* [& a& c8 v9 g: P& kvoid* acrxGetApiVersion(): E7 M- J% L; O; f" h4 L
{9 o/ \4 F1 F' w/ K, {
     char szHello[] = "Hello, world!";
, `5 k* g1 U) j0 y3 I/ x* Q2 d5 g/ ?. j5 Q* z, O
   __asm 9 [  D( U7 P! o) N# z# u4 b
   { 4 q6 [! _: \- B+ d- o, j
     PUSH 0* K, K! ^- M( {% @) ^
       PUSH OFFSET szAppName // 全局变量用OFFSET0 W4 m2 ~$ Z9 L5 \; V* @
//       LEA EAX, szHello // 局部变量用LEA
" W9 t" L" l; L! m9 U  X- @//       PUSH EAX
. M8 S: t0 P; \  B( S       LEA EAX, szHello
4 a6 \" M9 R0 v1 d       PUSH EAX
2 q4 p4 E% X! G0 L       PUSH 0 : q+ T0 J  R! _: q
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
/ G' T: r! b: l7 r  ~9 a  Q   }
! `3 }) m% \5 U; x   // MessageBox(0,"asm","asm end",0);
( [& M' K& F4 k4 o
6 J* d. ^) E; [9 Y6 z7 t   FILE* fp; /*定义一个文件指针*/2 M* Q+ T) ?7 {; z
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
/ Z/ N/ Q/ b9 w, Z3 F* M9 E0 wMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   ! n% O; ?  L/ [, {$ ]/ J6 Y- I
   fprintf(fp, "%d\n", 12345678);% {% K& z& m3 H0 v$ H
MessageBox(0,"fprintf","fprintf end",0);
1 N5 s( _: a6 V$ R; ~8 }) x   fclose(fp); /*关闭打开的文件*/
- N) _# U; f. E8 m4 |' I/ W7 [4 w$ V5 E% n9 k! \
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 6 E6 ^! |! f" `1 I4 P
return acrxGetApiVersion_Mid();
6 U! z" L# T# q' _& m   }# _0 K: [2 o0 b7 u; z: v7 r5 w* ]
7 x. L' S& {* Q1 S6 K
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
( a' l/ D' ]! QQuote
+ A! R4 `4 p- W+ Q  s" k//   6.acrxGetApiVersion% i$ t7 o0 C* b5 a1 ~: }" Y! ~
   typedef void* ( WINAPI *PacrxGetApiVersion )();5 h/ Q- y! O6 p* `
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
# g9 n) Y, r$ C/ i4 W::GetProcAddress( :oadLibrary( "AcArray.arx" )," h. A$ L" Z; A" O# @
"acrxGetApiVersion" );8 ^& s7 n! e) r- t! o# a
: s3 \+ c) A: C3 n$ P# x% K: A
3.从lib文件中获取,只有这个是可行的.
, ]" t  z* h) Z% |1 f#pragma comment( lib, "rxapi.lib" ) ( K- k  O9 r& A3 W7 `) e
% m2 {  Q9 j: Y
定义这样一个头文件 # a- T. _8 g: A% i8 O
Quote
: p/ Q5 O6 ?( y( C6 G7 `& L1 x/*自定义CAD函数*/
. t" U$ `, ?( Y" B- D: O5 D6 ystruct AcRx {, g8 M' q6 k8 n4 W) Z$ J

& \% H- Q7 B& t% r; l) atypedef void (*FcnPtr) ();' q0 S) g- [/ I6 ?' U% }; u9 z2 d
- W! S2 ^5 @5 I2 V0 I8 s8 q
enum   DictIterType { kDictSorted = 0,/ o! p7 i" i6 ~. a3 t# i/ u- s0 e0 J
   kDictCollated = 1 };% F3 e$ ?/ T& u  e& W. u
% U/ f! p" ?2 N! r
enum   Ordering { kLessThan = -1,
7 e8 ^8 M# v, f" k$ l         kEqual   = 0,
3 V/ h! b, u" S6 ?  n         kGreaterThan = 1,
' W3 ^; H: E, E( b# {$ D         kNotOrderable = 2 };
9 N. |! y; j. }; d: x
" e6 ^: y  r& Q/ I6 Z+ jenum   AppMsgCode { kNullMsg   = 0,
6 N' i2 Q0 V" M3 b6 r6 ]. J         kInitAppMsg   = 1,' h2 ^/ B0 R  H# S
         kUnloadAppMsg   = 2,+ j- i8 X+ ]( ]3 g) m2 {
         kLoadDwgMsg   = 3,
& _( u" Q: }+ O% Q: a         kUnloadDwgMsg   = 4,
% Q$ ~( L3 G6 ^* jkInvkSubrMsg = 5,
- O& v4 {. V6 t; ~2 ^1 BkCfgMsg = 6,! t! p) x; Q, n, W2 S) E7 c
kEndMsg = 7,
3 O  w% B) B2 i# T& D. PkQuitMsg = 8,
& s, M0 m$ ~' O  wkSaveMsg = 9,* @4 ?# {2 q, @# Y
kDependencyMsg = 10,5 z9 @: Q$ c: i
kNoDependencyMsg = 11,- }, d( r3 S5 ]2 |$ j, |
kOleUnloadAppMsg = 12,
; g( H6 l, r. h3 i& A2 kkPreQuitMsg = 13,
3 A  G0 ?1 C% D" G8 \8 y+ S. QkInitDialogMsg = 14,9 e/ o& E+ A( _0 e
kEndDialogMsg = 15 };
, U8 f  Q4 _! R* O( Q6 a! C' u' R  n$ F  Q) K& i

! V) Z; n% l# w( R( C2 V4 Genum   AppRetCode { kRetOK = 0,# W% E7 k* A$ v$ e
         kRetError   = 3 };
$ ^9 |, O' L2 B};
1 e( X% g7 p) K9 }, P1 ^; A
* I5 c% L7 c8 d! D' I+ |#define RTERROR (-5001) // Some other error+ c$ A- G, e2 Y
#define RTNORM 5100 /* Request succeeded */
- M$ F/ m& ?( |/ c/ N
* @3 m" B- u4 V8 L( O# ^//1.
0 Q2 m' B. c) kHMODULE hDll = ::LoadLibrary( "acad.exe" );
3 U8 h3 R, E' z- C/ m: C- jDWORD err = GetLastError();" ]# c$ ^. Q5 W5 W: X
//2.int acedPrompt (const char *str);2 u! `" X- D0 e3 Y7 w
typedef int ( WINAPI *PacedPrompt )(const char *str);- j8 V+ Q4 D: Y9 X
PacedPrompt acedPrompt = ( PacedPrompt )
# q* i; a% k4 B! g. _, x: c6 c) r, r::GetProcAddress( hDll,
: g; m9 V6 F0 G* Z1 U( }  t"acedPrompt" );
5 L# |, l" J; M& l( w! V2 b' V) f) T% S// err = GetLastError();) ^3 \  z( X5 P5 B. v5 R
//3.HWND adsw_acadMainWnd();  g7 X, h8 a$ v. H& J, B
typedef HWND ( WINAPI *Padsw_acadMainWnd )();$ y4 i. ]* R1 N4 n
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )# o: a" Q" G  L: ^' o0 w
::GetProcAddress( hDll,5 f! V. v0 Q' p# y) ]+ P: V5 H7 u0 h
"adsw_acadMainWnd" );: S1 E3 ~; A& f) y$ Y0 g. |
//4.int acedDefun (const char *sname, short funcno);, r5 j7 d3 `  y: K( ~
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);# O. J/ v3 g# \9 W- _( f# n7 W
PacedDefun acedDefun = ( PacedDefun )* N- |  g) Z: Q2 Z3 [. ]2 k- x8 P
::GetProcAddress( hDll,! N. P0 D; A1 S; p( m" Z
"acedDefun" );
& m, q! Z  U- m//5.int acedUndef (const char *sname, short funcno);
% s( a: _- D! U; @" }typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
5 X$ e2 {7 H- h' ?4 B* }: `- w" UPacedUndef acedUndef = ( PacedUndef )
/ ^: _, q* c, F. e::GetProcAddress( hDll,
( \% H+ O0 Q: z5 k/ N$ ~# f6 `- p"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 )

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