QQ登录

只需一步,快速开始

登录 | 注册 | 找回密码

三维网

 找回密码
 注册

QQ登录

只需一步,快速开始

展开

通知     

全站
7天前
查看: 3503|回复: 1
收起左侧

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

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

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

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

x
在网上看到的# v4 K& D  R- N+ @& K4 e
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址," I% M; H) r# L- w" X0 a; {2 @
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.! F4 |- ~; C9 Z

2 C  K, e! e5 w7 \4 Y但是目前还是碰到一些问题,就是这个函数:
0 a( H/ v- P, xacrxGetApiVersion,无法获取其代码.
: U; |7 j. c2 ]# W因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.; n# S8 k% o5 w. R( P

9 |! f1 `, |3 s$ X2 E2 W而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
5 V; _0 s5 C& n; B7 C: l' ^1 p' d4 R" X8 n; R0 \* V
我试过了以下几个办法来获取这个函数的办法:, h0 R3 y: b# d
1. + t- @/ e' L$ z8 M* p4 o
Quote( W( H4 h, I: R& m8 Y1 y' q
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.0 _7 X. w& o0 u: m( a7 B. `
void* acrxGetApiVersion(); W* Q1 E3 H# c3 Q* r9 N
{
' A6 L) Q0 q: K  Q9 L     char szHello[] = "Hello, world!";
+ ~2 [. b6 j' v, c- V
4 }- J( p$ M9 |$ @) c1 C   __asm
* i" L  E- M% S' o. O7 \  p4 @   { 5 o' a' j# T) V7 Q
     PUSH 0
) y+ B% j9 z5 V' W3 U       PUSH OFFSET szAppName // 全局变量用OFFSET
5 ]; c1 Z) M/ ~1 n- `1 p7 H//       LEA EAX, szHello // 局部变量用LEA
2 H6 m9 ~; x  f! P! m2 o//       PUSH EAX
' [4 ]# C! r# F6 X+ ~' h# h  g9 m# L       LEA EAX, szHello
+ }/ [# s( p) m+ X% Y       PUSH EAX
  g5 @- W- U; x* n* a       PUSH 0 ( Q" y/ x* w" t$ ]2 ~- h0 F8 k7 V
       CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA7 t  t7 D; L' }7 Q3 A) u
   } / L* F# ]3 k3 |% m2 p1 y
   // MessageBox(0,"asm","asm end",0); ) A  o0 F$ X* e2 o% _) z

8 L) r/ R! \- t   FILE* fp; /*定义一个文件指针*/
0 v$ z# u" Q, n. N* o1 K- V! m5 Y   fp=fopen("d:\\CLIBt.txt", "a+"; /*打开当前目录名为CLIB的文件只读*/6 ~5 B$ v) B7 `8 r
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);   7 u3 J/ z# {( i5 W2 S
   fprintf(fp, "%d\n", 12345678);6 g) `8 T% P/ F( G$ a4 U
MessageBox(0,"fprintf","fprintf end",0); 0 s; r) ^7 z( O' d( U! X' P, Q+ g
   fclose(fp); /*关闭打开的文件*/
7 w! b5 T) d# M* q  f3 U& o" I$ ~1 B3 U1 ^9 Y
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 7 P( |+ |3 P' J, i) E0 K; `
return acrxGetApiVersion_Mid();* P  f. L% a5 C' z6 K7 D
   }
6 B3 e# N" o# x5 q. n* A: r3 @1 p) h' P6 X% }8 H' ?2 G( Y
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. 9 N! J" }$ E! ~; J1 I- V2 s! K
Quote
3 \+ z6 Z. `# N1 J& h//   6.acrxGetApiVersion- o+ l8 C  p0 b. W  _7 d* v
   typedef void* ( WINAPI *PacrxGetApiVersion )();! ^$ y) j6 `  @1 X
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )5 \8 o* |, z- ]& i, J
::GetProcAddress( :oadLibrary( "AcArray.arx" ),
  o0 B2 G$ f6 t* i$ D"acrxGetApiVersion" );5 @1 I% @5 }2 u! R5 K

1 y* y' ]+ V5 {3.从lib文件中获取,只有这个是可行的.
- c3 u6 ^% L$ h( J4 f- d#pragma comment( lib, "rxapi.lib" ) 8 c9 m6 P+ ^4 B6 P' a  L
  n6 |* v: z; C7 l# ^4 \$ K/ l
定义这样一个头文件 ) V5 t8 ~) ?4 u! O$ I9 K# P- U; G5 L
Quote4 t' h( U: `; H* N
/*自定义CAD函数*/8 r- f- Q& b: R1 D& `
struct AcRx {8 Z( H6 v( `' p$ q2 Q; P

% f! a) a$ _  v2 X( M  itypedef void (*FcnPtr) ();8 e) f- q' M9 V+ c5 l

) y0 N" p  [. d1 ^0 J( L: qenum   DictIterType { kDictSorted = 0,: I; g- y* d+ q) _# I/ s
   kDictCollated = 1 };
& J8 K) f& i- m9 t  T, e; R) t1 b0 i0 W& ]) |$ c1 o( T4 @
enum   Ordering { kLessThan = -1,) R1 s( F/ F" m& ]) j
         kEqual   = 0,
6 l# [$ j; U  x% V3 e         kGreaterThan = 1,
: R9 h9 d  [- V, A% }         kNotOrderable = 2 };
$ K& ]/ v- p$ G: ]$ D8 ]9 G9 b% G/ N- y7 X0 |. |1 {
enum   AppMsgCode { kNullMsg   = 0,
6 `4 w! E* `& b/ p! V* Z% V3 m         kInitAppMsg   = 1,
. C: i- y( E5 ?         kUnloadAppMsg   = 2,5 V5 A- W, _+ q
         kLoadDwgMsg   = 3,' I- I* l0 M  G, ?* t: ?# ?
         kUnloadDwgMsg   = 4,4 O0 E& ~3 o$ j, q6 l
kInvkSubrMsg = 5," C+ E% _" {: s" a! k
kCfgMsg = 6,; @$ M( R9 p( {# b8 o; u, m
kEndMsg = 7,
8 ^, G. t8 F/ f' @0 NkQuitMsg = 8,  ~+ F: S& y6 H# z
kSaveMsg = 9,; i' l4 E7 _  U# O* p
kDependencyMsg = 10,
7 [0 Z2 _% |0 C0 L. U0 d# b1 UkNoDependencyMsg = 11,
+ T) E0 T: {* ukOleUnloadAppMsg = 12,
' j% Q2 M+ @+ R  _0 ?5 `kPreQuitMsg = 13,0 Q% ], l) }" g5 B
kInitDialogMsg = 14,
5 L. O  G1 W0 t( C7 k) zkEndDialogMsg = 15 };
% I$ u/ y% x* d/ g# |/ s8 l6 m) A8 C4 n2 r: I, f5 Y

1 A( I) }8 C# ]enum   AppRetCode { kRetOK = 0,
  P5 r' y1 X) x4 b8 u3 E% [         kRetError   = 3 };) C) j# ]2 k3 d7 |6 G% `
};
0 q& d& _% ~/ g! o4 X6 M  k
; E( f6 m$ i4 I. u  f#define RTERROR (-5001) // Some other error
" o* T+ y8 B$ F: z$ o; Y#define RTNORM 5100 /* Request succeeded */) e3 U8 Q  |; Q% X

, S( D4 x& _$ c$ x//1.) t* O) k/ d4 n( S8 J
HMODULE hDll = ::LoadLibrary( "acad.exe" );
, K- z1 q9 V, }7 a  I, D9 r+ hDWORD err = GetLastError();" {  q6 q  e4 ?( v, ~  }- r
//2.int acedPrompt (const char *str);
3 V+ n# W, \- H  s1 xtypedef int ( WINAPI *PacedPrompt )(const char *str);$ B8 m2 B1 [. l. g& c
PacedPrompt acedPrompt = ( PacedPrompt )  F/ w( q9 b4 ]# i! R
::GetProcAddress( hDll,; m9 b! Z! V3 \: O, ]/ v
"acedPrompt" );( H. K5 @' t& i+ F
// err = GetLastError();
% d: R( I. q; ~, o1 I; \//3.HWND adsw_acadMainWnd();& z" m, m4 T8 g9 b5 @
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
! R+ [( T$ c; W, ~0 [Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
1 q: W7 o1 [) T::GetProcAddress( hDll,8 k$ y+ o5 I0 a8 n' g5 q  r* p& J
"adsw_acadMainWnd" );8 G3 `, u; K" P; w
//4.int acedDefun (const char *sname, short funcno);
* g7 D8 Q# O+ ?typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
; U/ d) s0 p8 P2 d6 A1 NPacedDefun acedDefun = ( PacedDefun )/ X+ S0 O; ]8 F; D! E4 \
::GetProcAddress( hDll,
. ~$ g" R7 Y8 O"acedDefun" );& L2 |' a4 D) j4 C; T- u7 a
//5.int acedUndef (const char *sname, short funcno);
4 _# P7 Y. j% r, ctypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
7 C( o% l. q' z, O) L* ^PacedUndef acedUndef = ( PacedUndef )
9 E* e! I& I2 c::GetProcAddress( hDll,
) y+ m1 b( W& e/ ?6 r"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 )

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