|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的/ m J6 J5 _% C$ N, `8 F
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,) F1 r4 c& p6 V4 i
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
9 P- D% U* X- M% I& N8 Z5 ]7 M) {% n. n2 v1 ~: I# F
但是目前还是碰到一些问题,就是这个函数:
9 }- E6 p! r# C; \/ o, L5 GacrxGetApiVersion,无法获取其代码.* u1 Z- F8 @# g! ^* a: ^
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的., K8 B( o. X' [8 [1 J
# N, H0 J3 ^8 B" q& _8 b, e) u$ _而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
+ E6 l8 C3 W& _1 G* A& g3 a6 w
* c$ @, n3 W' u" m5 \( A- z我试过了以下几个办法来获取这个函数的办法:. N+ P3 C& o) M& q
1.
, J5 m' x1 @0 X& \" i6 ~Quote
! z Q# x; n! ^, n0 P, Q3 q& D自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.( J$ Y* j9 K. \
void* acrxGetApiVersion()+ `2 \, v. v& J9 T
{5 n! M- P2 G0 B$ o8 _2 F6 f. }
char szHello[] = "Hello, world!";
3 @; W- h- \ L! d, y3 r% m
, T- r% @/ J6 P+ X* l' e) ] __asm ' `2 h6 A y% Y# D9 D r0 X: G" _
{ 9 j, P/ g# z j
PUSH 0
/ u8 j1 D& `* s) P7 j+ ~2 Z8 | PUSH OFFSET szAppName // 全局变量用OFFSET" G4 L+ i. ~4 Z. [! a( A
// LEA EAX, szHello // 局部变量用LEA
& _2 r% O) S) A& I// PUSH EAX+ l% I( m3 c5 j& }
LEA EAX, szHello
7 Z4 y, ^+ W- D. d PUSH EAX
% b# E3 t2 m3 A( d PUSH 0 6 l" L0 r/ h/ r
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA6 B c% b9 K# R) G4 v x. Y( n
}
4 m8 H2 {9 o" ] n. ?+ X // MessageBox(0,"asm","asm end",0); 4 S {8 A% d8 g
1 B+ P9 z. z' W
FILE* fp; /*定义一个文件指针*/
$ v, w" @* i6 ~. q7 J6 A7 z, u7 }3 y fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/7 [ N! A+ P0 b+ w- v. O
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
; C+ s& U$ h9 E) ?" { fprintf(fp, "%d\n", 12345678);
' }1 n F, P' J6 w; F1 HMessageBox(0,"fprintf","fprintf end",0); 2 \+ F) ~9 o G' Z$ u2 v1 s
fclose(fp); /*关闭打开的文件*/* m9 C. E* X( D2 H1 _9 a# G U
1 i+ \9 X. ?0 A+ p; w2 ~// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
& _3 @7 s7 ^( N4 Vreturn acrxGetApiVersion_Mid();
* J) n: j2 I \! m& g2 J }
1 I, H& v0 G' W7 _
2 Y# T9 K! e9 N. {+ A/ q% d- x! X- I2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
1 ?) f! O7 m, S% C+ o5 ~Quote
# v1 s4 l9 c# C' ^// 6.acrxGetApiVersion6 e" O. Q# g2 l ]: u% ~' Z2 y9 q9 f
typedef void* ( WINAPI *PacrxGetApiVersion )();
1 E! e8 }# i9 VPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )! w0 t) [' f) F. C! i- m
::GetProcAddress( : oadLibrary( "AcArray.arx" ),* l1 x8 ]7 `1 n$ b! |7 Z9 d
"acrxGetApiVersion" );" F8 G+ ~8 R8 L$ c0 u
# r: L- @& N y: F1 \
3.从lib文件中获取,只有这个是可行的.
9 B' @7 H. P; p- X#pragma comment( lib, "rxapi.lib" )
( e$ W0 a; }5 [2 ~% Y, S5 S% Y& P
0 u% X5 y1 G2 _* H1 N8 i定义这样一个头文件 6 M1 G7 L! w }/ E
Quote
2 {0 ~- ~/ H* d- K/*自定义CAD函数*/+ j0 F" e, y- v9 W; h1 M# L, c, t8 c3 ^
struct AcRx {
- ~" R9 H+ x& T& ?( Q2 [! z8 Y3 r! E0 m4 e
typedef void (*FcnPtr) ();
- V9 [% I8 E: P1 V) q
4 N/ a. e$ A: V. ]# {: Venum DictIterType { kDictSorted = 0,( S3 O$ A! {& O4 l* r3 J ]! c1 b
kDictCollated = 1 };- \. {& k: {2 h7 f" u/ m
3 z% H s( W, o' C6 W benum Ordering { kLessThan = -1,
9 O+ y4 J f7 G8 q5 A8 s" b kEqual = 0,
0 E& c6 V& `* u' }1 ?) C; j kGreaterThan = 1,2 H' [( w- B v8 C0 A t: j0 H& R
kNotOrderable = 2 };
6 J8 W0 U3 J# ]' F
$ b* O2 n8 I, W; v/ D @9 v( Oenum AppMsgCode { kNullMsg = 0,
2 v8 ]( ?& b0 W kInitAppMsg = 1,
, N* O1 a- N& I kUnloadAppMsg = 2,
! E3 }1 w6 S+ ~, d$ t kLoadDwgMsg = 3,- A- J) M0 f, a7 i9 `- c- @
kUnloadDwgMsg = 4,
S, B" O/ {9 K/ qkInvkSubrMsg = 5,$ s& D- t& @0 P) R/ @8 B
kCfgMsg = 6,' H2 p' x" p3 h i( W* j" ~" R
kEndMsg = 7,* M7 J" f, s* r, O+ H* i) C2 a
kQuitMsg = 8,
# Q* w5 G+ [- I2 A k6 k) X! {. {kSaveMsg = 9,% b( m9 L0 J& e0 s; D
kDependencyMsg = 10,. G7 u8 ~2 r! R
kNoDependencyMsg = 11,
3 j) Z! J/ ]! T4 e# w0 akOleUnloadAppMsg = 12,2 Q( _4 H2 A3 I+ C6 T
kPreQuitMsg = 13,# z0 t- k5 U) Q- ?, |
kInitDialogMsg = 14,
" k! W. G1 O; A, l7 c+ ukEndDialogMsg = 15 };
( m( j: h1 s8 Z- ]1 n5 s" e) w1 A% ]/ X* x
! G/ L$ t! U( J( y. e
enum AppRetCode { kRetOK = 0,
3 q; K3 \7 A- K( ^' m$ ]9 h9 b8 c kRetError = 3 };$ _ H8 I4 y9 J# E& Z/ U
};
, H! Z2 G: U* q7 N6 d4 E" e; p0 e' q L& Z& O& I' m& T
#define RTERROR (-5001) // Some other error
' V: e- N! F2 `: j, L# b9 t0 m2 w' i#define RTNORM 5100 /* Request succeeded */
2 I, i# o9 _1 t# B3 p+ B
5 z2 N- ?6 w5 B c//1.4 w5 ^9 Y) j B5 C4 q
HMODULE hDll = ::LoadLibrary( "acad.exe" );
. G* Y' U5 j6 G: K2 o' iDWORD err = GetLastError();
0 _ i- A( p4 \+ ?7 X; U% p# f//2.int acedPrompt (const char *str);
8 y# J( B3 m& n: gtypedef int ( WINAPI *PacedPrompt )(const char *str);4 e p& w" ?% V6 ^$ I6 F/ E. G, e" T: Q
PacedPrompt acedPrompt = ( PacedPrompt )+ q6 v# L7 W- f- Z; z
::GetProcAddress( hDll,
5 P. H P, Z8 h"acedPrompt" );
# l. D9 _# P: |7 K% n6 Y+ B4 f/ {* r# Y// err = GetLastError();
+ S5 v1 i& b# B. h8 F//3.HWND adsw_acadMainWnd();
2 x( ^ w- u2 l5 y9 b! {typedef HWND ( WINAPI *Padsw_acadMainWnd )();2 `# u( a. u* ]; E* j6 C h/ l& F
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )% ]" y" X1 O6 u0 O4 M7 q2 b0 q6 u
::GetProcAddress( hDll,
7 x/ N# Z) {6 G% [7 x"adsw_acadMainWnd" );
7 [/ `* K$ | s; i//4.int acedDefun (const char *sname, short funcno);
0 i8 Q4 z: s/ I/ t, Itypedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
9 P1 C+ M; t* I' I" rPacedDefun acedDefun = ( PacedDefun )* _2 c0 ^/ I* N5 H9 Y, q& @+ \
::GetProcAddress( hDll,
+ b8 a( l2 l s6 [3 m"acedDefun" );, R- L& C4 z) K, o- z5 b
//5.int acedUndef (const char *sname, short funcno);
. h1 A' m0 U% d4 k% _7 ^typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);. w5 ~- [) U1 p3 v( w
PacedUndef acedUndef = ( PacedUndef )
- V5 J8 e$ ?: |9 B::GetProcAddress( hDll,
, Y, s+ H6 J0 _2 L1 b; M- M1 `"acedUndef" ); |
|