|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的! ?+ t% l; [7 `" F2 t8 [! |! {
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,$ S$ _9 k' b9 ?7 V
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
1 {' `, Z7 x$ }9 _& k: ~( A+ z/ c) J( n3 L) c! B
但是目前还是碰到一些问题,就是这个函数:2 \4 f4 J" A, K s# i U, G0 }, O4 f4 A
acrxGetApiVersion,无法获取其代码.
0 m& k* \2 c' j$ t3 i7 P) q因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
$ S# z! d ~, C9 m: [: i- V! P
& F# s1 d! S( P: L! X而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???2 B8 R; \1 n; a2 \2 h2 Y0 N, M
. N0 Y7 |- R- r0 C4 S
我试过了以下几个办法来获取这个函数的办法:. U4 E8 v# K! n, }1 P* o8 v0 L1 X; N$ }
1. % {4 n! t" z5 c( j- G/ S4 _/ S
Quote
) ]! b2 T' X/ z# z; q! q' k3 C自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.3 B# o2 }$ @! c( J& r
void* acrxGetApiVersion()
! P0 |* g M# c0 W; ]{
, s, m/ U( _, o: j8 m) @ char szHello[] = "Hello, world!"; - T6 x. N; d( z- A) A! k
! f* @4 @4 l' J0 l4 z4 Q8 V __asm 9 i+ Z2 e0 i; \
{
1 g* o+ m5 B! o PUSH 0- r2 P% c; _& [
PUSH OFFSET szAppName // 全局变量用OFFSET% p$ L2 X" d% V" A5 P0 ?! C
// LEA EAX, szHello // 局部变量用LEA" J2 ^) J, Y1 S$ H
// PUSH EAX
+ @; }$ S7 E- D! o$ s LEA EAX, szHello
' s4 P% e x3 M& \( Y, S2 A PUSH EAX 5 Z. j! f6 j6 A& N, ?9 W8 j* \0 O
PUSH 0 0 j& W I3 S0 _: s
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA1 a9 h" T- z7 D6 j. S4 {
} 7 F) ]+ y- `$ v' P: q2 h \) I! i- C
// MessageBox(0,"asm","asm end",0);
" V9 j3 T; t0 P4 d; r, p e2 h4 Z) {; u3 F
FILE* fp; /*定义一个文件指针*/
6 E- h% z) S% d( I fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/
0 O4 d8 U W( |0 L ~1 }MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); 5 _% \" ]: m$ U. f& Z; E$ Q
fprintf(fp, "%d\n", 12345678);( Y9 Q/ E& e1 p; S6 L
MessageBox(0,"fprintf","fprintf end",0); ' I- X( r0 K; S/ |' w7 l
fclose(fp); /*关闭打开的文件*/5 @) `4 L: T4 T$ J' @
9 y. c: Y, }2 u0 G7 \4 P1 ^
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
- O6 a' h8 A5 a6 z& i! Hreturn acrxGetApiVersion_Mid();. G5 u+ y& z ^, p0 W. v
}
C+ y9 \1 i3 B) F3 @- \
/ k' q& l7 z- d* S% g2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. , @6 K1 ~8 \, G+ o% ^; }( ~
Quote
8 M1 M* {/ e3 g8 H- q. `2 C// 6.acrxGetApiVersion, K8 ]5 o1 P. P R" B) e# H
typedef void* ( WINAPI *PacrxGetApiVersion )();0 R+ c7 }3 {5 L( K6 l# a
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )# V3 K7 z9 q& }
::GetProcAddress( : oadLibrary( "AcArray.arx" ),
1 ?! T3 o" c8 b: o$ U"acrxGetApiVersion" );6 H& b/ r6 y, @5 v8 g
7 r. ^1 F c: i# t2 F( j3.从lib文件中获取,只有这个是可行的.
6 M9 Z% V% a& e E#pragma comment( lib, "rxapi.lib" ) % M/ u) o1 u% J% E$ \0 q8 n* j
$ S$ D: }) R; D5 s定义这样一个头文件
6 ` ^6 X# D! A; T! kQuote
+ n- w* N9 a, M5 {6 M- R- o/*自定义CAD函数*/( z; b% I5 r2 S% D& P, F5 A: H
struct AcRx {6 ~. |8 I# |( |8 ~* y+ `" Z
2 x* N7 z% ^! d0 M+ A+ @6 l
typedef void (*FcnPtr) ();
4 S( ^1 R2 c/ b2 Y, \ S" \! o3 w4 r: k7 q" G
enum DictIterType { kDictSorted = 0,
! R: t" K! ~0 P kDictCollated = 1 };. Y( D3 L+ m# V, I
: U6 w0 W h5 J: O# cenum Ordering { kLessThan = -1,2 o% U& A8 d, i2 F4 I
kEqual = 0,
# U3 i% G& R) q7 b5 A( i kGreaterThan = 1,$ D% S% G; h) A& g/ D; U" A
kNotOrderable = 2 };
. A! Q) i8 a: I) o; O
8 G1 h3 X5 J: K- Jenum AppMsgCode { kNullMsg = 0," n$ W" |% F3 o9 W" {( R; b7 j* V
kInitAppMsg = 1,
9 q8 t. y4 j0 P$ Q0 ]$ y! i! } kUnloadAppMsg = 2,
! ]% J( S+ O8 {) M; ~& D* ? kLoadDwgMsg = 3,
- c' |: ~7 l; U2 }2 p kUnloadDwgMsg = 4,
& ^. z- R! ]- R" S& ?kInvkSubrMsg = 5,4 ^' X1 `% l0 c9 V& _7 t
kCfgMsg = 6,
3 M6 k. o: j3 x1 {kEndMsg = 7,4 I2 `' ?8 @1 G+ k7 Z* Q6 `
kQuitMsg = 8,6 z# F* r8 Q. }' K) T$ v1 I
kSaveMsg = 9,
3 R) M; j7 _+ K c6 o; SkDependencyMsg = 10,
: t% H: Y5 Y/ X& lkNoDependencyMsg = 11,
; a# q- R/ f' h, q# YkOleUnloadAppMsg = 12,7 N& Y8 g! L: M( m( k1 t
kPreQuitMsg = 13,! h- {' H/ ~: D9 s+ ?
kInitDialogMsg = 14,
! _+ k. t, W2 h3 {kEndDialogMsg = 15 }; 5 z7 k0 B$ a' u! p; O% ?% l
& O B8 r' _( \ d( m# i; D; |
enum AppRetCode { kRetOK = 0,
$ u6 V4 _* @9 p+ v# M6 P& K4 { kRetError = 3 };4 Y) F+ p- a4 T0 M3 K
};
2 I3 J9 E% u+ I' w9 [7 i4 S% C+ G: N9 t% Q
#define RTERROR (-5001) // Some other error1 x" ]! M! K, @) ]" o4 ^' r; ?0 _
#define RTNORM 5100 /* Request succeeded */
! z/ j# G7 {( {: a5 P6 q5 ~+ M! h! K" k4 `2 D2 g! Z
//1.' F: q* J2 k1 ^1 O
HMODULE hDll = ::LoadLibrary( "acad.exe" );1 K9 @! z( U% @- w4 E& G
DWORD err = GetLastError();
+ _% K/ a* p1 z# O//2.int acedPrompt (const char *str);( Z; F ^! V( P, ?9 ^- m, k
typedef int ( WINAPI *PacedPrompt )(const char *str);
3 ?, s+ m. X7 Y m( p% c, mPacedPrompt acedPrompt = ( PacedPrompt )" z: Z' t6 T9 r5 D
::GetProcAddress( hDll,
* F$ O' p; d8 E$ E"acedPrompt" );
; o6 i; E0 v* u' i// err = GetLastError();/ Z0 i6 k0 K e! ?. L
//3.HWND adsw_acadMainWnd();4 E" q7 _3 F) ~% k: E( M" ?
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
, Y) i1 m. j; h5 E' I1 P! W! t, jPadsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )$ c9 l7 f& {7 [" o# m
::GetProcAddress( hDll,
4 A5 Y/ f1 }% B3 `# y* v"adsw_acadMainWnd" );
! b5 t$ d S* p) o//4.int acedDefun (const char *sname, short funcno);
" I( Q5 H8 G9 B1 dtypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
: x" R; R. z1 `* A3 t4 e9 X$ I: sPacedDefun acedDefun = ( PacedDefun )
# C7 ~5 U7 H* h4 ?1 s::GetProcAddress( hDll,
( Y. \. y2 s+ ~, r( p; ^4 x"acedDefun" );
' p/ ~6 B* ?% a& S7 d8 h) o2 L//5.int acedUndef (const char *sname, short funcno);4 R+ J% q1 f' M' |0 e5 d
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);( k7 `# c7 ~6 r0 V1 w
PacedUndef acedUndef = ( PacedUndef )
1 i( o+ k1 \' i. X# L: G::GetProcAddress( hDll,
( Q2 i7 f3 {, n"acedUndef" ); |
|