- UID
- 110608
- 积分
- 328
- 精华
- 贡献
-
- 威望
-
- 活跃度
-
- D豆
-
- 在线时间
- 小时
- 注册时间
- 2004-3-7
- 最后登录
- 1970-1-1
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
通过GetProcAddress,LoadLibrary这两个函数来获取函数的地址,
对一下简单的程序,就可以实现不用重新编辑就可以在不同的CAD版本中加载的ARX文件了.
但是目前还是碰到一些问题,就是这个函数:
acrxGetApiVersion,无法获取其代码.
因为这个函数通过以上的方法是无法获取的.即使是loadlibrary别的arx文件也是无法获取的到的.
而自己随便定义一个这样的函数也不得,真不知道这个函数到底是完成了什么功能.而CAD又是如何识别出不同的版本来的呢???
我试过了以下几个办法来获取这个函数的办法:
1.
[php]
自己定义一个这样的函数,可以CAD好像看都不看一下,就说是版本不对.
void* acrxGetApiVersion()
{
char szHello[] = "Hello, world!";
__asm
{
PUSH 0
PUSH OFFSET szAppName // 全局变量用OFFSET
// LEA EAX, szHello // 局部变量用LEA
// PUSH EAX
LEA EAX, szHello
PUSH EAX
PUSH 0
CALL DWORD PTR [MessageBoxA] // 注意这里,我费了好大周折才发现不是CALL MessageBoxA
}
// MessageBox(0,"asm","asm end",0);
FILE* fp; /*定义一个文件指针*/
fp=fopen("d:\\CLIBt.txt", "a+"); /*打开当前目录名为CLIB的文件只读*/
MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
fprintf(fp, "%d\n", 12345678);
MessageBox(0,"fprintf","fprintf end",0);
fclose(fp); /*关闭打开的文件*/
// MessageBox(0,"acrxGetApiVersion","acrxGetApiVersion",0);
return acrxGetApiVersion_Mid();
}
[/php]
2.用loadlibrary从另一个arx文件中获取.好像也是不可行的.
[php]
// 6.acrxGetApiVersion
typedef void* ( WINAPI *PacrxGetApiVersion )();
PacrxGetApiVersion acrxGetApiVersion_Mid = ( PacrxGetApiVersion )
::GetProcAddress( ::LoadLibrary( "AcArray.arx" ),
"acrxGetApiVersion" );
[/php]
3.从lib文件中获取,只有这个是可行的.
#pragma comment( lib, "rxapi.lib" )
定义这样一个头文件
[PHP]
/*自定义CAD函数*/
struct AcRx {
typedef void (*FcnPtr) ();
enum DictIterType { kDictSorted = 0,
kDictCollated = 1 };
enum Ordering { kLessThan = -1,
kEqual = 0,
kGreaterThan = 1,
kNotOrderable = 2 };
enum AppMsgCode { kNullMsg = 0,
kInitAppMsg = 1,
kUnloadAppMsg = 2,
kLoadDwgMsg = 3,
kUnloadDwgMsg = 4,
kInvkSubrMsg = 5,
kCfgMsg = 6,
kEndMsg = 7,
kQuitMsg = 8,
kSaveMsg = 9,
kDependencyMsg = 10,
kNoDependencyMsg = 11,
kOleUnloadAppMsg = 12,
kPreQuitMsg = 13,
kInitDialogMsg = 14,
kEndDialogMsg = 15 };
enum AppRetCode { kRetOK = 0,
kRetError = 3 };
};
#define RTERROR (-5001) // Some other error
#define RTNORM 5100 /* Request succeeded */
//1.
HMODULE hDll = ::LoadLibrary( "acad.exe" );
DWORD err = GetLastError();
//2.int acedPrompt (const char *str);
typedef int ( WINAPI *PacedPrompt )(const char *str);
PacedPrompt acedPrompt = ( PacedPrompt )
::GetProcAddress( hDll,
"acedPrompt" );
// err = GetLastError();
//3.HWND adsw_acadMainWnd();
typedef HWND ( WINAPI *Padsw_acadMainWnd )();
Padsw_acadMainWnd adsw_acadMainWnd = ( Padsw_acadMainWnd )
::GetProcAddress( hDll,
"adsw_acadMainWnd" );
//4.int acedDefun (const char *sname, short funcno);
typedef int ( WINAPI *PacedDefun )(const char *sname, short funcno);
PacedDefun acedDefun = ( PacedDefun )
::GetProcAddress( hDll,
"acedDefun" );
//5.int acedUndef (const char *sname, short funcno);
typedef int ( WINAPI *PacedUndef )(const char *sname, short funcno);
PacedUndef acedUndef = ( PacedUndef )
::GetProcAddress( hDll,
"acedUndef" );
[/PHP] |
|