QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的4 T" C. F. q, h- d+ c; P
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
  k0 y7 Y0 ]8 T. ]& z, N对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
0 |' @: z+ B6 a( D6 \
( z# ]9 Z+ ?9 L; l4 v" v7 N  C7 \但是目前还是碰到一些问题,就是这个函数:% f4 y0 i* ^* w% G: _, e6 K3 O
acrxGetApiVersion,无法获取其代码.+ e& D$ k$ I9 {
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
- Z' @8 O* l/ j
; V2 i. e( c2 E! _而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
% O1 [5 `, }% H: Y& M3 {% |; y$ F) y! R3 ^- x$ N
我试过了以下几个办法来获取这个函数的办法:5 Z2 t! X2 X2 J3 X7 r
1. 3 h) m: r6 G8 h  j& S1 a
Quote
1 A, j! m! n2 |& R9 [, h自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
) I: d# u; o4 [5 f* {1 m8 Kvoid* acrxGetApiVersion()
3 r$ R1 m" ~! z! |6 [- \{5 @0 D$ V9 A+ n4 s
     char szHello[] = "Hello, world!"; 0 s( i7 z3 U5 S3 O& e8 G" f

. a  f# _% z, O* r7 w$ A  b   __asm " T% w' O8 e1 a. G2 U
   {
- j) v; X. H4 Q     PUSH 0
' d! H2 w: w4 ]% S1 `- I, `) d       PUSH OFFSET szAppName // 全局变量用OFFSET4 e" Y: P& h2 V+ r9 U( e% c
//       LEA EAX, szHello // 局部变量用LEA
; i& @! P! a* F7 k8 H2 P//       PUSH EAX+ z& g, a- K6 b
       LEA EAX, szHello
# P) J% M! U, L3 q* G# D3 A       PUSH EAX ! ~8 D$ D/ V- v& o5 }: Z8 U$ ^
       PUSH 0 * x7 J3 M; D3 l  j4 T
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
- I2 \$ ^. C( ~* {1 S   } 8 |4 r# S: i' H4 Y3 R7 S8 S4 G* i( i
   // MessageBox(0,"asm","asm end",0);   M$ V  J9 z5 U1 z% r  a
# w& N3 L' a. _# U# T. q
   FILE* fp; /*定义一个文件指针*/
1 j) Y9 `9 C: R6 l# r   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/4 _# d8 v5 `( h& J( M& {8 _* ~
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   
! O! Q, E8 ?7 b( `5 G   fprintf(fp, "%d\n", 12345678);
0 I# ]# e  S) ]/ NMessageBox(0,"fprintf","fprintf end",0); % h6 [& Z0 B/ q3 p/ {6 k
   fclose(fp); /*关闭打开的文件*/6 \" Q: i: |' p& `, E; H

8 }0 G; Q6 G+ G. f6 \: ?' f& {// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
1 D- x: W4 s( @5 z3 k; S3 `% {return acrxGetApiVersion_Mid();
& U/ k8 Q  R1 t0 i. E9 Q: r4 Q   }, @9 J2 o7 B8 p* A0 o8 s
1 E  p$ b* r* \9 {
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
% d. v* N; P# P" kQuote1 y, C4 u8 {. f$ v
//   6.acrxGetApiVersion- i% Q* e; ~/ V$ i% ~0 |
   typedef void* ( WINAPI *PacrxGetApiVersion )();1 F, ]9 V; Y& L9 a, m; v) N# b- p
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )) S4 G# r0 Q4 C$ e
::GetProcAddress( :oadLibrary( "AcArray.arx" ),* y$ n. j5 W7 A4 d6 e& o9 o6 l! G
"acrxGetApiVersion" );+ J3 P+ z" W7 e# c+ ?

7 I7 g; B1 X7 h) g+ O8 q0 M/ S3.从lib文件中获取,只有这个是可行的.( G4 X9 |2 @! K9 o2 K/ b  C- B# ?( K
#pragma comment( lib, "rxapi.lib" )
  E( O- y% e  |
, J+ w( t+ E9 J/ _3 |" J2 }& u  r定义这样一个头文件
' _: \% S1 k3 ^; U7 W  P; E3 `Quote% X0 k) V' T" Y0 n. n% C
/*自定义CAD函数*/
) Y2 r7 x6 r- d4 u  dstruct AcRx {
) q' P/ g( A: V, a& L* y8 `0 D$ v& o' ]
7 o1 p0 y$ m- s7 y0 u9 q( Z0 Q! atypedef void (*FcnPtr) ();
2 a% N! f# \2 o7 C. R1 p  d2 Z% k# X* B" d, F( e/ ?
enum   DictIterType { kDictSorted = 0,
, t5 H, g( i2 m9 Y+ _) x  H   kDictCollated = 1 };! K2 s# O! P) P3 r, \
; S' d. l' S! Z$ E  o5 W; _( n7 R: Z
enum   Ordering { kLessThan = -1,' v9 m( |( e  F0 e
         kEqual   = 0,0 y; e& c2 n9 m" K
         kGreaterThan = 1,
5 U" B8 A2 V4 s9 R: b5 E0 ]         kNotOrderable = 2 };
, S7 I2 h% s' g6 p
- ~. n- S8 [8 D9 kenum   AppMsgCode { kNullMsg   = 0,1 a  X& a5 B, W; k* T! N5 R7 g* W$ t+ C
         kInitAppMsg   = 1,
. K% u/ r" g& _  W         kUnloadAppMsg   = 2,6 l; b! k1 m$ F* a: q
         kLoadDwgMsg   = 3,/ c1 c7 R+ c5 o/ l! O, D7 |% k
         kUnloadDwgMsg   = 4,
7 |- G: z4 B) L5 K( IkInvkSubrMsg = 5,
0 a- j% i9 c8 {+ G7 _( k, TkCfgMsg = 6,
/ u. l) T/ w* v! k$ ^/ KkEndMsg = 7,) Z; r5 z% O5 x
kQuitMsg = 8,
# f3 m1 A- m( ^; H# GkSaveMsg = 9,! u: }  S6 y  ~0 M- ^/ T
kDependencyMsg = 10,* b# N  M$ r9 V+ X: u
kNoDependencyMsg = 11,5 I, O: s  W% {! v/ T" @6 {$ t
kOleUnloadAppMsg = 12,: q, H4 L  }9 n, @
kPreQuitMsg = 13," J/ ^* k# _4 P& [6 T: V
kInitDialogMsg = 14,
  c' i5 c- B6 }  r- B7 hkEndDialogMsg = 15 };
/ U8 V4 ]0 U7 }3 N: c' T: D. v$ q! K5 I; z. s% q
) A- z6 w# v# [  n1 t! _1 ~
enum   AppRetCode { kRetOK = 0,( Y8 @+ `4 ?) q' F  `* ?2 a
         kRetError   = 3 };
2 h/ @  ?0 g; a* J0 H5 ]};
9 P# y# S( z' H' t( _1 h
! L* Z9 K- _% r& P7 @0 A#define RTERROR (-5001) // Some other error
6 T. h9 o* t; }4 v% X) ]- g#define RTNORM 5100 /* Request succeeded */; N% d" ?- ]2 H( O

0 }+ O8 `7 {+ \8 ^# R//1.6 L3 C2 R1 |/ h0 @! _9 g5 S
HMODULE hDll = ::LoadLibrary( "acad.exe" );6 N+ a. C( M3 h, I$ ^+ V$ d
DWORD err = GetLastError();  }+ z4 }# n& @/ K
//2.int acedPrompt (const char *str);+ l9 @/ u$ `, u, y
typedef int ( WINAPI *PacedPrompt )(const char *str);0 G' h5 c1 m* R, Z! N7 v
PacedPrompt acedPrompt = ( PacedPrompt )& C7 \7 N2 G. n, C6 {6 @: N
::GetProcAddress( hDll,
( N- O  \) v+ f* w/ q( x9 i6 O' W9 E"acedPrompt" );- {0 h$ P. p; s; t9 M
// err = GetLastError();
* @! x$ G" h- v7 o//3.HWND adsw_acadMainWnd();; d/ J( `  p% i  M! r: [6 x# p
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
( p; h& h# G. @/ V( e( ?. OPadsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd ): ~8 ]6 f$ s' ~; z% b* F
::GetProcAddress( hDll,
; ]+ s9 I3 s; y$ u; z2 p"adsw_acadMainWnd" );
! d- p* O5 {+ P( m; c//4.int acedDefun (const char *sname, short funcno);3 `3 z6 e( Y! u8 s' @1 H" N
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
9 z& f% f7 q9 ^$ ~' {  R! |PacedDefun acedDefun = ( PacedDefun )
4 b, ~( K2 a' G2 q8 B::GetProcAddress( hDll,
+ }- |3 z; k( N& C; {$ o0 {"acedDefun" );+ s# o8 Y3 r5 Z2 P
//5.int acedUndef (const char *sname, short funcno);9 D  W% H' E5 O# R
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
* ]# W. D7 ?0 u6 @* @% }PacedUndef acedUndef = ( PacedUndef )
) u2 t8 V- j+ q) A::GetProcAddress( hDll,* A6 T. ~  P0 O3 z6 e+ u, V
"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 )

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