GetProcAddress和直接用函数名获得的地址为啥不一样?

wjk98550328 2007-09-01 10:17:01
一个exe调用一个dll,GetProcAddress获得这个dll中一个函数的地址,跟直接用这个函数名获得的地址不一样?为什么?
请大侠帮忙分析,谢谢。
//附件为整个工程。

FunPtr_Type1 xx1=DllTestFun1;

printf("SP DllTestFun1 address :%x \n",xx1);


//
{
HMODULE XXModule=::LoadLibrary("DllTest.dll");
FunPtr_Type1 xx1=(FunPtr_Type1)GetProcAddress(XXModule,"DllTestFun1");
printf("DP DllTestFun1 address :%x \n",xx1);
//
FreeLibrary(XXModule);
}
...全文
312 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuelong_zl 2007-09-02
  • 打赏
  • 举报
回复
而GetProcAddress messageboxA得到的是user32.dll的加载基址(PE结构中的问题)+42A314h,即user32.dll被加载到进程空间后,messageboxA的真实入口地址

//==========================================================

汗,说错了,是42A314h内块内存地址中存放messageboxA的真实入口地址
gfxiang 2007-09-02
  • 打赏
  • 举报
回复
第一个显示的是程序跳转到dll中函数的真正入口指令的地址,这个跳转指令是由编译器生成的,因为在编译的时候,编译器不知道dll中函数在内存中确切地址。在装载程序的时候,等dll装载完后,dll中的函数在内存中的地址也就确定下来,然后装载器把dll中函数的真实地址填到跳转指令后面来实现跳转到真正的API函数。
第二个显示的就是dll中函数在内存的真实地址
xuelong_zl 2007-09-02
  • 打赏
  • 举报
回复
拿messageboxA这个api说吧

printf messageboxA 实际上是call dword ptr [__imp__MessageBoxA@16 (42A314h)] 这条指令的地址值

而GetProcAddress messageboxA得到的是user32.dll的加载基址(PE结构中的问题)+42A314h,即user32.dll被加载到进程空间后,messageboxA的真实入口地址。
ddc 2007-09-02
  • 打赏
  • 举报
回复
"直接用这个函数名获得的地址"什么意思?难道不用GetProcAddress,那就是静态加载了,dll加载的地址不一样,当然函数地址也不一样。

15,440

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧