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