1
/2
LoadLibrary函数的声明如下,它只有一个参数,指明要加载的动态库。
2
/2
GetProcAddress函数的声明如下,它有两个参数,一个是LoadLibrary函数返回的模块句柄,一个是要获取的函数名称。
二、动态加载动态库的实例
1
/7
这里以user32.dll中的MessageBox函数为例,开发环境使用vs2017。首先点击“文件”——“新建”——“项目”建立一个win32控制台程序。
2
/7
正常的使用MessageBox代码如下,直接调用即可。
//vs2017中的代码
#include <tchar.h>
#include <windows.h>
int main(){
MessageBox(0, _T("hello world!"), _T("MessageBox"), MB_OK)
return 0
}
3
/7
如果使用动态加载,则需要首先用LoadLibrary函数加载user32.dll。
4
/7
然后定义一个函数指针类型,用定义的函数指针类型定义函数指针。用于保存GetProcAddress()获取的MessageBox函数地址。
5
/7
然后通过GetProcAddress()获取其函数地址。
6
/7
最后通过函数指针调用MessageBox()函数即可。
好久没回答问题了 尝试一下打开文件的办法
CHAR lpExeFilename[MAX_PATH] = ""
HINSTANCE hInstance = GetModuleHandle(NULL)
GetModuleFileName(hInstance, lpExeFilename, MAX_PATH)
HANDLE hFile = CreateFile(lpExeFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTES_NORMAL, NULL)
//todo:判断是否打开成功
CHAR lpBuffer[100]
ReadFile(hFile, ...)
//todo:处理固定偏移
CloseHandle(hFile)
以上是比较稳妥的办法 事实上如果对于进程的创建有一定理解的话
就应该知道GetModuleHandle(NULL)调用返回的就是进程文件加载到内存的地址了
完全可以这样得到首地址:
LPCSTR lpcBuffer = (LPCSTR)GetModuleHandle(NULL)
然后lpcBuffer[1] 就是你说的0x000000001了
手头没有调试器 个别地方可能有笔误 见谅
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)