|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的& f3 R- q) Y" t a: e
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
: H6 z2 Y' T3 S8 ?9 D- ]. X) {! `对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
. x0 Y- A0 m. N7 b% G) t2 |) k9 G; | S0 n$ C5 i
但是目前还是碰到一些问题,就是这个函数:
% J+ B7 @0 S( u- {9 SacrxGetApiVersion,无法获取其代码.
1 w0 ?& o/ q) x6 a因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
+ u, R2 g: X: ]$ P# S+ W* O8 |8 Z8 k' X+ t* N
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
n0 Y" _) H, b$ |' c2 [+ I2 N2 g6 ~5 s$ U, Q: @: w1 R/ ~. T
我试过了以下几个办法来获取这个函数的办法:" o% [0 `: ]. m6 J1 H( \$ D' S' C
1.
' W: m, |: l) }1 m* x2 q8 sQuote
, E# J1 L4 e" h( p5 t- [. Y8 O% K自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
|0 B) v3 X, r6 lvoid* acrxGetApiVersion()
8 D0 T1 R# A/ [4 Z4 H{5 K U# z! {) i; j& }( B" J
char szHello[] = "Hello, world!"; , W6 K" l+ g' o9 g9 c
! X" U1 H* b9 S$ U( h
__asm 3 M: O4 W0 b3 ?$ Z, n; R7 l! o
{
) q8 z! a0 W6 h, U/ ]% T1 H9 p! h PUSH 0
9 R! ]- R, J, U* _# u( Z PUSH OFFSET szAppName // 全局变量用OFFSET
" u Y0 v% f: {// LEA EAX, szHello // 局部变量用LEA6 |- n. u4 x4 \9 A6 Q( G2 K7 g5 X' X
// PUSH EAX. U* s( R/ Z, E( h$ f. S* K
LEA EAX, szHello
7 w8 j! C" p8 h" M1 x PUSH EAX ) h" A' z! [ W7 h! ^
PUSH 0 + h) O, T. g3 m5 i H* [
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA! E4 g% L6 Q5 m; t
}
t$ g x( L g' C! Q3 V, x* f // MessageBox(0,"asm","asm end",0);
, A1 I* V; A1 j. z& i; h: C) H6 n6 P% }2 v
FILE* fp; /*定义一个文件指针*/& n% H* _' V) m' W. F
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/
* B% {8 h" c+ ?- Z& D7 k* uMessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
2 U0 j. Y* S. K" c8 E fprintf(fp, "%d\n", 12345678);. K- p+ J8 g- o$ A; t
MessageBox(0,"fprintf","fprintf end",0);
: R) q# T) }1 Z% U7 u fclose(fp); /*关闭打开的文件*/
2 Q5 Q) }' U% v' P. F! x) m) T7 G" M( _% @' S$ `* g2 U% F
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 5 @* }' H. N0 E
return acrxGetApiVersion_Mid(); Z7 [- m6 \! _( ~+ e
}
+ t- r+ y1 _# e6 `0 j3 a, b$ ^* ^) n' {3 t L
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
3 N' T3 N# L: }' _8 V* {$ g8 WQuote
& @1 | b6 L2 {8 _6 u( G6 J, D0 E// 6.acrxGetApiVersion9 F' a' q: @6 w% W6 X: O
typedef void* ( WINAPI *PacrxGetApiVersion )();; T0 d6 Z8 x4 G; m/ x2 V5 p
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
. x1 }# T+ g7 c1 j::GetProcAddress( : oadLibrary( "AcArray.arx" ),
2 Z/ j$ ]; ^ I0 f# H( e"acrxGetApiVersion" );
# E2 L+ H1 T/ `; G, d Y
' z# @& H8 J6 b5 [* _3.从lib文件中获取,只有这个是可行的.7 r! M) p, ]1 j, c
#pragma comment( lib, "rxapi.lib" ) - p5 y4 Z0 E5 p6 S1 @$ Z+ |
- { O6 p, U8 x7 K, J$ C2 E; s定义这样一个头文件
/ I; ]* n8 B6 |' KQuote3 I J! p8 F/ {3 f9 Z' d
/*自定义CAD函数*/
4 O: Q& U% o- R. C; ~ `struct AcRx {2 Q7 L4 z7 j9 ^ M8 @
1 f4 Y {5 w! l
typedef void (*FcnPtr) ();+ Q T, N+ ^: E2 e
8 n N2 j- l5 U+ B& n3 b/ Nenum DictIterType { kDictSorted = 0,
/ k2 T+ D7 f) l9 j" k9 C3 C kDictCollated = 1 }; f) N4 g& V; q% I3 x2 t
, B3 H2 K% G5 venum Ordering { kLessThan = -1,
F4 v& E9 O0 l; W kEqual = 0,
: R; J" H; ^# A" h9 p kGreaterThan = 1,
( J) \9 v+ a) I# a2 c kNotOrderable = 2 };+ Y7 h! l! c# |3 x: T$ x* m6 Z
3 M: C& D; \4 F% {; X0 J, tenum AppMsgCode { kNullMsg = 0,
! y; D, {; e4 f7 }- M: _2 \ kInitAppMsg = 1,, h* D# s+ ?# c$ Q" t6 S3 D
kUnloadAppMsg = 2,
8 l1 i' n p' _( h5 W: U; o kLoadDwgMsg = 3,: }/ n4 |' F ]! d2 g
kUnloadDwgMsg = 4,
) U7 t# p; F9 h6 |- I7 O+ K/ E! xkInvkSubrMsg = 5,
- k- Z0 y! _$ B3 A. D- tkCfgMsg = 6,% T9 U: b/ j+ K- D% |3 ^
kEndMsg = 7,
# N7 n0 @2 z% Z4 |- kkQuitMsg = 8,
5 R& P1 N6 D- Z. d0 KkSaveMsg = 9,
2 a) d; |2 \# ~, k! o$ ]kDependencyMsg = 10,
G& E( p) A6 {% F/ pkNoDependencyMsg = 11,4 d6 e9 I9 Q, `; z- U" t8 O3 n
kOleUnloadAppMsg = 12,$ b/ E% J8 P: R: D) K2 g& |' M& o
kPreQuitMsg = 13,0 {1 _3 E$ r( r8 I! i
kInitDialogMsg = 14,
/ j' C1 j! {2 wkEndDialogMsg = 15 }; " x3 r# A# A8 Z& X& b
' @, h, _6 u6 q: u3 p3 V% R) V i$ S5 u$ W+ R
enum AppRetCode { kRetOK = 0,: e/ t1 c; y. A+ |
kRetError = 3 };
8 t( o- u) o" A, S4 T* W* L};& ?; \# o5 Z' A/ P g+ I1 _' F
9 v) e( f# H5 U+ v: g% V! p' H( N
#define RTERROR (-5001) // Some other error; y) c9 q1 ]+ a0 }& r0 v
#define RTNORM 5100 /* Request succeeded */5 z" c3 Q8 u3 K- h5 j' f, \- [
; v. G3 Y% K( C$ F3 a//1.
! X6 O9 [: i0 b# V0 p& n( m4 GHMODULE hDll = ::LoadLibrary( "acad.exe" );
5 T& l: T/ B/ y8 d1 [- i# lDWORD err = GetLastError();
% D$ @, |3 _$ P3 f( G//2.int acedPrompt (const char *str); S# B5 r! `! o* Q3 q2 L
typedef int ( WINAPI *PacedPrompt )(const char *str);+ @. E( f3 L! D9 i6 W: Q
PacedPrompt acedPrompt = ( PacedPrompt )
" G. [9 p$ ~" f) _# b) I2 v::GetProcAddress( hDll,
9 J: f# |" C6 n' Q"acedPrompt" );" h( `4 s0 j1 o) G* U1 j- r
// err = GetLastError();/ G6 H" S/ ?& c$ T2 Q
//3.HWND adsw_acadMainWnd();4 J! y; l8 }. v: g; h! ^
typedef HWND ( WINAPI *Padsw_acadMainWnd )();) w6 x3 s8 t G5 b/ u
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )% L8 J, Q+ S% e/ B$ \
::GetProcAddress( hDll,
# L) q- A5 g' z3 k/ i"adsw_acadMainWnd" );# s6 K* f6 p0 S1 D& d9 M* c
//4.int acedDefun (const char *sname, short funcno);
9 l; e* c+ k$ J; w0 Jtypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
9 I; d% z: {* A, lPacedDefun acedDefun = ( PacedDefun )' w0 L; g: \$ w3 A& m# x) b9 P
::GetProcAddress( hDll,
, l% j7 Q/ W. {3 {"acedDefun" );
+ [3 l( v2 Y" H2 Q//5.int acedUndef (const char *sname, short funcno);
$ E& n1 ~% O% B, j) o* Mtypedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
) h" ? |# @" ?PacedUndef acedUndef = ( PacedUndef ): L: M4 Y1 H2 K: q
::GetProcAddress( hDll,: x* M1 H+ U7 \3 s1 y& s7 Q
"acedUndef" ); |
|