|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的1 X* B* c n3 y9 C
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址, f2 A9 T' P1 v
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
! l, D- Z" @# [2 r O5 ?: F: w1 }! A
但是目前还是碰到一些问题,就是这个函数:
0 P" L. f6 j) H: C3 |* u# h8 |acrxGetApiVersion,无法获取其代码.* O8 ]% y4 {( R0 a
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.5 M7 f# i8 N. L2 r) B
# `) s4 P) o: y# I) w+ {
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???. N: k- y2 t2 K$ G. [2 t" R% H3 W
2 ^: W n. r, ^& h4 ^; a
我试过了以下几个办法来获取这个函数的办法:
" Q/ y0 s7 r- _5 W, j. g- w( `1.
. |3 |. e# k `7 @; Z+ ZQuote
6 G2 \9 p, [9 k5 M自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.1 }/ Y. E9 { Q6 }$ T: U z$ e" m: q
void* acrxGetApiVersion()/ \. }, @, D: v/ x( Q
{
8 {4 K: X7 V' R! \5 u3 t) } char szHello[] = "Hello, world!"; : \6 x- _) T# k+ J5 ^, |" {
/ J# O; l7 [( A& P& Z! c$ U __asm
& C6 R0 I& c# o7 W$ f! f0 ] { 6 P+ K. p \: U
PUSH 05 {8 w: P5 D- b% C) m
PUSH OFFSET szAppName // 全局变量用OFFSET
1 I6 I% j& [ y- c% G// LEA EAX, szHello // 局部变量用LEA) X0 c6 `7 \& Y& s1 ^2 O
// PUSH EAX
- u% _1 ^& g& W LEA EAX, szHello
: h7 K" q5 S# s5 h PUSH EAX
6 }1 t1 ?* O% m+ g& L7 d+ Z) J PUSH 0 1 z( Q) U/ o& o5 E. u% N
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
' o" T4 S+ E5 X# q0 w } ) |5 j6 k0 j% }, i8 p
// MessageBox(0,"asm","asm end",0); - q% ^4 A5 j) f
' f. I& ^3 E+ A5 b8 }
FILE* fp; /*定义一个文件指针*/3 p' h% S1 [$ g
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/
6 x9 } |2 {( t- C6 zMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); ) L" Y) V z( E
fprintf(fp, "%d\n", 12345678);
/ P; V/ ~! m+ U6 a, s8 }6 [MessageBox(0,"fprintf","fprintf end",0); 5 f# T$ v4 H7 F0 j p% j5 x8 e
fclose(fp); /*关闭打开的文件*/
F6 T& H e6 L" v' D9 ~& |
7 b" C! P# v6 H) z0 _& N" |0 v// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
& \, i" a5 }- A1 h# ~( B6 g- mreturn acrxGetApiVersion_Mid();
+ s4 Y" ^' P2 g }- p, W a2 _/ h# d" b H! I
1 [+ Q A) a* S0 y T
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. + j0 e9 Z, O/ Y" ^9 k
Quote, V2 B# a& c) ~9 M! r9 Q
// 6.acrxGetApiVersion
3 i! r4 }7 L2 a) R typedef void* ( WINAPI *PacrxGetApiVersion )();
6 h3 S6 J q. T }. JPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion ). x+ j1 [3 o$ n
::GetProcAddress( : oadLibrary( "AcArray.arx" ),
R$ g/ g9 \. N, O& t2 o3 x"acrxGetApiVersion" );, z5 p. N' m. Z; C
! _& s. [9 {* q; M' }7 S' E3.从lib文件中获取,只有这个是可行的.
' b2 c6 F! f2 k; v, k$ o9 L7 x#pragma comment( lib, "rxapi.lib" ) n! j1 u8 v6 k9 @6 n* s
. C3 R! d" l. a. [
定义这样一个头文件
! V+ w i: K: W- D% CQuote
) z* A6 C- T' @0 W3 \+ W) z+ t/*自定义CAD函数*/. F& K! k* n8 [7 X
struct AcRx {
: @3 R2 D" F5 q% h
& _: O' _% I' R' h& j9 itypedef void (*FcnPtr) ();
. l2 J% G/ u* B. @
; M2 |1 G' D: n) I; r0 y u7 senum DictIterType { kDictSorted = 0,1 O5 Y' s* n+ Q& g! Z
kDictCollated = 1 };4 b2 t6 X. c; j4 N4 @3 i
1 z( z4 i0 c J, Zenum Ordering { kLessThan = -1,3 C" J# w( y7 n! z3 s
kEqual = 0,6 ?7 Q& V% _- y
kGreaterThan = 1,
9 ]$ ~1 K) s/ Q kNotOrderable = 2 };
) r! q2 m6 s, j$ P9 J5 c) n4 A
/ X6 m7 W- w6 I: y: n4 T; Yenum AppMsgCode { kNullMsg = 0,
% X, a. ?7 W2 p, K1 `! } kInitAppMsg = 1,
2 A4 @& t1 J; K$ U3 v- z kUnloadAppMsg = 2,4 r/ u1 m9 Q: _8 ~2 L6 @* Z7 L' F2 {
kLoadDwgMsg = 3,9 d& _6 Y9 Z8 l v
kUnloadDwgMsg = 4,' H1 A1 r# D0 Y5 S* ?
kInvkSubrMsg = 5,
2 N/ t$ M( @& l* C( h6 r3 m7 H2 pkCfgMsg = 6, t# K/ J8 S/ t, T
kEndMsg = 7,
0 E: d/ H9 l0 x. x* H& F/ PkQuitMsg = 8,
) I* p$ B( n3 `: j9 N% EkSaveMsg = 9,
5 p1 S) {" M- w: Z8 }: ckDependencyMsg = 10,
- k9 ]# ~+ q% z% N( t/ n. C- z" skNoDependencyMsg = 11,, Z& Q0 V7 d$ Q0 _" `: J- o- i* m
kOleUnloadAppMsg = 12,
- J8 I `2 L" x; t1 mkPreQuitMsg = 13,
/ _4 q+ l& y n* LkInitDialogMsg = 14,
5 g+ e# f" ~( B' U# b1 HkEndDialogMsg = 15 }; 1 ?) L+ I* t2 A/ J: S$ @
* N Q9 o8 S2 F+ {% Y% u
2 `$ ]- ` @) j$ S2 g3 U- P7 V" e& Kenum AppRetCode { kRetOK = 0,
& I5 M* z4 o0 V- q kRetError = 3 };
: H1 k4 p; T; O& L0 X$ d};, t( Z. ~; Q+ C+ ]0 ]# r: U
O( h+ S" C! Z
#define RTERROR (-5001) // Some other error
* m7 ^; A$ S, S A) F#define RTNORM 5100 /* Request succeeded */
" f0 ]- @" K* v0 s. }6 K' c1 }* ^9 m9 K0 D9 `
//1.4 h. r( s* G) L. X0 X/ m: }7 n
HMODULE hDll = ::LoadLibrary( "acad.exe" );+ N4 h8 n2 o) M4 ], P2 K5 F
DWORD err = GetLastError();0 ], U, @, h/ }8 ?1 r9 Q
//2.int acedPrompt (const char *str);! C% h' i* E! [7 k
typedef int ( WINAPI *PacedPrompt )(const char *str);0 x+ ]. D. E. A
PacedPrompt acedPrompt = ( PacedPrompt )& `$ u. k& Y+ K) ~; z1 b# s
::GetProcAddress( hDll,) A* j% O) I- R* t+ |
"acedPrompt" );
- @* [# V! o: x, n8 c z// err = GetLastError();* s$ D( j- s) y8 b& B8 |
//3.HWND adsw_acadMainWnd();: X! Z' z* E C* q0 `' {& w) K# P* [
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
$ a1 F; z; i' F9 c% ?- B- gPadsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
- ?. y5 q. U" m! ?::GetProcAddress( hDll,
8 J9 c: E6 n+ A"adsw_acadMainWnd" );0 ?0 ~. F. v" h# S4 M8 O
//4.int acedDefun (const char *sname, short funcno);
; W5 Y9 m2 C; T, Ktypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
/ M& r' @. V& Q- d7 n- gPacedDefun acedDefun = ( PacedDefun )4 N" y3 ]7 _) A0 n, l8 L: d/ ]
::GetProcAddress( hDll,/ l' ]) j% L4 @- K$ q. n
"acedDefun" );
% [, m+ F& V6 d! w0 L$ i- u. G//5.int acedUndef (const char *sname, short funcno);
0 {& n7 S2 w( C5 x8 Mtypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
! ^& ~: A! m9 j' [4 ]PacedUndef acedUndef = ( PacedUndef )
) e3 }5 b- ^: s# [8 G; K::GetProcAddress( hDll,4 x' o& L. D6 K' Q
"acedUndef" ); |
|