加载改名后的User32 MessageBox的奇怪问题

ProgrammingRing 2014-03-17 01:31:45
今天在论坛看到一个问题: 在Win7 x86下将user32.dll复制到当前目录并改名, 如下面的user.dll, 然后用LoadLibrary加载, GetProcAddress获得MessageBoxW的地址并调用, 但是弹出的对话框中只显示标题, 内容和按钮上面的文本不显示, 但是用spy++查看内容或按钮时, 却可以在标题栏中看到信息, 这是怎么回事?
还有就是当将user32.dll复制2份并分别改名, 如abc.dll和ddd.dll, 然后分别加载和获取MessageBoxW的地址, 依次调用获取的MessageBoxW, 第一次调用可以弹出对话框, 但是问题如上所述, 第二次调用就不弹了, 看错误是"类已经定义", 这个是不是因为在当前进程中已经有模块在前面注册过一次对话框的类了, 不同模块不能再用相同的类名再次注册了?
#include <windows.h>

typedef int (WINAPI *PMESSAGEBOXW)(HWND, PCWSTR, PCWSTR, INT);

int _tmain(int argc, _TCHAR* argv[])
{
HMODULE User32Module = LoadLibrary(L"user.dll");
PMESSAGEBOXW funcMessageBoxW = (PMESSAGEBOXW)GetProcAddress(User32Module,
"MessageBoxW");
if (NULL != funcMessageBoxW)
funcMessageBoxW(NULL, L"Test", L"T_T", 0);
if (User32Module)
FreeLibrary(User32Module);

return 0;
}
...全文
180 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammingRing 2014-03-17
  • 打赏
  • 举报
回复
引用 1 楼 VisualEleven 的回复:
Windows XP下直接错误,user.dll无法重定位,user.dll会占用系统user32.dll地址空间,从而出错。
我在xp下试过, 是错误, 问题是Win7下, 并没有出错, 而是可以弹出, 但是会出现不显示内容的问题, 这是咋回事?
Eleven 2014-03-17
  • 打赏
  • 举报
回复
Windows XP下直接错误,user.dll无法重定位,user.dll会占用系统user32.dll地址空间,从而出错。

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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