AutoCAD 加载了一个ARX(DLL),此DLL有一个导出函数形如:void Fun();我要在另一个EXE中调用它
现在我已经取到了这个ARX(DLL)的HMOUDLE hMoudle,
怎么调用?发消息的方法我做过了,可以,不过在ARX中要安装线程钩子。讨厌用这种方法。
考虑到兼容性,ARX不能改为服务COM所以我想有种方法能跨进程调用这个DLL中的导出函数就好了 请问怎么办啊?
现在我已经取到了这个ARX(DLL)的HMOUDLE hMoudle,
怎么调用?发消息的方法我做过了,可以,不过在ARX中要安装线程钩子。讨厌用这种方法。
考虑到兼容性,ARX不能改为服务COM所以我想有种方法能跨进程调用这个DLL中的导出函数就好了 请问怎么办啊?
给你看一篇文章,不知道适用不?
http://www.luocong.com/articles/show_article.asp?Article_ID=23
显式链接到 DLL 的进程调用 GetProcAddress 来获取 DLL 导出函数的地址。使用返回的函数指针调用 DLL 函数。GetProcAddress 将(由 LoadLibrary、AfxLoadLibrary 或 GetModuleHandle 返回的)DLL 模块句柄和要调用的函数名或函数的导出序号用作参数。由于是通过指针调用 DLL 函数并且没有编译时类型检查,需确保函数的参数是正确的,以便不会超出在堆栈上分配的内存和不会导致访问冲突。确保类型安全的一种方法是查看导出函数的函数原型,并创建函数指针的匹配 typedef。例如:typedef UINT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT);
...HINSTANCE hDLL; // Handle to DLL
LPFNDLLFUNC1 lpfnDllFunc1; // Function pointer
DWORD dwParam1;
UINT uParam2, uReturnVal;hDLL = LoadLibrary("MyDLL");
if (hDLL != NULL)
{
lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL,
"DLLFunc1");
if (!lpfnDllFunc1)
{
// handle the error
FreeLibrary(hDLL);
return SOME_ERROR_CODE;
}
else
{
// call the function
uReturnVal = lpfnDllFunc1(dwParam1, uParam2);
}
}
调用 GetProcAddress 时指定所需函数的方式取决于 DLL 的生成方式。仅当要链接到的 DLL 是用模块定义 (.DEF) 文件生成的,并且序号在 DLL 的 .DEF 文件的 EXPORTS 节中与函数一起列出时,才能获取导出序号。如果 DLL 具有许多导出函数,则相对于使用函数名,使用导出序号调用 GetProcAddress 的速度稍快一些,因为导出序号是 DLL 导出表的索引。使用导出序号,GetProcAddress 可直接定位函数,而不是将指定名称与 DLL 导出表中的函数名进行比较。但是,仅当有权控制 .DEF 文件中导出函数的序号分配时,才应使用导出序号调用 GetProcAddress。
那么必须 HOOK 或者 注入,来打破进程边界,才能进行访问。 可以在访问时打破边界,不访问的时候终止。更好的办法我还没想到如果只是访问 DLL 的一个函数,我觉得不会是问这个问题了!
我试过了 那个DLL不是我进程里面的 我Get不到注入可以 不过98可以注入吗?mybios(俊俊哥哥)
--------------
好久不见啊 好想你哦~~~
----
那个DLL是被CAD Load的
我Load不进来的 里面都是一些CAD的函数 调用也没用
必须在CAD的进程里面调用啊