QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

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

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

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

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

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

x
在网上看到的: x/ l3 F6 A3 h
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
( Q/ {0 n6 X9 }对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
$ Q5 h6 X  ~" {4 X2 J& x3 t1 Y" O* `1 Q2 @9 z# j
但是目前还是碰到一些问题,就是这个函数:
, m% G/ |  {" M  j( t' ^* ?acrxGetApiVersion,无法获取其代码.) e1 F$ R% W+ g, D
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
# M- d/ }; t( U+ f4 m  s4 C( K* P. i8 v  c5 F  l
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
5 S! a6 L7 _% V. W- n6 K8 `" S$ p" M
我试过了以下几个办法来获取这个函数的办法:
! f( Q( {% j" p3 w& o( X% \1.
( t5 D  B! }- {8 }0 N+ yQuote
! h) _* k3 G' Q4 B+ q- o4 x: p: X自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
2 J$ E; \, Y" c* M2 J5 Zvoid* acrxGetApiVersion()0 M( X* D8 H) X* Y! L- ?% `
{
$ X' r% C- d5 D2 l/ }  v3 C     char szHello[] = "Hello, world!"; ; r1 Z* E1 Z) R1 C3 M/ i5 _
  _6 C* O- S5 D
   __asm
+ Y' x# Y# e1 N( l. h7 G% N& Q   { $ P2 h/ D2 j% A; j' Q+ k
     PUSH 0
( E( ~+ u% u  Z4 y" a+ k# d       PUSH OFFSET szAppName // 全局变量用OFFSET
1 q: s/ G1 Q/ K) N7 ~//       LEA EAX, szHello // 局部变量用LEA
* @, T" p3 d4 @3 Z! Y//       PUSH EAX9 [8 A7 m$ i- `* D8 S4 {" k1 U8 Y+ G1 M) p
       LEA EAX, szHello9 g/ N$ `" u: n: T4 P
       PUSH EAX ) Q. b1 z& }, O- W4 |
       PUSH 0
% Q5 K# D0 l* R9 }9 E# S       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
! N" \( `' B2 I8 _   } 0 O/ x" \$ u9 g, D, L6 f( p
   // MessageBox(0,"asm","asm end",0); + O. n+ A0 q0 {$ ~. U
: Y! f! r3 U: x5 n7 Q
   FILE* fp; /*定义一个文件指针*/. F: r, y3 y6 T2 E
   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/
! |+ ]/ X7 [9 l0 WMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   * ^5 `5 Z  C$ Z
   fprintf(fp, "%d\n", 12345678);
2 G) ]; ?" t8 m% C/ f& nMessageBox(0,"fprintf","fprintf end",0); & z, }: Z8 f8 j
   fclose(fp); /*关闭打开的文件*/* H( _, v' b* S$ v

$ E; f" V8 M2 M) g, q- G/ R// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
& P) Z1 c' v, u5 X( Creturn acrxGetApiVersion_Mid();4 z$ D& r% ^. {( F8 c' U  D, n0 R
   }
; u5 C* Y  ]- P7 i9 A* G2 a7 T% Z+ G5 x1 _# Q
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
+ J" `3 |7 C# F  ^% {6 s  nQuote1 p' G; I( i. i' f' g  Y
//   6.acrxGetApiVersion
3 U% }; e" F; |  ~- s% e& c% s. l   typedef void* ( WINAPI *PacrxGetApiVersion )();3 z. _0 J! O4 ~; n
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
. d  a9 y+ s! G3 U, j: b! C::GetProcAddress( :oadLibrary( "AcArray.arx" ),% f2 {8 ~2 ~3 ^
"acrxGetApiVersion" );7 Y. \( i' o7 A/ \

' f* p  [- s0 l- z: z3.从lib文件中获取,只有这个是可行的.5 |0 K8 I& L- @2 X* I
#pragma comment( lib, "rxapi.lib" ) ) E& P$ x4 q4 v& |) R5 U! H& n

+ c2 Z& w: W0 O  I  ]定义这样一个头文件
  F- w% A& r1 y4 C& K  yQuote
, W# i: Z1 \3 f: x% g/*自定义CAD函数*/( I/ G+ [' s/ r$ e& |+ X
struct AcRx {: H; [5 j9 \. `

' e3 T# _# T3 vtypedef void (*FcnPtr) ();2 W& i, o" f! P1 S- O8 l

6 Y9 e/ r' n# ^% x) T6 s* j1 qenum   DictIterType { kDictSorted = 0,, G* ^* [6 K+ \5 C6 S$ V& Y
   kDictCollated = 1 };
4 ^6 [6 E8 F5 D  z; b- O+ r
2 X/ G/ f9 |5 K2 eenum   Ordering { kLessThan = -1,
9 ~% U  v/ U+ G- n$ [& e         kEqual   = 0,; c8 ~0 j& h9 A6 k* ~/ D- y
         kGreaterThan = 1,
) p7 t5 u! g0 I) r4 A) p  b         kNotOrderable = 2 };* l: W7 ~/ m& w1 f( ?7 P

4 x: x! O, E8 e9 e+ y: t, ?enum   AppMsgCode { kNullMsg   = 0,  h0 j( P# y" ?$ z  k
         kInitAppMsg   = 1,
1 w, a4 [+ r, P+ w1 O         kUnloadAppMsg   = 2,
9 F, T0 B$ ?$ U1 t% W3 b         kLoadDwgMsg   = 3,, E* h6 ?5 o  I" {( V  j1 L
         kUnloadDwgMsg   = 4,
! d& y7 c1 k- ^) i6 dkInvkSubrMsg = 5,
6 B" U0 Q7 }  bkCfgMsg = 6,
' \/ b$ x8 ~& B9 X  t% rkEndMsg = 7,
9 t* X4 Q4 w; ~/ ~- XkQuitMsg = 8,
! E+ U1 ?2 x) J$ S2 Z; K) O2 vkSaveMsg = 9,: P1 [/ ^! P8 I  f2 @
kDependencyMsg = 10,
) i% \. q, t" K% BkNoDependencyMsg = 11,0 V/ u" d6 q/ v( ~9 R9 S
kOleUnloadAppMsg = 12,
1 h) o' Q& Y9 {. w8 B5 o. `1 RkPreQuitMsg = 13,
& P' K- j/ q& }1 N; vkInitDialogMsg = 14," k  B, C& v7 M; V: L. e
kEndDialogMsg = 15 };
* k& E# |* C0 |5 S# R, ?
; Z/ u7 z- N3 _% j5 G) q/ P& W3 s2 Y6 q. e# K4 \9 G+ G
enum   AppRetCode { kRetOK = 0,2 i2 G% Q$ f0 x5 }& }# t3 a  f6 }, {  E
         kRetError   = 3 };
8 e* {% T7 t- M};. W; M' L, ]. s+ ~+ Z
" O7 d6 x! O& H  K. A$ Q
#define RTERROR (-5001) // Some other error0 Q. K6 M- e, U& w
#define RTNORM 5100 /* Request succeeded */
7 ~2 z% f0 Y8 _8 r5 Z+ {) G3 F
$ N7 e+ U7 [  P, f8 E//1.
  f+ ^6 i3 A9 W2 Y" o3 GHMODULE hDll = ::LoadLibrary( "acad.exe" );
  }9 O# v2 D/ t# O( e2 _7 aDWORD err = GetLastError();- ]8 p8 o% A- i6 o8 Z; G$ S% \' y
//2.int acedPrompt (const char *str);/ B: {4 C9 Z( R8 v
typedef int ( WINAPI *PacedPrompt )(const char *str);1 A8 g1 B% R0 [6 o7 N+ H
PacedPrompt acedPrompt = ( PacedPrompt )( \1 S6 u  n" X
::GetProcAddress( hDll," E0 {7 B, r) g0 I
"acedPrompt" );8 e) I  z6 ]/ |1 r: H
// err = GetLastError();& g, W1 d* G6 Q
//3.HWND adsw_acadMainWnd();
! R& S, A5 F8 D8 J7 Wtypedef HWND ( WINAPI *Padsw_acadMainWnd )();3 G2 p9 t9 d- a! Q' n# T
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )9 ^8 z4 g% t+ N
::GetProcAddress( hDll,
) ]( O! Z7 C- u* V"adsw_acadMainWnd" );; a* e. [1 t* v& e' G/ |6 T9 `+ l
//4.int acedDefun (const char *sname, short funcno);
. Q: a) n! T. M, Q) utypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);4 J6 C! ]& k- o! ?
PacedDefun acedDefun = ( PacedDefun )
6 `4 u; x% L3 B) p2 n  k& ~' E::GetProcAddress( hDll,1 n9 g( y3 T+ {9 Q3 @
"acedDefun" );& F0 k' s' t9 m; m7 I
//5.int acedUndef (const char *sname, short funcno);. M. Y% T9 N0 J6 |  h  {
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
; Y. H3 W, S0 w2 L4 rPacedUndef acedUndef = ( PacedUndef )
# \8 }4 G$ I* U9 x' L$ Q1 `7 E: q::GetProcAddress( hDll,/ Z5 P+ S" m5 I- ?2 S
"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 )

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