VC++中Depends工具的使用和DLL函数的动态调用方式示例

VC++中Depends工具;Depends用来显示与一个可执行文件(exe或者dll)相关的依赖项(动态链接库dll),以及该exe或dll引用了这些dll中的哪些接口,同时也可以看到每个被依赖的dll中的所有导出的函数接口。

在VC6位于如下目录;

加载一个系统dll查看一下;出现下图错误提示;大致说...加载失败...循环依赖...;因为此dll又调用了其它dll;

左上角是Dll信息窗口,显示引用到的Dll模块,
右边第一个窗口是所选的Dll模块所使用的函数,
右边第二个窗口是所选Dll模块的所有的导出函数,
下面窗口是所有需要的Dll模块的属性,
右边两个窗口出现四个标签:序号,提示,函数,入口点;
如果导出是函数,那么出现函数名,如果导出的是序号,那么函数项就是N/A(无法显示)出现红色提示表示不正常,一般为没有该导出函数;

看一下系统自带的ICMP.dll;就是实现ping功能的那个;

在C++中有一种dll函数调用方式;就是通过LoadLibrary、 GetProcAddress,载入模块之后,获取函数地址,通过函数地址来调用函数;在安全类编程中会用到;

下面来看一下示例;获取user32中的MessageBox函数地址;

   新建一个VC++ MFC工程;

CPP文件包含此句:#include <windows.h>
CPP文件头部添加:typedef void (*MYPROC)(LPTSTR);
在某个消息处理函数中,单击菜单或按钮,或对话框初始化消息;添加如下代码;显示载入DLL以后的DLL模块地址和MessageBoxA函数地址;
   

    HINSTANCE LibHandle;
    MYPROC ProcAdd;
    LibHandle = LoadLibrary("user32");
    
    CString temp_value1 = _T("");
    temp_value1.Format(_T("user32 LibHandle = 0X%x\n"), LibHandle);
    AfxMessageBox(temp_value1);

    ProcAdd=(MYPROC)GetProcAddress(LibHandle,"MessageBoxA");    
    CString temp_value2 = _T("");
    temp_value2.Format(_T("MessageBoxA = 0X%x\n"), ProcAdd);
    AfxMessageBox(temp_value2);

运行结果如下;环境是Win10,VC6;

也就是说载入uder32 DLL的基址在0x74ab0000;MessageBoxA函数地址在基址之后一些;

发布了475 篇原创文章 · 获赞 545 · 访问量 304万+

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/105002432