|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的" C& ^; Y7 g8 \& }2 ?
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
9 d: h. R1 w4 U: H) I( U1 r2 t( ?对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
+ w2 J1 s3 q- W8 q
0 F- y' N2 T7 D4 g但是目前还是碰到一些问题,就是这个函数:
1 T0 s0 y5 e5 H" V( }! AacrxGetApiVersion,无法获取其代码.
* y) Z" D k) L6 [, B Z& ]因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.* s/ }6 W2 m! h1 ^% }' Q
, m$ `0 [, o8 Z4 i: i而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???6 O0 \, H6 F: ?% T" f4 b" g0 u; h2 }# r
4 D D, `* t6 y/ B
我试过了以下几个办法来获取这个函数的办法:- s2 r8 W! N# g# ~
1.
; [0 m, {6 ]2 wQuote. t: [2 J# Z0 i9 s
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.' |* f- t3 }4 ~+ l- g
void* acrxGetApiVersion()
) v. n! @+ b' w; D; d{7 B$ V* G: F: z9 H9 G4 G
char szHello[] = "Hello, world!";
4 w) L6 T: _( o; x5 H( p: n; t/ C
! A% }) k+ J5 O: B __asm
- Q9 H7 E( _" ?9 v! Z+ f+ H5 p7 ? { ) q Y% D2 |% S- B/ f6 l
PUSH 00 D( K3 `: V/ Y! H
PUSH OFFSET szAppName // 全局变量用OFFSET! y" H2 v) y- s6 B- _
// LEA EAX, szHello // 局部变量用LEA f; D/ U; o1 N9 X4 V
// PUSH EAX; r8 U; c+ k1 i1 v$ L+ l6 i
LEA EAX, szHello
; R4 g5 v. C- [5 ` PUSH EAX / P* M) O/ n5 {; g5 k! d2 Z
PUSH 0
8 l w- x. }5 M- N/ g& I CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
4 g `2 _. h. z- N* G1 Z }
& H. Q2 r) u, X3 H // MessageBox(0,"asm","asm end",0);
: O9 Q- N1 z5 F2 R! K3 ^. U- W
9 V2 _/ q2 t3 j: j; E" X FILE* fp; /*定义一个文件指针*/8 G+ [ U. x9 P& }8 G. M
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/
8 P. f y' L) `1 ]# w8 \1 p) u$ y) PMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
- M) R$ |- `! Q G& f fprintf(fp, "%d\n", 12345678);. O. h/ {( ~3 Z
MessageBox(0,"fprintf","fprintf end",0); : h u- t7 m8 H. L) j( w
fclose(fp); /*关闭打开的文件*/( F2 S- }7 w! I1 m3 ~
4 h, |; b) r$ [, \! K/ N- n& s// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); * d6 V) [6 |: a/ `
return acrxGetApiVersion_Mid();
7 `) r$ B. d# w3 ^- v# l9 N+ a }1 w) {/ N9 r& D6 n
& t! x* V! P7 E8 P! w. X
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. ( | M$ o0 `* {0 _% Y2 M, O5 @0 V
Quote
& G( A/ K t, H, K1 x// 6.acrxGetApiVersion3 p4 [, c* ~- e, y' S6 _
typedef void* ( WINAPI *PacrxGetApiVersion )();
$ N0 U0 A8 `- w2 Q$ N4 g6 zPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )9 Y l' R/ u: S2 t$ U% {
::GetProcAddress( : oadLibrary( "AcArray.arx" ),4 h( _1 J4 A% J5 t" ^/ }; @: t
"acrxGetApiVersion" );( t3 L0 s& v! a& m' P1 P
% ]& o& r; \ i9 T5 B
3.从lib文件中获取,只有这个是可行的.* Z. P4 F1 J! u0 ^! V: p
#pragma comment( lib, "rxapi.lib" ) 1 l+ o1 X- w7 j8 Q6 \
" Q' \- h4 J9 H" T$ t
定义这样一个头文件 ) @) }) |5 f. K0 g d. G, T. o
Quote
- x) @! z' z! Z7 z/*自定义CAD函数*/
* w; t) d |0 Fstruct AcRx {8 M; ~9 ^" S$ n9 ]: Z
! j4 [5 T+ c0 t: l" stypedef void (*FcnPtr) ();) z t/ t8 e- b* o8 q
2 `% @9 m' U/ ]7 h$ Y8 I6 |enum DictIterType { kDictSorted = 0,3 u3 \/ H# W9 R% C
kDictCollated = 1 };
# t5 q2 S* C- g S2 K T. V/ [7 f9 o+ o3 Q
enum Ordering { kLessThan = -1,; y l# v1 P" U. h5 g
kEqual = 0,
0 H: H# `: j! X9 k3 M9 K6 ^ kGreaterThan = 1,
+ f7 ^. {3 b# u3 { kNotOrderable = 2 }; I. w+ A5 R0 z i( d- O
2 q# `1 n4 _; F) q: kenum AppMsgCode { kNullMsg = 0,
7 O$ v- k+ D; J! r" f( h! C kInitAppMsg = 1,( a8 @! J5 L6 G2 T! ]0 V+ [+ k
kUnloadAppMsg = 2,( ~, P! n0 S) H+ f3 w/ w
kLoadDwgMsg = 3,
( _ ?6 N8 b# ]1 {, ^+ ?+ [ kUnloadDwgMsg = 4,
+ W1 N8 t# j |0 C' A# okInvkSubrMsg = 5,
7 V: U" O% D! W* [; f; hkCfgMsg = 6,
: t) t/ n- F" S) |7 G- q' x6 X4 VkEndMsg = 7,2 _1 H5 C$ U7 C& B- ^' }) C
kQuitMsg = 8,
! D2 F; v+ |1 w, h; ZkSaveMsg = 9,
, G W; q" w+ [kDependencyMsg = 10,
! F' { w: J4 A1 @4 C. vkNoDependencyMsg = 11,, o" B, A* _0 ]6 y+ m; E& n! Z% W
kOleUnloadAppMsg = 12,
( u& u8 h% Y7 J2 ~kPreQuitMsg = 13,2 P: N2 }4 | ^1 V, w# u* z
kInitDialogMsg = 14,+ @) ^7 {4 S+ L- X
kEndDialogMsg = 15 }; # [" O$ _ ]4 P. A5 c4 Y5 Q
Q6 B( k. b8 u" U6 T
1 A G3 j* Y" p5 w+ ]
enum AppRetCode { kRetOK = 0,) n3 N8 O6 \! Q+ F' E# X* {( E9 N K, X
kRetError = 3 };
, R* S! J& S! t, X- z1 j1 C};0 O3 S5 `/ ~# L7 R3 ~9 Q: W6 D- e
2 G) k4 l( R+ U# u% l& @$ J
#define RTERROR (-5001) // Some other error
# L! q8 c. [ c m! ]#define RTNORM 5100 /* Request succeeded */; L! ?( n4 E6 h) G* D8 g" a5 D
( D' |6 M2 ^6 O4 m, A
//1.
# w7 |/ V4 T3 b" FHMODULE hDll = ::LoadLibrary( "acad.exe" );
2 ]: _6 h2 A7 J3 @) o* g' Z) B* ~/ O: yDWORD err = GetLastError();
7 B" N" B1 P! [7 v1 f//2.int acedPrompt (const char *str);8 x* Q9 K# P5 G) r" q
typedef int ( WINAPI *PacedPrompt )(const char *str);
# H U! t% e) [* kPacedPrompt acedPrompt = ( PacedPrompt ): X0 z& \6 y. Z Q, @& l
::GetProcAddress( hDll,$ p8 R7 Q7 U9 c0 t$ C* c/ q0 N
"acedPrompt" );3 {- @2 ^& R* S. p: O& \3 V
// err = GetLastError();
7 G/ q' o) n+ ~# i//3.HWND adsw_acadMainWnd();' ]/ E: |7 S& U% }
typedef HWND ( WINAPI *Padsw_acadMainWnd )();0 I0 \/ x3 y, S
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
+ N2 \+ m0 A K* w* R: k::GetProcAddress( hDll,
1 ]2 w: `+ W" z# ]% X) e"adsw_acadMainWnd" );
1 F! p5 B( y* v$ X# e/ F9 p$ G//4.int acedDefun (const char *sname, short funcno);
2 a# e0 D9 @' E, r$ w' Rtypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
1 F H, j3 G/ SPacedDefun acedDefun = ( PacedDefun )
; S+ D+ h6 l9 Y" k' }7 O8 R::GetProcAddress( hDll,
, Z$ y/ R5 P u/ u"acedDefun" );
6 J4 q) z+ \$ X9 R: s4 Y//5.int acedUndef (const char *sname, short funcno);
) [5 f. v2 I: D8 G! Ptypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
; i# C+ ]- E: T( ]' K6 kPacedUndef acedUndef = ( PacedUndef )
; t" T8 Z, j* ~::GetProcAddress( hDll,
' `; E/ s, M& v/ l"acedUndef" ); |
|