|
原贴: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下编译通过,代码如下:
- typedef struct _DLGTEMPLATE_EX{
- DWORD style;
- DWORD dwExtendedStyle;
- DWORD cdit;
- short x;
- short y;
- short cx;
- short cy;
- short width;
- short px;
- short high;
- short py;
- wchar_t mText[1];//修改后的代码
- } DLGTEMPLATE_EX;
- typedef CONST DLGTEMPLATE_EX *LPCDLGTEMPLATE_EX;
- typedef LPCDLGTEMPLATE_EX LPCDLGTEMPLATE_EX;
- int CVC6DemoDlg::DoModal()
- {
- // TODO: Add your specialized code here and/or call the base class
- LPCDLGTEMPLATE_EX lpDialogTemplate = NULL;
- HGLOBAL hDialogTemplate = NULL;
- TCHAR *pNewClassName = NULL;
- HINSTANCE hInst = AfxGetResourceHandle();
- do
- {
- if (m_lpszTemplateName == NULL) break;
- hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
- HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
- hDialogTemplate = LoadResource(hInst, hResource);
- if (hDialogTemplate == NULL) break;
- lpDialogTemplate = (LPCDLGTEMPLATE_EX)LockResource(hDialogTemplate);
- if (lpDialogTemplate == NULL) break;
- MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修改前的类名", 0);
- //根据原始mText长度生成mText随机字符创
- DWORD dwProtect = 0;
- wchar_t *pClassName = (wchar_t*)lpDialogTemplate->mText;
- int nNameLen = wcslen(pClassName);
- pNewClassName = new TCHAR[nNameLen+1];
- if (pNewClassName == NULL) break;
- memset(pNewClassName, 0, (nNameLen+1)*sizeof(TCHAR));
- if (VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), PAGE_READWRITE, &dwProtect) == FALSE) break;
- const char szText[] = "qwertyuiopasdfghjklzxcvbnm1234567890";
- srand(time(NULL));//以时间作为随机种子
- for (int i=0; i<nNameLen; ++i)
- {
- int j = rand() % 35; //这里表示产生0~35的随机数
- pClassName[i] = szText[j];//修改原始类名; Ansi的字符可以直接赋值给Unicode
- pNewClassName[i] = szText[j];
- }
- VirtualProtect(pClassName, nNameLen*sizeof(wchar_t), dwProtect, &dwProtect);
- MessageBoxW(0, (LPCWSTR)lpDialogTemplate->mText, L"修改后的类名", 0);
- WNDCLASS wc = { 0 };
- ::GetClassInfo(AfxGetInstanceHandle(), TEXT("#32770"), &wc);
- wc.lpszClassName = pNewClassName;
- AfxRegisterClass(&wc);
- } while (0);//只循环一次
- if (pNewClassName) delete [] pNewClassName;
- if (lpDialogTemplate) UnlockResource(hDialogTemplate);
- if (hDialogTemplate!=NULL) ::FreeResource(hDialogTemplate);
- return CDialog::DoModal();
- }
复制代码
|
评分
-
查看全部评分
上一篇: 为什么相同的代码相同的时间,win2008能截百余张图,win2019只能截30张?下一篇: 想学习逆向但有找不到方向的可以进来。
|