|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的4 J- j5 n9 Q- g8 _
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
# M5 P3 @: Y; r* {/ }对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
4 N' n% j9 y1 P9 v; l+ N1 ^
/ z+ k1 U- ]6 w+ P1 X, m+ u但是目前还是碰到一些问题,就是这个函数:% g2 ]! Z8 s. h: _: [7 x/ j( S
acrxGetApiVersion,无法获取其代码.
" N A/ r$ ?4 L s& a8 t5 f% d; e因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
2 z& A' l0 `) m. J- d1 L# R/ ]! @( N1 n8 n
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???2 D' k5 \6 ~7 V* k& i1 U/ |( Q
+ Y+ ]7 y! U3 A2 Q2 p
我试过了以下几个办法来获取这个函数的办法:" N1 B8 `" h6 [3 R+ k
1. + ?% s+ D9 S! a0 L; v+ h
Quote0 }6 E6 W: ?( c' @7 ` @
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.+ |) @0 X- p2 W1 s5 n0 C3 b! z# G
void* acrxGetApiVersion()& F8 d! | J7 l2 r0 W
{1 R' d1 @ Z$ p8 V) h
char szHello[] = "Hello, world!"; / \& U! `+ s# O! C3 O9 e. d
- u2 A# \( X6 @" u0 S! D! | __asm + R* q2 o M) m/ O& u
{
+ v9 p& W; k5 O7 F* D, z PUSH 0
/ f8 ?/ ^5 }# c PUSH OFFSET szAppName // 全局变量用OFFSET$ p& p% g; V/ g0 v. I& }5 G. f
// LEA EAX, szHello // 局部变量用LEA
D' g: H+ k/ [' L0 r! `4 l3 T- r, v// PUSH EAX
7 f- A. t% H$ C! B" v* ]' T. a LEA EAX, szHello- z# [" [8 g3 ?4 K9 [ }
PUSH EAX
& r' \8 f; u R' w PUSH 0
2 l& {! [& R8 [1 [% B: Y& t CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
/ b% [" J, Z8 y7 [ }
4 ]9 a+ J7 y. Y8 f) i! j0 Z: a // MessageBox(0,"asm","asm end",0); + e. i5 M" ~( t2 ~ i
8 b* Z# l6 ^* ^4 Z. y
FILE* fp; /*定义一个文件指针*/0 ^' Q7 G# ~5 ?% N
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/) Q: w% a8 a$ U2 A
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 3 n, {. x$ Q7 c9 J
fprintf(fp, "%d\n", 12345678);
: b9 C5 ?$ m* G/ r! KMessageBox(0,"fprintf","fprintf end",0); 2 \+ s9 l( I+ [7 j8 R" Q
fclose(fp); /*关闭打开的文件*/3 t; v$ }. d# j+ C8 O
0 V6 C0 B6 W& M4 L5 w// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
7 f+ T1 n) l6 F" |& breturn acrxGetApiVersion_Mid();, V* }5 t# {1 e" ^% @' i' T, _& B
}
) k" Y1 S, j, |# |5 H) Z& M! t1 P; H% ^2 d1 K4 G) _3 M# M
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
$ r. l7 M; g$ } zQuote
# D2 O5 B M' ?, u6 `5 F- o// 6.acrxGetApiVersion
( E% f9 H) O4 N4 O B$ S* \8 }1 X& b typedef void* ( WINAPI *PacrxGetApiVersion )();$ q5 i& C& r. p
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
' _) f: d& {+ J) x H% ]4 x1 X::GetProcAddress( : oadLibrary( "AcArray.arx" ),
2 G0 D1 q! T7 m* T- V"acrxGetApiVersion" );
, k6 ~! z: z8 O
+ S: n, A# q" p' J3.从lib文件中获取,只有这个是可行的.
) @& S2 C, D. ?6 ^$ W#pragma comment( lib, "rxapi.lib" )
& F- E! w; P: A2 r( Z/ x) Z* u1 |4 h4 e7 C+ s. o
定义这样一个头文件 3 W6 m& ] O! L; q
Quote
' D+ y9 \1 z7 [- q& _2 _/*自定义CAD函数*/) A2 P/ \$ W \# E3 ?3 M X5 d
struct AcRx {
+ N( o+ Y2 w$ t8 e0 u' }8 Y! W2 x+ w
' t1 x1 i# y4 [9 L! w& C) g6 z1 Mtypedef void (*FcnPtr) ();" q2 G) q2 P. @) Z+ k
& V& U0 i: |% r
enum DictIterType { kDictSorted = 0,
2 L v: y, L0 M2 s9 r4 E7 ? kDictCollated = 1 };4 Q& n$ @( ]* ^( Z
$ { h! h( h4 \! t* d2 Lenum Ordering { kLessThan = -1,
4 o( l8 {1 h; A' o kEqual = 0,
7 u: y5 F8 `: }$ q1 h8 p; ^ kGreaterThan = 1,
1 a8 x* \5 u$ R# K kNotOrderable = 2 };
4 Q$ T( d+ z0 w: D, t# T% q/ |' h
enum AppMsgCode { kNullMsg = 0,$ S" n" m( O! e/ N
kInitAppMsg = 1,1 i: A) p. Y+ V6 d. F' J' g' X& ^
kUnloadAppMsg = 2,
& \; \( v4 H5 m kLoadDwgMsg = 3,) D- r r! `* E* K2 p
kUnloadDwgMsg = 4,
/ K" B* \( j$ Q( _" C: ZkInvkSubrMsg = 5,! o/ d/ ]; [, h" o/ [& t- m
kCfgMsg = 6,, J- s0 F% @% I/ X# U( ~% ~
kEndMsg = 7,
( @+ W. v' O0 c' ]! Y M4 }8 e: k+ nkQuitMsg = 8,
- _+ B( J) p' \0 |kSaveMsg = 9,1 c6 I2 @" h% P: o
kDependencyMsg = 10,% z5 ?* s C3 R% O; m- q B
kNoDependencyMsg = 11,
8 E$ c8 Q. L' p0 p! ~kOleUnloadAppMsg = 12,! F; G- d2 a( g' u& j$ ]! C6 A
kPreQuitMsg = 13,) W7 y) S/ v5 o9 C! Z; H% P
kInitDialogMsg = 14,, L9 a2 Z3 c7 t0 F* O& w% _
kEndDialogMsg = 15 };
. t |% U! @5 e) H9 j! B
2 P N% |9 l- S# Y" I
. s& W' U( M! J9 }. l& u4 uenum AppRetCode { kRetOK = 0,
: h" Q+ { m" t8 G kRetError = 3 };
: R4 y$ H8 h' o% `1 A! W8 n5 W K9 x};
V/ V$ `! w6 e+ v* v. j0 E2 i: i @" v" J0 n
#define RTERROR (-5001) // Some other error5 u2 v# f- d. @$ O6 W' c% ]1 W& Z
#define RTNORM 5100 /* Request succeeded */, R0 @7 p5 o- }+ {' Y- N
- ^5 U, z& N- i0 l. _
//1.
/ s2 L. h; m, `HMODULE hDll = ::LoadLibrary( "acad.exe" );/ d7 a* X2 j. l" B U2 k
DWORD err = GetLastError();+ a& G6 K5 g" T5 G+ G+ f
//2.int acedPrompt (const char *str);
' i3 D# [, y5 _1 b1 rtypedef int ( WINAPI *PacedPrompt )(const char *str);
7 m$ U) s/ ~7 {/ U }PacedPrompt acedPrompt = ( PacedPrompt )
2 B1 f3 |: o- t' V( d::GetProcAddress( hDll,
. [0 y* W. E" @ w1 n( G"acedPrompt" );
5 [. n* N) L; ~1 y* E( e) v// err = GetLastError();6 T1 K: l$ X( `* C, ~
//3.HWND adsw_acadMainWnd();
# ]7 l& L9 P+ P2 Xtypedef HWND ( WINAPI *Padsw_acadMainWnd )();" L* W) k# i4 w' z: y" T$ S6 w
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )0 A. k& h$ n1 }6 }; q, w o
::GetProcAddress( hDll,$ b) Z; S7 E; v2 E
"adsw_acadMainWnd" );
; m8 o1 K" [+ n; U0 B//4.int acedDefun (const char *sname, short funcno);* J, h; q) A9 a" g
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);) C) B) C4 O( G) M! |& H: _" O, L. J$ d
PacedDefun acedDefun = ( PacedDefun )
( u9 ?" k9 J' U2 s4 n$ G::GetProcAddress( hDll, I2 R& ]1 w* F% @
"acedDefun" );3 S% [- _5 o; s5 C9 u' f6 k j
//5.int acedUndef (const char *sname, short funcno);; T4 Y# h& Q/ ~" D- d4 l9 l2 e
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);( i1 `& I. T$ f1 E+ J% z$ X
PacedUndef acedUndef = ( PacedUndef )' ?7 x" u; H: u1 {
::GetProcAddress( hDll,
: ]0 P4 E2 [8 s0 ` I, T! f/ D"acedUndef" ); |
|