QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的1 X* B* c  n3 y9 C
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,  f2 A9 T' P1 v
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
! l, D- Z" @# [2 r  O5 ?: F: w1 }! A
但是目前还是碰到一些问题,就是这个函数:
0 P" L. f6 j) H: C3 |* u# h8 |acrxGetApiVersion,无法获取其代码.* O8 ]% y4 {( R0 a
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.5 M7 f# i8 N. L2 r) B
# `) s4 P) o: y# I) w+ {
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???. N: k- y2 t2 K$ G. [2 t" R% H3 W
2 ^: W  n. r, ^& h4 ^; a
我试过了以下几个办法来获取这个函数的办法:
" Q/ y0 s7 r- _5 W, j. g- w( `1.
. |3 |. e# k  `7 @; Z+ ZQuote
6 G2 \9 p, [9 k5 M自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.1 }/ Y. E9 {  Q6 }$ T: U  z$ e" m: q
void* acrxGetApiVersion()/ \. }, @, D: v/ x( Q
{
8 {4 K: X7 V' R! \5 u3 t) }     char szHello[] = "Hello, world!"; : \6 x- _) T# k+ J5 ^, |" {

/ J# O; l7 [( A& P& Z! c$ U   __asm
& C6 R0 I& c# o7 W$ f! f0 ]   { 6 P+ K. p  \: U
     PUSH 05 {8 w: P5 D- b% C) m
       PUSH OFFSET szAppName // 全局变量用OFFSET
1 I6 I% j& [  y- c% G//       LEA EAX, szHello // 局部变量用LEA) X0 c6 `7 \& Y& s1 ^2 O
//       PUSH EAX
- u% _1 ^& g& W       LEA EAX, szHello
: h7 K" q5 S# s5 h       PUSH EAX
6 }1 t1 ?* O% m+ g& L7 d+ Z) J       PUSH 0 1 z( Q) U/ o& o5 E. u% N
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
' o" T4 S+ E5 X# q0 w   } ) |5 j6 k0 j% }, i8 p
   // MessageBox(0,"asm","asm end",0); - q% ^4 A5 j) f
' f. I& ^3 E+ A5 b8 }
   FILE* fp; /*定义一个文件指针*/3 p' h% S1 [$ g
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
6 x9 }  |2 {( t- C6 zMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   ) L" Y) V  z( E
   fprintf(fp, "%d\n", 12345678);
/ P; V/ ~! m+ U6 a, s8 }6 [MessageBox(0,"fprintf","fprintf end",0); 5 f# T$ v4 H7 F0 j  p% j5 x8 e
   fclose(fp); /*关闭打开的文件*/
  F6 T& H  e6 L" v' D9 ~& |
7 b" C! P# v6 H) z0 _& N" |0 v// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
& \, i" a5 }- A1 h# ~( B6 g- mreturn acrxGetApiVersion_Mid();
+ s4 Y" ^' P2 g   }- p, W  a2 _/ h# d" b  H! I
1 [+ Q  A) a* S0 y  T
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. + j0 e9 Z, O/ Y" ^9 k
Quote, V2 B# a& c) ~9 M! r9 Q
//   6.acrxGetApiVersion
3 i! r4 }7 L2 a) R   typedef void* ( WINAPI *PacrxGetApiVersion )();
6 h3 S6 J  q. T  }. JPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion ). x+ j1 [3 o$ n
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
  R$ g/ g9 \. N, O& t2 o3 x"acrxGetApiVersion" );, z5 p. N' m. Z; C

! _& s. [9 {* q; M' }7 S' E3.从lib文件中获取,只有这个是可行的.
' b2 c6 F! f2 k; v, k$ o9 L7 x#pragma comment( lib, "rxapi.lib" )   n! j1 u8 v6 k9 @6 n* s
. C3 R! d" l. a. [
定义这样一个头文件
! V+ w  i: K: W- D% CQuote
) z* A6 C- T' @0 W3 \+ W) z+ t/*自定义CAD函数*/. F& K! k* n8 [7 X
struct AcRx {
: @3 R2 D" F5 q% h
& _: O' _% I' R' h& j9 itypedef void (*FcnPtr) ();
. l2 J% G/ u* B. @
; M2 |1 G' D: n) I; r0 y  u7 senum   DictIterType { kDictSorted = 0,1 O5 Y' s* n+ Q& g! Z
   kDictCollated = 1 };4 b2 t6 X. c; j4 N4 @3 i

1 z( z4 i0 c  J, Zenum   Ordering { kLessThan = -1,3 C" J# w( y7 n! z3 s
         kEqual   = 0,6 ?7 Q& V% _- y
         kGreaterThan = 1,
9 ]$ ~1 K) s/ Q         kNotOrderable = 2 };
) r! q2 m6 s, j$ P9 J5 c) n4 A
/ X6 m7 W- w6 I: y: n4 T; Yenum   AppMsgCode { kNullMsg   = 0,
% X, a. ?7 W2 p, K1 `! }         kInitAppMsg   = 1,
2 A4 @& t1 J; K$ U3 v- z         kUnloadAppMsg   = 2,4 r/ u1 m9 Q: _8 ~2 L6 @* Z7 L' F2 {
         kLoadDwgMsg   = 3,9 d& _6 Y9 Z8 l  v
         kUnloadDwgMsg   = 4,' H1 A1 r# D0 Y5 S* ?
kInvkSubrMsg = 5,
2 N/ t$ M( @& l* C( h6 r3 m7 H2 pkCfgMsg = 6,  t# K/ J8 S/ t, T
kEndMsg = 7,
0 E: d/ H9 l0 x. x* H& F/ PkQuitMsg = 8,
) I* p$ B( n3 `: j9 N% EkSaveMsg = 9,
5 p1 S) {" M- w: Z8 }: ckDependencyMsg = 10,
- k9 ]# ~+ q% z% N( t/ n. C- z" skNoDependencyMsg = 11,, Z& Q0 V7 d$ Q0 _" `: J- o- i* m
kOleUnloadAppMsg = 12,
- J8 I  `2 L" x; t1 mkPreQuitMsg = 13,
/ _4 q+ l& y  n* LkInitDialogMsg = 14,
5 g+ e# f" ~( B' U# b1 HkEndDialogMsg = 15 }; 1 ?) L+ I* t2 A/ J: S$ @
* N  Q9 o8 S2 F+ {% Y% u

2 `$ ]- `  @) j$ S2 g3 U- P7 V" e& Kenum   AppRetCode { kRetOK = 0,
& I5 M* z4 o0 V- q         kRetError   = 3 };
: H1 k4 p; T; O& L0 X$ d};, t( Z. ~; Q+ C+ ]0 ]# r: U
  O( h+ S" C! Z
#define RTERROR (-5001) // Some other error
* m7 ^; A$ S, S  A) F#define RTNORM 5100 /* Request succeeded */
" f0 ]- @" K* v0 s. }6 K' c1 }* ^9 m9 K0 D9 `
//1.4 h. r( s* G) L. X0 X/ m: }7 n
HMODULE hDll = ::LoadLibrary( "acad.exe" );+ N4 h8 n2 o) M4 ], P2 K5 F
DWORD err = GetLastError();0 ], U, @, h/ }8 ?1 r9 Q
//2.int acedPrompt (const char *str);! C% h' i* E! [7 k
typedef int ( WINAPI *PacedPrompt )(const char *str);0 x+ ]. D. E. A
PacedPrompt acedPrompt = ( PacedPrompt )& `$ u. k& Y+ K) ~; z1 b# s
::GetProcAddress( hDll,) A* j% O) I- R* t+ |
"acedPrompt" );
- @* [# V! o: x, n8 c  z// err = GetLastError();* s$ D( j- s) y8 b& B8 |
//3.HWND adsw_acadMainWnd();: X! Z' z* E  C* q0 `' {& w) K# P* [
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
$ a1 F; z; i' F9 c% ?- B- gPadsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
- ?. y5 q. U" m! ?::GetProcAddress( hDll,
8 J9 c: E6 n+ A"adsw_acadMainWnd" );0 ?0 ~. F. v" h# S4 M8 O
//4.int acedDefun (const char *sname, short funcno);
; W5 Y9 m2 C; T, Ktypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
/ M& r' @. V& Q- d7 n- gPacedDefun acedDefun = ( PacedDefun )4 N" y3 ]7 _) A0 n, l8 L: d/ ]
::GetProcAddress( hDll,/ l' ]) j% L4 @- K$ q. n
"acedDefun" );
% [, m+ F& V6 d! w0 L$ i- u. G//5.int acedUndef (const char *sname, short funcno);
0 {& n7 S2 w( C5 x8 Mtypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
! ^& ~: A! m9 j' [4 ]PacedUndef acedUndef = ( PacedUndef )
) e3 }5 b- ^: s# [8 G; K::GetProcAddress( hDll,4 x' o& L. D6 K' Q
"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 )

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