|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
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" ); |
|