|
|
马上注册,结识高手,享用更多资源,轻松玩转三维网社区。
您需要 登录 才可以下载或查看,没有帐号?注册
x
在网上看到的
! m: V. V8 p) L0 R/ N通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,# r! U% l: v9 V/ X6 k! D
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.6 l( E- z, _6 v! o$ @
2 N9 Z0 F2 E/ K% e( u8 _
但是目前还是碰到一些问题,就是这个函数:
2 {' ~) n% @: u5 M: Z2 M; o3 MacrxGetApiVersion,无法获取其代码.; f6 d% O) d: Q+ f
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.3 o7 }5 L4 d: m% L" h3 c& y- \
- m6 w% d" I! [# h2 C4 T: I& q8 y而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
& [2 S7 W* |$ x P8 W) B6 R5 @: ?4 e& {- a: c* o; L5 Y
我试过了以下几个办法来获取这个函数的办法:
% ^3 H# `) T6 d7 q7 V+ [1. ! A/ P% v1 ~$ [$ {, ?$ A5 A
Quote. I5 b" j+ Q2 `) ^$ j- q
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对., t! ^' B( B. o
void* acrxGetApiVersion()6 @/ y" E* l# t& F
{
+ `: T- |2 i0 Y" M5 w char szHello[] = "Hello, world!";
`! {6 k- a4 ]. l0 e9 ], O, \4 W$ P1 k% h5 r1 T
__asm # |2 Y' J! [* g* ]' K# T ~
{
- }! ]( U/ W) F ?. q PUSH 0
: ~. z! \- V3 q9 b- v7 P PUSH OFFSET szAppName // 全局变量用OFFSET3 C" G0 Z m9 P4 n2 ~( a
// LEA EAX, szHello // 局部变量用LEA, {% ^$ M& H% k! J5 G0 N/ q1 }
// PUSH EAX
, _* q" F. X- W$ h! \ LEA EAX, szHello! I7 L) }+ D6 ]5 P3 }
PUSH EAX 7 @1 ]/ ]0 `" O: g7 @2 ?& j
PUSH 0 ; Y: f% f$ ~8 h% v& Y% v+ t0 O, [
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
% a& J) T F9 s: J! l1 g3 Y% i5 E' A0 | }
" c9 E2 S6 q: \* [4 F- j1 ~$ f8 J // MessageBox(0,"asm","asm end",0);
2 J0 p8 i9 }+ v+ N- y) j' r( t& J* ]) {: z. {7 N1 b
FILE* fp; /*定义一个文件指针*/5 N H! ]( c2 `0 Z) K5 W- F
fp=fopen("d:\\CLIBt.txt", "a+" ; /*打开当前目录名为CLIB的文件只读*/0 T6 u, @1 g: C8 l; f9 @
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
/ `$ C/ Z6 C+ v) b5 z fprintf(fp, "%d\n", 12345678); D' g% a& L. l
MessageBox(0,"fprintf","fprintf end",0); 4 H ~) @3 o4 f( J7 T! w: g! a
fclose(fp); /*关闭打开的文件*/0 c( Z2 x) z. ]* W
0 N v' V: e3 L' U
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0); , {! u4 f- o( v7 ]2 T$ R% q% k
return acrxGetApiVersion_Mid();
8 @3 n- d8 X* T0 J4 m, [* {4 h' m }/ E C$ [* W0 G( @
; B" L. Q: T4 @) P% G' q4 ?$ n" x2.用loadlibrary从另一个arx文件中获取.好像也是不可行的. : ~6 P \+ _" e4 k. \! F; V' y- p
Quote1 E$ Q0 @# N2 }( W
// 6.acrxGetApiVersion
% q: r2 \, z X4 r. A2 N/ w4 O6 L typedef void* ( WINAPI *PacrxGetApiVersion )();
/ r2 N" [5 X6 D8 y4 PPacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )* U2 e( N+ B# J4 F; b, W* M
::GetProcAddress( : oadLibrary( "AcArray.arx" ),, b8 M; x9 o9 a) \
"acrxGetApiVersion" );1 m* ^ u: z y& V9 @/ [6 _
" S/ v8 J: w u1 A% I5 j% ^3.从lib文件中获取,只有这个是可行的.
7 G9 u, j" D' h+ q) e1 }#pragma comment( lib, "rxapi.lib" ) 0 `/ d. B" b/ e' Y( [
( r: ~1 f( J% d$ x
定义这样一个头文件
9 j6 z' y8 a# H# n, H6 M6 ^Quote2 U5 l; r* A$ G: U
/*自定义CAD函数*/! C3 m9 {# z9 U. o! N
struct AcRx {. q' q* c. q2 @* v' g
1 q( U5 w& F! z0 C
typedef void (*FcnPtr) ();
2 m! z# U( R& P, r) C3 E2 }" t/ j2 m+ V& b4 E3 i% F+ u f7 ~
enum DictIterType { kDictSorted = 0,
$ ~5 e6 s# X/ d$ Y/ n kDictCollated = 1 };
" Z) C3 Q8 i: \, h1 C0 i7 V. ]
+ m; T* q& d6 _# z Q- l qenum Ordering { kLessThan = -1,
" W/ ^4 @8 S Q% z kEqual = 0,6 A% G k7 E# \" \9 Y( ]) g
kGreaterThan = 1,7 P/ ~! k j$ J) p
kNotOrderable = 2 };
6 H" I( o% ]( B. [/ c8 }
6 Q0 [4 ` D* c5 f. ienum AppMsgCode { kNullMsg = 0,4 `9 [& j" U9 I
kInitAppMsg = 1,% o# Q/ E4 B" e' g3 j
kUnloadAppMsg = 2,/ ?* ^4 b I+ b+ g; }% g$ x: Y6 Q1 n
kLoadDwgMsg = 3,; i3 \: {2 F9 s9 V% n, ~. ^
kUnloadDwgMsg = 4,/ b5 g7 x0 g% W3 ^ X9 g( a
kInvkSubrMsg = 5,4 l `* s& `, B
kCfgMsg = 6,% F6 N% O% A7 L+ i! s1 E5 [
kEndMsg = 7,' {0 F, f# t: M7 T6 p& z% A
kQuitMsg = 8,
& r) K/ c5 m3 j, n$ F$ _+ {, R4 E1 ^kSaveMsg = 9,' ^ w8 j6 X9 L) g
kDependencyMsg = 10,' \4 `+ [( W+ |/ G
kNoDependencyMsg = 11,
" B: d+ ?* t: F4 G9 lkOleUnloadAppMsg = 12,
5 F: b; \9 Y v: Z( u, e: wkPreQuitMsg = 13,
* E+ M& y6 _0 z& ?# P/ n( ?kInitDialogMsg = 14,
$ ]0 ]/ {7 ^2 O/ F, t* ~& |kEndDialogMsg = 15 };
I' o5 v- p& t l5 O* }' R' K/ i7 f1 D
0 h6 Y# Q! R1 {/ o7 ~6 G4 x8 S2 T
enum AppRetCode { kRetOK = 0,
% l$ H+ I% W0 _' Q# | kRetError = 3 };( J' \* j2 ]) `/ G* m+ r$ z6 R
};
+ U. T2 U P/ z$ N( k- W% ^ f' y4 P# ^( [9 }
#define RTERROR (-5001) // Some other error# `+ |9 S0 R% }; D
#define RTNORM 5100 /* Request succeeded */. w1 n% f1 t1 }9 q/ t
2 P( }% r3 g; D0 ?
//1.
- [2 ^- T G0 ?7 ]5 JHMODULE hDll = ::LoadLibrary( "acad.exe" );
9 G2 P& z7 x0 {DWORD err = GetLastError();
3 I9 y0 I h+ g1 c7 a& a0 m) E0 U; H//2.int acedPrompt (const char *str);
. A5 I& r6 G/ k+ ^+ [$ Vtypedef int ( WINAPI *PacedPrompt )(const char *str);! m' |' [( h R* u
PacedPrompt acedPrompt = ( PacedPrompt )) C& {* Z ^- V
::GetProcAddress( hDll,
1 v; J- U* R; e; o"acedPrompt" );
0 I+ g5 I3 e0 |! _; R// err = GetLastError();
5 ?* ]3 y, r1 D//3.HWND adsw_acadMainWnd();) N- a" f# R, A; L4 l; e
typedef HWND ( WINAPI *Padsw_acadMainWnd )();% O! `/ T3 L+ I% D w
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
& n: i N" J* c::GetProcAddress( hDll,
5 w( g9 X5 y3 h- }6 C) L! {$ Q"adsw_acadMainWnd" );/ n% b, j6 B& M ^1 O8 O
//4.int acedDefun (const char *sname, short funcno);6 u$ P. Z+ t2 C* i* N
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
+ c/ v0 Z! g7 G6 PPacedDefun acedDefun = ( PacedDefun ): T& ]: R9 g1 U! x7 C
::GetProcAddress( hDll,
^' U/ D, U$ m- P8 M, }2 h"acedDefun" );
3 Z) f. G& `2 `//5.int acedUndef (const char *sname, short funcno);$ a* r. q9 X, d; B' B% i
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);8 x- Z- I0 H/ K
PacedUndef acedUndef = ( PacedUndef )
# W+ ]$ s6 `! L::GetProcAddress( hDll,
! ]2 @+ p; K( z) q"acedUndef" ); |
|