QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的# ^! b5 b. V/ s2 F$ d
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
$ q1 P; R4 w" ~/ S6 ]) y对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
6 V, D0 e: V6 O% c; a
& f" o$ q1 Q6 F但是目前还是碰到一些问题,就是这个函数:% }9 r4 j3 }$ I
acrxGetApiVersion,无法获取其代码.
3 v& ]# M4 t! x3 X因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
6 L  s7 O1 R) f: t4 h) e1 U0 R# @8 c" d
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
7 p( S) P8 U  y9 t. {
0 A- t7 n  [. _( o% e我试过了以下几个办法来获取这个函数的办法:% p: Y! j; [) g+ R4 i
1.
8 }, o7 g+ O& {  x: ^1 s; D  L5 iQuote% ~* v) V' @8 m% U2 S2 U
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.1 |6 j5 b9 o/ Q6 f
void* acrxGetApiVersion()+ L# Z$ S2 {" @1 U( T- `
{
/ `, H" L, l! w" d4 U, j6 L     char szHello[] = "Hello, world!"; 1 o3 Q& ~/ [& \

. S( g- h5 L3 ~; B% c5 p   __asm , G0 E2 I7 T% i' a& v0 s
   {
5 f+ U4 ^6 i) A/ V, w( m" ~- G0 |     PUSH 0- x. E2 o. d; i+ {( ~5 v6 \
       PUSH OFFSET szAppName // 全局变量用OFFSET+ a% y' ]: f9 X# M2 L2 L! G
//       LEA EAX, szHello // 局部变量用LEA/ Z3 y4 p, V. l  [1 v; ?8 S. f
//       PUSH EAX1 k3 K0 w) M! [; m
       LEA EAX, szHello
6 j# t; U  {( E0 r* v" O       PUSH EAX
7 l3 {4 ?' c  {2 F       PUSH 0
/ Z3 g7 k2 h: w1 @+ E       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
5 ?' n* C  ~- c; {  U, L# R' U   } 2 M' Z/ k2 g3 f& V: Z4 s
   // MessageBox(0,"asm","asm end",0); 6 \8 V8 ?) K! i9 d
( d5 i. @; ^+ `3 U3 q& ^" Z! _4 @4 K
   FILE* fp; /*定义一个文件指针*/3 I, W9 Q; \5 p6 @6 {
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/, N* v- J" _% z0 J- ]/ I
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   8 x2 P. Y6 w- o% _/ s" |& D; V
   fprintf(fp, "%d\n", 12345678);
5 X+ x" {' L0 w: l7 VMessageBox(0,"fprintf","fprintf end",0);
) @. i3 `& R: ^( x- f* p+ a# w   fclose(fp); /*关闭打开的文件*/
9 S) u) R: M% C' Q  I, ]2 m  A0 G5 V( P6 c8 K( [7 N( }& s
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   a% E. m- a5 f$ q5 g2 R( d
return acrxGetApiVersion_Mid();
- n! {) M6 x* S+ {   }
. B0 X, ^" S6 _+ V" R, ^( H
3 u. i/ V- h7 Z! s/ E) M3 }2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. 2 l7 }; y, a3 S' M
Quote8 a2 z8 c) _4 C3 C3 k9 T' s# [/ j
//   6.acrxGetApiVersion$ ~% D; v" u7 S9 A! B
   typedef void* ( WINAPI *PacrxGetApiVersion )();2 A+ l* _3 c' e) I$ c4 I6 V# J
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
6 @; n# S1 v8 @2 p  D6 H6 @1 h0 A::GetProcAddress( :oadLibrary( "AcArray.arx" ),4 O" @" E4 V, F8 ~- j3 I# j
"acrxGetApiVersion" );% ~+ z* R' x! \( M" p

( X" F6 ?6 z0 W7 u0 u3.从lib文件中获取,只有这个是可行的.
( ~5 ]' r* y0 |2 p#pragma comment( lib, "rxapi.lib" )
' ?0 Y7 u% B$ n5 q/ R9 t$ P0 I! O' Z
5 p, |2 Q9 ?0 i1 e定义这样一个头文件 8 q/ a+ x& ]! |7 J
Quote' v% }: B( x: l6 S3 F% z- H3 n# \5 a
/*自定义CAD函数*/  q$ z- H: U1 C9 R
struct AcRx {) C" {' |: H% h8 {0 K: I$ g6 |( M
- s9 F' M* n8 \* p
typedef void (*FcnPtr) ();
) X$ O- Z9 D6 ]9 Z4 Y* A' J7 X9 u% G) z" N7 ?
enum   DictIterType { kDictSorted = 0,
# ~% s. g  G4 K5 M" L1 b$ J   kDictCollated = 1 };3 M, S; v. f. \
; A+ v* _% p" q- c
enum   Ordering { kLessThan = -1,( ~( m) b2 h1 ]: p
         kEqual   = 0,
3 c/ i% D9 H0 p) M- Q6 a         kGreaterThan = 1,
; b* e( n3 u1 k  O& E2 ~1 i: c         kNotOrderable = 2 };
0 D! ?5 a! x# O" @7 E4 u9 {/ H8 n: G* m' p' K1 G& o
enum   AppMsgCode { kNullMsg   = 0,5 b: Q! [. C$ }" _& C
         kInitAppMsg   = 1,
& [4 @, \' N% B8 \         kUnloadAppMsg   = 2,3 _4 U; J4 r' R/ V" ~( f
         kLoadDwgMsg   = 3,; G! O1 ?: Y6 [1 [. s
         kUnloadDwgMsg   = 4,
  m# I' ]! [7 fkInvkSubrMsg = 5,
8 v( a- j" m7 p1 TkCfgMsg = 6,' {) a! E: }5 P5 C" U# k/ m2 s
kEndMsg = 7,
8 L  |, u/ o) z  u8 ?$ Z- @kQuitMsg = 8,
% _/ l: j& d- b, G0 UkSaveMsg = 9,
2 g1 y8 @) V  r% v3 N1 E, J4 ikDependencyMsg = 10," o' T/ G" a6 O' ]7 o
kNoDependencyMsg = 11,
6 L! a: T2 t" f. UkOleUnloadAppMsg = 12,
) l" H) w5 Q( |kPreQuitMsg = 13,' o  a% Y- j- c7 l' l) W
kInitDialogMsg = 14,
3 x8 A1 [2 H5 D) h$ T8 okEndDialogMsg = 15 };
! J4 U# E) c' q8 ]# [4 ~
- R: R2 `% P- x( `3 v3 j
# s, V- {" b) C1 z: penum   AppRetCode { kRetOK = 0,2 O1 n! D+ i0 b+ L( L
         kRetError   = 3 };! G* M+ s; T) q2 A# ~
};
) ]! J9 n$ u9 S, ~& C
. ]2 J- |5 U& {8 p4 t5 F#define RTERROR (-5001) // Some other error
/ p: ^0 c& E9 M9 f  [#define RTNORM 5100 /* Request succeeded */* L3 Z; m% l! g
8 C5 q  M2 F  U& }' s9 R5 y2 J
//1.$ B! J# g' ~# N  }
HMODULE hDll = ::LoadLibrary( "acad.exe" );
- s9 M( v) l0 n7 m2 c* O/ |DWORD err = GetLastError();
" |6 Q/ ?( q2 Z& f7 C: P//2.int acedPrompt (const char *str);
. A0 D: n  ?  i% Otypedef int ( WINAPI *PacedPrompt )(const char *str);
4 c1 q  _8 h9 F& EPacedPrompt acedPrompt = ( PacedPrompt )
) T2 B( y& d# |$ k::GetProcAddress( hDll,2 G; @/ a* f# f1 ?
"acedPrompt" );
9 n( {" r9 r% r/ r// err = GetLastError();
, {# o4 Y! S0 X; D//3.HWND adsw_acadMainWnd();, ]2 o, t! Q3 t$ A
typedef HWND ( WINAPI *Padsw_acadMainWnd )();) o  c' `% y$ ^* q) y/ |. N
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )3 C/ Q" `* t. ?! N4 X( H
::GetProcAddress( hDll,
" n$ S( e! X$ @& a$ T- ~"adsw_acadMainWnd" );1 d! j+ Q  ]6 r+ t5 b  s
//4.int acedDefun (const char *sname, short funcno);
. m  r. ^  G* @3 V$ ftypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
6 j9 t2 d5 t! m2 B  m' kPacedDefun acedDefun = ( PacedDefun )
. z' E* |7 a) a+ Y, \::GetProcAddress( hDll,: C3 l* L3 C  @, p$ c
"acedDefun" );* a9 J/ I' c  a* B' g: \
//5.int acedUndef (const char *sname, short funcno);% M  }! ?8 ^5 U3 n$ Y& c
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
9 l* @! u" ?; L4 v# iPacedUndef acedUndef = ( PacedUndef )
1 ~$ X0 O3 P! O! C# _- |::GetProcAddress( hDll,
1 y) ?& E/ A9 T6 t. s& k7 c, b"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 )

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