|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的
* ~9 e' h$ @2 m; c3 Y# R通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
- a9 o; @4 t- [ e/ O4 I对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
T5 f# O- h( |( Y E% B6 \# @/ B, Q/ t% I% `# L6 m% p0 S
但是目前还是碰到一些问题,就是这个函数:
+ c, @( a3 [" K# CacrxGetApiVersion,无法获取其代码.
3 m9 E7 z/ U8 |) S, Y/ |因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
) i0 g o) K6 x5 L- ]2 \. L' ^
7 C' z d* @, c" j& o0 i3 \而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
5 |* j, Q6 W- ?3 B: F/ d9 u2 \* R E3 ~0 D1 M. t8 _
我试过了以下几个办法来获取这个函数的办法:; \# S: Y) j4 u3 n) J6 J0 @3 s
1.
9 B, y5 P5 m& C8 gQuote
3 J" b5 W# d z" o1 d/ x% t自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
7 y* [& a& c8 v9 g: P& kvoid* acrxGetApiVersion(): E7 M- J% L; O; f" h4 L
{9 o/ \4 F1 F' w/ K, {
char szHello[] = "Hello, world!";
, `5 k* g1 U) j0 y3 I/ x* Q2 d5 g/ ?. j5 Q* z, O
__asm 9 [ D( U7 P! o) N# z# u4 b
{ 4 q6 [! _: \- B+ d- o, j
PUSH 0* K, K! ^- M( {% @) ^
PUSH OFFSET szAppName // 全局变量用OFFSET0 W4 m2 ~$ Z9 L5 \; V* @
// LEA EAX, szHello // 局部变量用LEA
" W9 t" L" l; L! m9 U X- @// PUSH EAX
. M8 S: t0 P; \ B( S LEA EAX, szHello
4 a6 \" M9 R0 v1 d PUSH EAX
2 q4 p4 E% X! G0 L PUSH 0 : q+ T0 J R! _: q
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
/ G' T: r! b: l7 r ~9 a Q }
! `3 }) m% \5 U; x // MessageBox(0,"asm","asm end",0);
( [& M' K& F4 k4 o
6 J* d. ^) E; [9 Y6 z7 t FILE* fp; /*定义一个文件指针*/2 M* Q+ T) ?7 {; z
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/
/ Z/ N/ Q/ b9 w, Z3 F* M9 E0 wMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); ! n% O; ? L/ [, {$ ]/ J6 Y- I
fprintf(fp, "%d\n", 12345678);% {% K& z& m3 H0 v$ H
MessageBox(0,"fprintf","fprintf end",0);
1 N5 s( _: a6 V$ R; ~8 }) x fclose(fp); /*关闭打开的文件*/
- N) _# U; f. E8 m4 |' I/ W7 [4 w$ V5 E% n9 k! \
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 6 E6 ^! |! f" `1 I4 P
return acrxGetApiVersion_Mid();
6 U! z" L# T# q' _& m }# _0 K: [2 o0 b7 u; z: v7 r5 w* ]
7 x. L' S& {* Q1 S6 K
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
( a' l/ D' ]! QQuote
+ A! R4 `4 p- W+ Q s" k// 6.acrxGetApiVersion% i$ t7 o0 C* b5 a1 ~: }" Y! ~
typedef void* ( WINAPI *PacrxGetApiVersion )();5 h/ Q- y! O6 p* `
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
# g9 n) Y, r$ C/ i4 W::GetProcAddress( : oadLibrary( "AcArray.arx" )," h. A$ L" Z; A" O# @
"acrxGetApiVersion" );8 ^& s7 n! e) r- t! o# a
: s3 \+ c) A: C3 n$ P# x% K: A
3.从lib文件中获取,只有这个是可行的.
, ]" t z* h) Z% |1 f#pragma comment( lib, "rxapi.lib" ) ( K- k O9 r& A3 W7 `) e
% m2 { Q9 j: Y
定义这样一个头文件 # a- T. _8 g: A% i8 O
Quote
: p/ Q5 O6 ?( y( C6 G7 `& L1 x/*自定义CAD函数*/
. t" U$ `, ?( Y" B- D: O5 D6 ystruct AcRx {, g8 M' q6 k8 n4 W) Z$ J
& \% H- Q7 B& t% r; l) atypedef void (*FcnPtr) ();' q0 S) g- [/ I6 ?' U% }; u9 z2 d
- W! S2 ^5 @5 I2 V0 I8 s8 q
enum DictIterType { kDictSorted = 0,/ o! p7 i" i6 ~. a3 t# i/ u- s0 e0 J
kDictCollated = 1 };% F3 e$ ?/ T& u e& W. u
% U/ f! p" ?2 N! r
enum Ordering { kLessThan = -1,
7 e8 ^8 M# v, f" k$ l kEqual = 0,
3 V/ h! b, u" S6 ? n kGreaterThan = 1,
' W3 ^; H: E, E( b# {$ D kNotOrderable = 2 };
9 N. |! y; j. }; d: x
" e6 ^: y r& Q/ I6 Z+ jenum AppMsgCode { kNullMsg = 0,
6 N' i2 Q0 V" M3 b6 r6 ]. J kInitAppMsg = 1,' h2 ^/ B0 R H# S
kUnloadAppMsg = 2,+ j- i8 X+ ]( ]3 g) m2 {
kLoadDwgMsg = 3,
& _( u" Q: }+ O% Q: a kUnloadDwgMsg = 4,
% Q$ ~( L3 G6 ^* jkInvkSubrMsg = 5,
- O& v4 {. V6 t; ~2 ^1 BkCfgMsg = 6,! t! p) x; Q, n, W2 S) E7 c
kEndMsg = 7,
3 O w% B) B2 i# T& D. PkQuitMsg = 8,
& s, M0 m$ ~' O wkSaveMsg = 9,* @4 ?# {2 q, @# Y
kDependencyMsg = 10,5 z9 @: Q$ c: i
kNoDependencyMsg = 11,- }, d( r3 S5 ]2 |$ j, |
kOleUnloadAppMsg = 12,
; g( H6 l, r. h3 i& A2 kkPreQuitMsg = 13,
3 A G0 ?1 C% D" G8 \8 y+ S. QkInitDialogMsg = 14,9 e/ o& E+ A( _0 e
kEndDialogMsg = 15 };
, U8 f Q4 _! R* O( Q6 a! C' u' R n$ F Q) K& i
! V) Z; n% l# w( R( C2 V4 Genum AppRetCode { kRetOK = 0,# W% E7 k* A$ v$ e
kRetError = 3 };
$ ^9 |, O' L2 B};
1 e( X% g7 p) K9 }, P1 ^; A
* I5 c% L7 c8 d! D' I+ |#define RTERROR (-5001) // Some other error+ c$ A- G, e2 Y
#define RTNORM 5100 /* Request succeeded */
- M$ F/ m& ?( |/ c/ N
* @3 m" B- u4 V8 L( O# ^//1.
0 Q2 m' B. c) kHMODULE hDll = ::LoadLibrary( "acad.exe" );
3 U8 h3 R, E' z- C/ m: C- jDWORD err = GetLastError();" ]# c$ ^. Q5 W5 W: X
//2.int acedPrompt (const char *str);2 u! `" X- D0 e3 Y7 w
typedef int ( WINAPI *PacedPrompt )(const char *str);- j8 V+ Q4 D: Y9 X
PacedPrompt acedPrompt = ( PacedPrompt )
# q* i; a% k4 B! g. _, x: c6 c) r, r::GetProcAddress( hDll,
: g; m9 V6 F0 G* Z1 U( } t"acedPrompt" );
5 L# |, l" J; M& l( w! V2 b' V) f) T% S// err = GetLastError();) ^3 \ z( X5 P5 B. v5 R
//3.HWND adsw_acadMainWnd(); g7 X, h8 a$ v. H& J, B
typedef HWND ( WINAPI *Padsw_acadMainWnd )();$ y4 i. ]* R1 N4 n
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )# o: a" Q" G L: ^' o0 w
::GetProcAddress( hDll,5 f! V. v0 Q' p# y) ]+ P: V5 H7 u0 h
"adsw_acadMainWnd" );: S1 E3 ~; A& f) y$ Y0 g. |
//4.int acedDefun (const char *sname, short funcno);, r5 j7 d3 ` y: K( ~
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);# O. J/ v3 g# \9 W- _( f# n7 W
PacedDefun acedDefun = ( PacedDefun )* N- | g) Z: Q2 Z3 [. ]2 k- x8 P
::GetProcAddress( hDll,! N. P0 D; A1 S; p( m" Z
"acedDefun" );
& m, q! Z U- m//5.int acedUndef (const char *sname, short funcno);
% s( a: _- D! U; @" }typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
5 X$ e2 {7 H- h' ?4 B* }: `- w" UPacedUndef acedUndef = ( PacedUndef )
/ ^: _, q* c, F. e::GetProcAddress( hDll,
( \% H+ O0 Q: z5 k/ N$ ~# f6 `- p"acedUndef" ); |
|