QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的6 P  Y( `$ W. e
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,, h( J" N2 A3 j% ]
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
* K+ ~: ]: m7 g5 u. {
3 T8 O* |% _  `1 X但是目前还是碰到一些问题,就是这个函数:: Z- ]/ L1 A- C7 K; Z2 M
acrxGetApiVersion,无法获取其代码.% R# P; l0 r' T/ t/ Y& W
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
! K  I: ?/ y: x" N" B# E6 Z8 s  G0 i$ D* D. q) R  |0 P5 r) N) G
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
/ d, b( Y4 O2 d+ _5 X) ]% d6 U( \6 G4 F: j9 Q& y
我试过了以下几个办法来获取这个函数的办法:
2 x9 U* x4 v( e5 L2 g1.
9 f$ Z' ?  B; n* kQuote  S" P& B- ^+ v0 [
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.# K' {" W* m  _' d) g6 H1 P
void* acrxGetApiVersion(). o; g6 w: D4 L, Z& r
{
! Y9 M; O" Z7 @( g* N     char szHello[] = "Hello, world!";
4 E/ M8 B, G* y+ v% j# L) a# B0 s! G6 T, n
   __asm 2 {& U  T4 V0 q+ V& b9 J
   {
" L5 V* v# X+ f9 k     PUSH 0
: V% C( T' N3 y       PUSH OFFSET szAppName // 全局变量用OFFSET& ?9 _6 m+ ?) J' B- c8 I4 [
//       LEA EAX, szHello // 局部变量用LEA' q( ]' _) t# y. a# P  {$ `
//       PUSH EAX5 H4 h$ N  m1 `% {" R
       LEA EAX, szHello9 p4 K9 i  v! Z( w/ D
       PUSH EAX
5 ?9 n2 [7 O$ O( P% ]       PUSH 0
( R$ m3 H) [; E       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA! M% d! j5 |, B7 O" b# }! Y
   }
: k$ z8 G' S1 @; J+ p' Z' c9 o   // MessageBox(0,"asm","asm end",0);
3 a0 O" \5 G6 }7 {1 O! ?2 V# a
" F( d6 _3 p+ ^( |   FILE* fp; /*定义一个文件指针*/
7 ^* M. |, c, p9 u  r# a" s% V# d- T   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/9 J' O- E7 ?0 u+ z$ K: [
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   
: M2 t, L7 R# D- W   fprintf(fp, "%d\n", 12345678);
6 k. F! K; L0 @' KMessageBox(0,"fprintf","fprintf end",0); 1 g, J8 [+ q- j8 a
   fclose(fp); /*关闭打开的文件*/& a( @, P3 C+ \

% F5 N/ d8 s% |/ e, S1 P// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); % F2 |: _4 u  D* ^& k
return acrxGetApiVersion_Mid();
4 e  d; s$ V4 n, ?   }6 _0 T8 G- ~' }7 i

+ P+ i- v5 f1 n  |( U* r2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
  @0 K7 ^% w" [7 W0 FQuote3 }" N: @/ D9 K
//   6.acrxGetApiVersion
; d. s, K7 C! w" T# s; p   typedef void* ( WINAPI *PacrxGetApiVersion )();, A% L: Y5 x) L. t. i
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )% O; }' D9 n& w( f
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
, n) f- w+ a. {/ J"acrxGetApiVersion" );* \! F; K) T5 ^, ]0 g
% [$ X) z+ D( a; k( p1 c
3.从lib文件中获取,只有这个是可行的.: T+ [6 M; A( K/ k7 H2 n: F
#pragma comment( lib, "rxapi.lib" )
9 l& z& E3 G' W. ]  ?7 ?8 g0 F9 r& S- ?/ @8 x
定义这样一个头文件
8 L# h* L3 F* uQuote& i9 O- O! R" V
/*自定义CAD函数*/
2 ^0 ^+ u6 M3 m( Y; F% }- Cstruct AcRx {
, ?9 x, v1 t# Z5 A% T0 ~) i5 }( ^6 Z( k# H
typedef void (*FcnPtr) ();
( P/ t. f& @: H2 O9 q$ \$ J8 N
9 `  J' _* ]2 S1 w+ z; V0 P6 L( V4 }8 @enum   DictIterType { kDictSorted = 0,
! @$ C3 {" K+ l, y   kDictCollated = 1 };8 ~! b8 ], p) z6 n7 M, r
* r0 f# m/ ?3 {- S6 [9 h+ I5 |
enum   Ordering { kLessThan = -1,% |( u% a# Z) w
         kEqual   = 0,
2 q: s1 v; N3 P, Y# @% o, d         kGreaterThan = 1,
' z/ H% t* p4 [' f         kNotOrderable = 2 };" m8 k7 b4 x0 J- S

" O9 ^. `+ y1 L- K. N; D1 Henum   AppMsgCode { kNullMsg   = 0,
' t+ g: A; j+ Y/ r( W; n. M         kInitAppMsg   = 1,  q  N( \. V. U7 S
         kUnloadAppMsg   = 2,7 u# h. a' o3 x  ~" g
         kLoadDwgMsg   = 3,
, Y! H/ G4 }4 ]! _0 k$ E' B8 a         kUnloadDwgMsg   = 4,8 `+ P) u, @# s0 }
kInvkSubrMsg = 5,
2 c, M! F% f! @7 d" d. I, VkCfgMsg = 6,0 T# S  ~( g6 ?! R3 _( z1 D" |
kEndMsg = 7,& e0 Q% X2 u; k# w) r
kQuitMsg = 8,: V2 Q# s7 g" i9 I" A
kSaveMsg = 9,& p5 s& O3 f2 p  x  X
kDependencyMsg = 10,/ u* j! {% l5 {- h6 r
kNoDependencyMsg = 11," R. \4 Q# D9 N' N
kOleUnloadAppMsg = 12,9 l; ]  A% }( T( D5 W/ t
kPreQuitMsg = 13," c; l6 O4 f  X8 z0 }4 g
kInitDialogMsg = 14,
! h+ n" H2 f% R( f% rkEndDialogMsg = 15 }; 7 \3 G" ^* E6 m. p& w+ I

' X3 @& K) U7 o& k+ h# M. `7 C! T$ n3 A$ c4 I/ J9 N4 W4 A
enum   AppRetCode { kRetOK = 0,
' d$ l1 k# y! t& i5 d& L2 _         kRetError   = 3 };
  a' p8 F/ ^* G/ _2 A8 k};
6 P6 c; A7 O& I" j. f' f' u8 o8 \; D' _
#define RTERROR (-5001) // Some other error( t9 B9 P3 y6 g
#define RTNORM 5100 /* Request succeeded */; Z3 V6 @: C1 c$ w/ k, n

$ H& a4 ?6 a. n+ X7 ^' O//1.& E. A0 d8 [; I( o  C
HMODULE hDll = ::LoadLibrary( "acad.exe" );
) \* d  ]7 W6 I6 C9 H$ y6 R6 VDWORD err = GetLastError();* ]0 B1 T' J' c5 M" |
//2.int acedPrompt (const char *str);. [0 H# u8 s# y) b
typedef int ( WINAPI *PacedPrompt )(const char *str);9 a' S: p$ H3 S3 N0 J6 Y1 r
PacedPrompt acedPrompt = ( PacedPrompt )
0 Z0 \* i0 B3 z% L) d% ~::GetProcAddress( hDll,
1 G! R, N4 K. b8 L7 }"acedPrompt" );
% N& p# M' `7 q1 r: z# y$ a. T// err = GetLastError();
$ q) V% k! i. F//3.HWND adsw_acadMainWnd();! s9 \7 |1 E. N" @1 E+ D& \: X
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
* a, P( S9 L0 K8 i# u) X6 GPadsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
' W- `% w, I% z' U" X* U: }4 s::GetProcAddress( hDll,
1 b+ R7 z, x- K- v8 J) l4 {"adsw_acadMainWnd" );3 A/ e. b; I% I3 Q6 J1 L! k! z+ A
//4.int acedDefun (const char *sname, short funcno);" V) e3 ^) m0 V' ^
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
) \0 A1 c5 f4 R" Q2 LPacedDefun acedDefun = ( PacedDefun )' P9 ]/ y6 L* m9 d- G* p0 ]
::GetProcAddress( hDll,
9 D% T# l1 L. n+ a"acedDefun" );, d& A; f. d% u4 u
//5.int acedUndef (const char *sname, short funcno);
* o& j, q9 y4 i- i* ]* y; Ttypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
  R+ P' a' \# `: R; ^PacedUndef acedUndef = ( PacedUndef )0 s) I# K$ Z. k4 M) a
::GetProcAddress( hDll,7 J( U: Y, F# p0 H0 P* Z5 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 )

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