GetProcAddress() LoadLibrary() DLL
GetProcAddress函数检索指定的动态链接库(DLL)中的输出库函数地址。
函数原型:
FARPROC GetProcAddress(
HMODULE hModule, // DLL模块句柄
LPCSTR lpProcName // 函数名
);
参数:
hModule
[in] 包含此函数的DLL模块的句柄。LoadLibrary、AfxLoadLibrary 或者GetModuleHandle函数可以返回此句柄。
lpProcName
[in] 包含函数名的以NULL结尾的字符串,或者指定函数的序数值。如果此参数是一个序数值,它必须在一个字的底字节,高字节必须为0。
返回值:
如果函数调用成功,返回值是DLL中的输出函数地址。
如果函数调用失败,返回值是NULL。得到进一步的错误信息,调用函数GetLastError。
FARPROC 是一个4字节指针,指向一个函数的内存地址,例如
GetProcAddress 的返回类型就是一个FARPROC。
如果你要存放这个地址,可以声明以一个 FARPROC变量来存放。
GetProcAddress返回的是一个函数地址的指针。
声明:FARPROC WINAPI GetProcAddress(__in HMODULE hModule, __in LPCSTR LpProcName);
你应该知道你要的函数的类型是什么,可以用typedef的方法定义函数类型,然后定义一个这种类型的变量,你得到地址后,将地址的类型转换并存到那个变量中就行了。例如:
这是RunHook定义:
BOOL _stdcall RunHook(HMODULE hModule,DWORD dwThreadId)
{
HWndHook=::SetWindowsHookEx(WH_CALLWNDPROC,(HOOKPROC)HOOKProc,hMod,dwThreadId);
return TRUE;
}
这是全局声明:
typedef BOOL (_stdcall *funRunHook)(HMODULE hModule,DWORD dwThreadID);
这两种调用都不行:
funRunHook RunHook;
RunHook=(funRunHook)GetProcAddress(hMod,"RunHook");
**************************************************************************************************************************
LoadLibrary加载动态库失败的解决办法
方式一 采用LoadLibraryEx
转载:http://blog.sina.com.cn/s/blog_62ad1b8101017qub.html
若DLL不在调用方的同一目录下,可以用LoadLibrary(L"DLL绝对路径")加载。但若调用的DLL内部又调用另外一个DLL,此时调用仍会失败。解决办法是用LoadLibraryEx:
LoadLibraryEx("DLL绝对路径", NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
通过指定LOAD_WITH_ALTERED_SEARCH_PATH,让系统DLL搜索顺序从DLL所在目录开始。
方式二 采用SetCurrentDir
转载:http://blog.csdn.net/flyayi2006/article/details/5526982
跨目录调用dll,你应该这样
1 用GetCurrentDir保存当前的工作目录
2 用SetCurrentDir将当前的工作目录,设置为你的DLL所在的路径,需要使用绝对路径
3 用LoadLibrary你的DLL
4 使用SetCurrentDir恢复到原来的工作路径
实例:
TCHAR chCurDir[MAX_PATH] = {0};
GetCurrentDirectory(MAX_PATH, chCurDir);
SetCurrentDirectory(_T("E:\\test\\"));
m_hDLL = LoadLibrary(_T("MyTest.dll"));
SetCurrentDirectory(chCurDir);
GetProcAddress() LoadLibrary() DLL相关推荐
- matlab2011没有netframe,loadlibrary失败?matlab loadlibrary?dll文件找不到入口点?用LoadLibrary加载D...
你是否正在寻找关于loadlibrary失败的内容?让我把最完整的东西奉献给你: 当前位置:我的异常网» VC»用LoadLibrary加载DLL失败,为何呢 用LoadLibrary加载DLL失败, ...
- Visual C++ dll
这篇文章来自 http://msdn.microsoft.com/zh-cn/library/1ez7dh12(VS.80).aspx 具体的资料可以参考msdn Visual C++ DLL ...
- 【原创】完美实现GetProcAddress [文字模式]
2019独角兽企业重金招聘Python工程师标准>>> 我们知道kernel32.dll里有一个GetProcAddress函数,可以找到模块中的函数地址,函数原型是这样的: WIN ...
- dll窗体的创建与调用
建立DLL项目: library ShowDllForm; .... Uses ... Exports //输出引用 ShowDllModalForm, //显示模态窗体 ShowDllForm; / ...
- 【C/C++】lib 和 dll 的区别、生成以及使用详解
VS开发多功能模块的项目时,负责不同模块的人员因为权限问题,不能拿到所有源码,但又需要进行功能模块的融合,这就需要使用dll.lib进行"代码共享".在学习dll和lib时,找到了 ...
- BCB 编写 DLL 终极手册
BCB 编写 DLL 终极手册 一. 编写 DLL File/New/Dll 生成 Dll 的向导,然后可以添加导出函数和导出类 导出函数:extern "C" __declspe ...
- Delphi DLL制作和加载 Static, Dynamic, Delayed 以及 Shared-Memory Manager
一 Dll的制作一般分为以下几步: 1 在一个DLL工程里写一个过程或函数 2 写一个Exports关键字,在其下写过程的名称.不用写参数和调用后缀. 二 参数传递 1 参数类型最好与window C ...
- lib和dll的区别、生成以及使用详解
[目录] lib dll介绍 生成动态库 调用动态库 生成静态库 调用静态库 首先介绍一下静态库(静态链接库).动态库(动态链接库)的概念,首先两者都是代码共享的方式. 静态库:在连接步骤中,连接器将 ...
- 如何正确创建DLL和使用DLL
如何正确创建DLL和使用DLL 本文将通过一个简单的实例来说明,如何正确的导出DLL中的类.对象.函数,并如何通过静态加载或动态加载的方式来使用DLL. 一.DLL中导出类.函数.对象 1. 创建一个 ...
最新文章
- Linux centos6.5 64下oracle10g_静默安装完整版
- hdu-6166(最短路+二进制分组)
- android http pos 请求和gson解析处理head头信息
- 网络相关知识点:nginx相关概念
- 使用Ajax解析数据遇到的问题
- ajax设置自定义请求头信息
- iframe多层嵌套时获取元素总结
- 【ElasticSearch】Es 源码之 Transport 和 TransportService 源码解读
- python nums函数获取结果记录集有多少行记录_Python数据分析——Pandas数据结构和操作...
- raster | R语言中的空间栅格对象及其基本处理方法(Ⅱ):投影、属性提取
- 前端-chromeF12 谷歌开发者工具详解 Network篇
- JBoss 目录结构解释
- 我对Backbone的认识
- 模拟集成电路大牛的经验
- R语言 rgl plot3d函数
- 汇编语言第一课作业1.1
- delphi 注册表
- 当div的宽度为百分比时,如何设置成为一个正方形?
- lwip连续发数据卡死_用lwip发送大量数据时,遇到的问题解答记录;
- 计算机18个专业方向