VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 219|回复: 1

[分享] [转贴]小技巧:MFC对话框动态类名

[复制链接]
20_avatar_middle
最佳答案
4 
在线会员 发表于 2020-5-6 23:56:42 | 显示全部楼层 |阅读模式
原贴:https://bbs.pediy.com/thread-194716.htm

-------------------原文----------------------------------------
网上关于MFC对话框类名的帖子基本上都是静态改变,然后重新编译的方式。
但是如果需要每次运行时类名都变化一下,就非常不方便了。

想要做到动态改变类名,首先我们要对MFC的实现进行一些了解(MFC代码是开元的,所以这类不重复了)。

通过使用VS自带的调试功能分析一个对话框在调用DoModel之后和PreInitDialog之前的代码。
跟踪对话框类名初始化等过程。
最后发现对话框是根据资源里读取的对话框定义中的CLASS进行使用类名创建XXOO的~

所以先创建一个对话框,然后资源属性,讲MFC Mode改成false
然后选中对话框,属性修改ClassName为随便写的至少3个字符的字符串,比如123,想随机长点就写长点的字符串。

然后类向导,在虚函数一项上添加一个DoModal的实现。
-----------------------------------------------------------------

PS:原贴是使用VS2013编译的,并且只支持unicode。为了能支持ANSI,修改了下代码。
修改后的代码,VC6下编译通过,代码如下:
  1. typedef struct _DLGTEMPLATE_EX{
  2.     DWORD style;
  3.     DWORD dwExtendedStyle;
  4.     DWORD cdit;
  5.     short x;
  6.     short y;
  7.     short cx;
  8.     short cy;
  9.     short width;
  10.     short px;
  11.     short high;
  12.     short py;
  13.         wchar_t mText[1];//修改后的代码
  14. } DLGTEMPLATE_EX;
  15. typedef CONST DLGTEMPLATE_EX *LPCDLGTEMPLATE_EX;
  16. typedef LPCDLGTEMPLATE_EX LPCDLGTEMPLATE_EX;

  17. int CVC6DemoDlg::DoModal()
  18. {
  19.         // TODO: Add your specialized code here and/or call the base class
  20.         LPCDLGTEMPLATE_EX lpDialogTemplate = NULL;
  21.     HGLOBAL hDialogTemplate = NULL;
  22.         TCHAR *pNewClassName = NULL;
  23.     HINSTANCE hInst = AfxGetResourceHandle();

  24.         do
  25.         {
  26.                 if (m_lpszTemplateName == NULL) break;
  27.                 hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
  28.         HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
  29.         hDialogTemplate = LoadResource(hInst, hResource);
  30.                 if (hDialogTemplate == NULL) break;
  31.                 lpDialogTemplate = (LPCDLGTEMPLATE_EX)LockResource(hDialogTemplate);
  32.                 if (lpDialogTemplate == NULL) break;
  33.                 MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修改前的类名", 0);
  34.                 //根据原始mText长度生成mText随机字符创
  35.                 DWORD dwProtect = 0;
  36.                 wchar_t *pClassName = (wchar_t*)lpDialogTemplate->mText;
  37.                 int nNameLen = wcslen(pClassName);
  38.                 pNewClassName = new TCHAR[nNameLen+1];
  39.                 if (pNewClassName == NULL) break;
  40.                 memset(pNewClassName, 0, (nNameLen+1)*sizeof(TCHAR));
  41.                 if (VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), PAGE_READWRITE, &dwProtect) == FALSE) break;
  42.                 const char szText[] = "qwertyuiopasdfghjklzxcvbnm1234567890";
  43.                 srand(time(NULL));//以时间作为随机种子
  44.                 for (int i=0; i<nNameLen; ++i)
  45.                 {
  46.                         int j = rand() % 35; //这里表示产生0~35的随机数
  47.                         pClassName[i] = szText[j];//修改原始类名; Ansi的字符可以直接赋值给Unicode
  48.                         pNewClassName[i] = szText[j];
  49.                 }
  50.                 VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), dwProtect, &dwProtect);
  51.                 MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修改后的类名", 0);
  52.                 WNDCLASS  wc = { 0 };
  53.         ::GetClassInfo(AfxGetInstanceHandle(), TEXT("#32770"), &wc);
  54.         wc.lpszClassName = pNewClassName;
  55.         AfxRegisterClass(&wc);
  56.         } while (0);//只循环一次

  57.         if (pNewClassName) delete [] pNewClassName;
  58.     if (lpDialogTemplate) UnlockResource(hDialogTemplate);
  59.     if (hDialogTemplate!=NULL) ::FreeResource(hDialogTemplate);

  60.         return CDialog::DoModal();
  61. }
复制代码


评分

参与人数 1热心值 +3 收起 理由
75_avatar_small wl1383838438 + 3 赞一个!

查看全部评分





上一篇:为什么相同的代码相同的时间,win2008能截百余张图,win2019只能截30张?
下一篇:想学习逆向但有找不到方向的可以进来。
50_avatar_middle
最佳答案
0 
在线会员 发表于 2020-8-9 21:24:16 | 显示全部楼层
厉害666666666666666666666666++厉害了
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号 )|网站地图wx_jqr

GMT+8, 2020-10-26 02:48

Powered by CcTry.CoM

© 2009-2020 cctry.com

快速回复 返回顶部 返回列表