加载改名后的User32 MessageBox的奇怪问题
今天在论坛看到一个问题: 在Win7 x86下将user32.dll复制到当前目录并改名, 如下面的user.dll, 然后用LoadLibrary加载, GetProcAddress获得MessageBoxW的地址并调用, 但是弹出的对话框中只显示标题, 内容和按钮上面的文本不显示, 但是用spy++查看内容或按钮时, 却可以在标题栏中看到信息, 这是怎么回事?
还有就是当将user32.dll复制2份并分别改名, 如abc.dll和ddd.dll, 然后分别加载和获取MessageBoxW的地址, 依次调用获取的MessageBoxW, 第一次调用可以弹出对话框, 但是问题如上所述, 第二次调用就不弹了, 看错误是"类已经定义", 这个是不是因为在当前进程中已经有模块在前面注册过一次对话框的类了, 不同模块不能再用相同的类名再次注册了?
还有就是当将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;
}
...全文
相关推荐
Go语言MessageBox用法实例
然后,我们加载user32.dll和kernel32.dll动态链接库,分别用于获取MessageBoxW函数和处理模块句柄。
C#实现winform自动关闭MessageBox对话框的方法
CharSet.Auto)] private extern static IntPtr FindWindow(string lpClassName, string lpWindowName); [DllImport("user32
在C#程序中对MessageBox进行定位的方法
方法内部,我们持续查找窗口直到找到MessageBox,然后获取其原始矩形,最后使用`MoveWindow`函数将MessageBox移动到指定位置。
MessageBox用法举例说明(C#)
添加图标我们可以给 MessageBox 添加一个图标,例如 `if (MessageBox.Show("Delete this user?"
自动关闭MessageBox
代码示例如下:```csharp[DllImport("user32.dll")]private static extern bool PostMessage(IntPtr hWnd, uint msg


进程/线程/DLL
