QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的
  r( q. z# M! l* U) x% }! g通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,' Y) {  ^3 t+ d; y2 y3 F
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.2 a$ M/ m+ G& S, r' i( E* e5 K

' c& W9 X+ g9 A但是目前还是碰到一些问题,就是这个函数:
. ]) a% N8 ^  A& x* }acrxGetApiVersion,无法获取其代码.$ G7 D8 {7 x8 @5 |9 D0 C8 W
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.' g; v" g* g3 k8 q6 B4 W

" {# e. Q/ [6 P% K0 B而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???4 J$ [1 k3 M' i' j# ?8 L; S" R

7 s9 v' ~0 \4 c9 C4 x我试过了以下几个办法来获取这个函数的办法:9 ]1 F; R% e' i# K1 \) B% @
1.
0 a' ]1 d4 s: s* V% h6 W5 G; AQuote& W+ Y2 A4 N7 r9 P% I0 X
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.3 T* K) K- J0 n; r( y
void* acrxGetApiVersion()
3 d  E( `0 s- z* j$ p' V{
$ p; ^$ Y5 i( ?1 k! S# B& ~& F1 [- H     char szHello[] = "Hello, world!";
5 @' K9 `( H7 J3 G$ Z/ l/ ?2 \1 N! [' c- ?
   __asm 1 f4 f! u8 r1 u; G& w5 ^
   { 6 ], ^8 Z- F6 {
     PUSH 0
  f; v' h* H  C( D5 W% J* ]  `! @       PUSH OFFSET szAppName // 全局变量用OFFSET
6 P* J: w, \. L( D8 e9 f, i//       LEA EAX, szHello // 局部变量用LEA1 Y3 v- `6 s3 Z0 s2 N, s
//       PUSH EAX
7 A2 M: H/ `5 ?+ S( J       LEA EAX, szHello7 Y9 C- J+ D8 m, [
       PUSH EAX
/ b) w5 _) N2 c       PUSH 0
7 q( q' Q7 P8 }& D9 @% k0 |  W9 z8 H       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
9 H. ]! D. [: |$ ]   } ! {) S! ]% N8 b* M* s9 Q
   // MessageBox(0,"asm","asm end",0);
8 I% A9 A' c; B* X/ V! m
# u% c5 E: D6 D$ q' E   FILE* fp; /*定义一个文件指针*// a7 c$ D& A7 Z4 C& c' V# ?
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
2 e: e/ E/ {! ~, M  fMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   ! Q; A0 h$ F! G6 y0 o/ g" V
   fprintf(fp, "%d\n", 12345678);" ?. o9 v; h* h7 w; r9 g
MessageBox(0,"fprintf","fprintf end",0); 9 a! b1 K; V% |. c5 m- S/ `. M
   fclose(fp); /*关闭打开的文件*/" i' b, ?7 p6 ?+ u) k

0 k  c2 F3 g: T0 W: M3 ]' K// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
* J7 y, J2 J, [: M2 O" Q% ^return acrxGetApiVersion_Mid();  D& k3 z2 C! d- p( R" |& O9 e
   }* Q6 D. {. l0 Z5 X. |* |4 u
% A/ A. X4 l2 f% A; M  A
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. " N# d5 e: L" ]
Quote
6 S! ]2 m) D) k: W& w) H//   6.acrxGetApiVersion
4 x0 K2 ?# p' p; L0 q1 Z   typedef void* ( WINAPI *PacrxGetApiVersion )();
- k" K' V2 Y6 ^: r, \PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )" x* I( q! L6 h5 j- v/ T
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
1 D" r% G; _) g7 X( F"acrxGetApiVersion" );. G* H4 \1 L, `# m0 v- B. R

1 {" f: Z& H1 K3.从lib文件中获取,只有这个是可行的.0 A2 w, _0 L5 [5 D2 g* V( D7 R
#pragma comment( lib, "rxapi.lib" )
, Z% w3 R' f4 N1 \5 o  L* F3 u) O+ o- A) l. ?- R6 f. B
定义这样一个头文件 * f! p! l: S$ @
Quote
  v2 Q3 S$ e' A/*自定义CAD函数*/& ?+ ^) H) ^* x/ a
struct AcRx {
* @# G: h/ |' p' e& d/ i/ M: J8 f+ h7 g0 n7 |+ k  o( m) W
typedef void (*FcnPtr) ();
% \# ?6 n" g7 s, O; o% u1 X6 e" T7 p0 A
enum   DictIterType { kDictSorted = 0,* D% Z5 ]- V) n& y7 e; m
   kDictCollated = 1 };* ~- o% R/ q9 j7 E

- Q" c  b# r1 d6 aenum   Ordering { kLessThan = -1,  q8 u" Y3 r' c% `4 F3 M9 w  s
         kEqual   = 0,  ]+ E4 y1 r" _" ]/ ]
         kGreaterThan = 1,. @/ R6 j& N9 l/ B8 g+ c' i" f4 n% D
         kNotOrderable = 2 };' Y2 V9 E; h$ z
! ]. F- _, \& B1 a% C  O
enum   AppMsgCode { kNullMsg   = 0,
( G6 ?, T, {8 o4 X% k7 \  f! H         kInitAppMsg   = 1,
% M% f' S% b0 w: m) \         kUnloadAppMsg   = 2,7 S+ I* p( B( K3 r
         kLoadDwgMsg   = 3,
  `% n% R& |+ M) n         kUnloadDwgMsg   = 4,( m. h6 d9 e$ H/ e
kInvkSubrMsg = 5,+ e6 Y8 @# f* K. V$ a1 p5 d# l1 w9 ^
kCfgMsg = 6,$ M9 K& E" e& S; u) n
kEndMsg = 7,) Z. z% q; N+ _0 t3 ?8 A/ Q; y
kQuitMsg = 8,2 ?- y% l. k, J0 l. |5 W
kSaveMsg = 9,
5 Q, y# t; [' |4 u6 Q3 WkDependencyMsg = 10,
  a9 N& k+ {) ~1 P1 MkNoDependencyMsg = 11,
* k1 `& h% Z" J/ w& g1 ~0 ckOleUnloadAppMsg = 12,
; z  U( r4 q! M5 G& s* q8 {kPreQuitMsg = 13,
# G# |) ?! `, f! V9 D8 |( jkInitDialogMsg = 14,) ^& I: x, v5 ^- h. m+ k5 e
kEndDialogMsg = 15 };
* B. x0 T, m. ]
9 `' u1 ~5 ?. P; Q) e8 i" ^  F* U- `& Y' r3 e
enum   AppRetCode { kRetOK = 0,8 I' t5 S$ x4 T
         kRetError   = 3 };
, e5 ~* d& P  w: F6 K2 i};
0 d. D1 v( a6 p3 H6 J
% w. G5 `* ]0 d% c5 C% b9 D3 M& E# b#define RTERROR (-5001) // Some other error/ I, J4 A  H) o2 @- ^* |7 p" y
#define RTNORM 5100 /* Request succeeded */3 u  s5 j7 w5 ?, Q: }
( j4 ]  t# v2 o- n" _$ ^2 q$ e
//1.# P: Z5 U8 ]/ Y
HMODULE hDll = ::LoadLibrary( "acad.exe" );1 l; F3 l7 V# o  g( z
DWORD err = GetLastError();
+ o( S& a# z8 j  y) H( k  c# w//2.int acedPrompt (const char *str);
" l8 t* Q( h/ L. \* i' Qtypedef int ( WINAPI *PacedPrompt )(const char *str);' v& }& m7 G" i- s" D' |, y4 G
PacedPrompt acedPrompt = ( PacedPrompt )8 w" S. w  @6 d. o
::GetProcAddress( hDll,
7 t# g* O9 _, j! r$ v; P0 a: n0 S"acedPrompt" );, ~8 _/ g' V1 A# ~6 i) O1 Z, l
// err = GetLastError();! K( v: K  S! ^! p( u
//3.HWND adsw_acadMainWnd();
" a4 U4 T0 v3 {1 V( }! r$ \typedef HWND ( WINAPI *Padsw_acadMainWnd )();
% w8 [: K8 T# c' B4 y1 ^Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )% y2 b5 {$ \4 W4 r* z
::GetProcAddress( hDll,
0 b& M& H3 k! \3 t7 f"adsw_acadMainWnd" );
3 `0 \5 B( N' N) [+ o9 Z" ]. S//4.int acedDefun (const char *sname, short funcno);
  v1 X" r( i& [7 r2 d8 B* q$ Otypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);' Z5 b, [. ?4 d. C
PacedDefun acedDefun = ( PacedDefun )
; r2 T/ e0 N# K$ a9 w::GetProcAddress( hDll,
+ N3 @/ m! b, n, V"acedDefun" );
. f! X' Y" Y/ x" T: @9 o//5.int acedUndef (const char *sname, short funcno);1 H5 f: R0 Y2 K& ]$ k
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);4 j; h1 |3 V/ P$ u
PacedUndef acedUndef = ( PacedUndef )+ C9 j9 Y0 V( v6 }
::GetProcAddress( hDll,
7 K1 }2 s; h- j"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 )

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