当前位置: 首页 > news >正文

网站建设国际深圳用php做网站后台

网站建设国际深圳,用php做网站后台,怎样建立个人网络平台,青县网站建设咨询接上文【MFC】05.MFC第一大机制#xff1a;程序启动机制-笔记,这一篇文章来带领大家逆向分析MFC第二大机制#xff1a;窗口创建机制的源码。 我们知道#xff0c;在Win32编程中#xff0c;如果我们要创建一个窗口#xff0c;基本步骤为#xff1a; 注册窗口创建一个窗口…接上文【MFC】05.MFC第一大机制程序启动机制-笔记,这一篇文章来带领大家逆向分析MFC第二大机制窗口创建机制的源码。 我们知道在Win32编程中如果我们要创建一个窗口基本步骤为 注册窗口创建一个窗口必须要给一个类名称消息处理回调函数 那么MFC的窗口创建机制又是怎样的呢我们来回溯一下MFC源码 首先我们继续用上文中创建的MFC程序 #include afxwin.h//实现我们自己的框架类 class CMyFrameWnd :public CFrameWnd { public: };//实现我们自己的应用程序类 class CMyApp :public CWinApp { public:CMyApp() {};//重写虚函数virtual BOOL InitInstance() {CMyFrameWnd* pFrame new CMyFrameWnd;pFrame-Create(NULL, LFirstMFC);m_pMainWnd pFrame;pFrame-ShowWindow(SW_SHOW);pFrame-UpdateWindow();return TRUE;} };CMyApp theApp;不难猜到创建窗口的代码在这pFrame-Create(NULL, LFirstMFC);我们就在这行代码上下断点跟过去 我们知道我们重写的的InitInstance函数在WinMian函数转发的AfxwWimMian函数中会被调用 这里给的参数第一个NULL是lpszClassName窗口类名第二个参数是lpszWindowName应用程序类名但是我们了解Win32编程我们知道如果想要创建窗口或者是注册窗口都必须要窗口类名但是这里给的是NULL为什么还是能够正常执行过去呢 virtual BOOL InitInstance(){CMyFrameWnd* pFrame new CMyFrameWnd;//Create函数是框架类的方法//我们知道Create方法的参数肯定不止俩我们跟过去之后发现其他参数是有默认参数的pFrame-Create(NULL, LFirstMFC){//进入函数第一件事判断是否包含菜单如果包含菜单则加载菜单HMENU hMenu NULL;if (lpszMenuName ! NULL){HINSTANCE hInst AfxFindResourceHandle(lpszMenuName, ATL_RT_MENU);if ((hMenu ::LoadMenu(hInst, lpszMenuName)) NULL){TRACE(traceAppMsg, 0, Warning: failed to load menu for CFrameWnd.\n);PostNcDestroy();return FALSE;}}m_strTitle lpszWindowName; // save title for later//这里的代码很明显是创建窗口了但是没有窗口类名怎么能创建窗口呢我们跟进去看看//这里由于其他参数我们不关注这里只留下窗口类名//这里源代码函数实现实在if语句的条件中执行的这里直接拉出来CreateEx( lpszClassName, lpszWindowName,...){//可以看到在这里有断言ASSERT(lpszClassName NULL || AfxIsValidString(lpszClassName) ||AfxIsValidAtom(lpszClassName));ENSURE_ARG(lpszWindowName NULL || AfxIsValidString(lpszWindowName));//这里是创建窗口所需要的类CREATESTRUCT cs;cs.dwExStyle dwExStyle;cs.lpszClass lpszClassName;cs.lpszName lpszWindowName;cs.style dwStyle;cs.x x;cs.y y;cs.cx nWidth;cs.cy nHeight;cs.hwndParent hWndParent;cs.hMenu nIDorHMenu;cs.hInstance AfxGetInstanceHandle();cs.lpCreateParams lpParam;//这里隐含的this指针框架类窗口PreCreateWindow(cs){//跟进去函数也能发现是框架类窗口的方法BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT cs){if (cs.lpszClass NULL){//发现这里有一个貌似MFC注册窗口的函数跟进去看看VERIFY(AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG)){//这些是所需要的类相信大家都很熟悉了WNDCLASS wndcls;memset(wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaultswndcls.lpfnWndProc DefWindowProc;wndcls.hInstance AfxGetInstanceHandle();wndcls.hCursor afxData.hcurArrow;//接下来发现了好多类似的代码应该是判断一些东西我们的代码进入了这个if语句我们就跟进去if (fToRegister AFX_WNDFRAMEORVIEW_REG){//这里是对wndcls做一些赋值操作wndcls.style CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;wndcls.hbrBackground (HBRUSH) (COLOR_WINDOW 1);//代码跟到这里应该是注册窗口了因为吧注册窗口所需要的类传进去了为了以防万一我们跟进去看看if (_AfxRegisterWithIcon(wndcls, _afxWndFrameOrView, AFX_IDI_STD_FRAME)){//代码前部分做了一些赋值操作加载图标//我们跟到这个函数中看看注册操作return AfxRegisterClass(pWndCls){WNDCLASS wndcls;//这里的GetClassInfo是判断窗口是否已经注册过GetClassInfo(lpWndClass-hInstance, lpWndClass-lpszClassName,wndcls)//在这里发现了Win32API注册窗口if (!RegisterClass(lpWndClass))}}}//在注册玩窗口后发现了这段代码//这里的_afxWndFrameOrView是一个宏或者数组跟过去看看发现是个数组//跟到最后发现是FrameOrViewcs.lpszClass _afxWndFrameOrView;}}...return TRUE;}}}//在创建窗口之前发现埋下了一个钩子AfxHookWindowCreate(this){void AFXAPI AfxHookWindowCreate(CWnd* pWnd){//MFC的第三个全局变量_AFX_THREAD_STATE* pThreadState _afxThreadState.GetData();if (pThreadState-m_pWndInit pWnd)return;//这里是埋下了一个创建窗口的消息钩子pThreadState-m_hHookOldCbtFilter ::SetWindowsHookEx(WH_CBT,_AfxCbtFilterHook, NULL, ::GetCurrentThreadId());//如果失败的话抛出异常if (pThreadState-m_hHookOldCbtFilter NULL)AfxThrowMemoryException();}//这里保存了我们的框架类窗口对象pThreadState-m_pWndInit pWnd;}}//发现这里是创建窗口HWND hWnd CreateWindowEx(cs.dwExStyle, cs.lpszClass,cs.lpszName, cs.style, cs.x, cs.y, cs.cx, cs.cy,cs.hwndParent, cs.hMenu, cs.hInstance, cs.lpCreateParams);} }触发的钩子函数 LRESULT CALLBACK _AfxCbtFilterHook(int code, WPARAM wParam, LPARAM lParam) { //MFC第三个全局变量的地址 _AFX_THREAD_STATE* pThreadState _afxThreadState.GetData(); //取出结构体参数 LPCREATESTRUCT lpcs ((LPCBT_CREATEWND)lParam)-lpcs; //多态 父类指针 指向子类 CWnd* pWndInit pThreadState-m_pWndInit //创建的窗口句柄 HWND hWnd (HWND)wParam;//窗口句柄传入了进去 //内部this指针是我们的对象 pWndInit-Attach(hWnd); {//MAP对象CHandleMap* pMap afxMapHWND(TRUE); {//MFC 第二个全局变量 线程模块状态 AFX_MODULE_THREAD_STATE* pState AfxGetModuleThreadState();//把映射类对象 保存到了 第二个全局变量里面pState-m_pmapHWND new CHandleMapreturn pState-m_pmapHWND;}//内部this指针是谁 pMap映射类对象pMap-SetPermanent(this-m_hWnd hWndNew, 框架类对象);{inline void CHandleMap::SetPermanent(HANDLE h, CObject* permOb){//pMap映射类对象this-m_permanentMap[窗口句柄] 框架类对象 pFrame;//stl map map[key] val}}WNDPROC afxWndProc AfxGetAfxWndProc();oldWndProc (WNDPROC)SetWindowLongPtr(hWnd, GWLP_WNDPROC,(DWORD_PTR)afxWndProc); }LRESULT lResult CallNextHookEx(pThreadState-m_hHookOldCbtFilter, code,wParam, lParam);} //真正的窗口过程处理函数 AfxWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam) { CWnd* pWnd CWnd::FromHandlePermanent(hWnd); { CHandleMap* pMap afxMapHWND(); { AFX_MODULE_THREAD_STATE* pState AfxGetModuleThreadState(); pState-m_pmapHWND } return (CObject*)m_permanentMap.GetValueAt((LPVOID)h); }AfxCallWndProc(pWnd, hWnd, nMsg, wParam, lParam) {//父类指针 指向了子类 lResult pWnd-WindowProc(nMsg, wParam, lParam); }}
http://www.ihoyoo.com/news/68173.html

相关文章:

  • wordpress文章底部网站如何自己做优化
  • 青岛企业网站建设优化规划设计公司的发展
  • 搭设企业网站教程设计论坛
  • 织梦建站教程下载wordpress文章到qq群
  • 成都电子商务网站建设网站建设html5作品
  • 模板建站有什么优势安卓系统最好优化软件
  • 个人站长做导航网站辽宁专业网页设计免费建站
  • 免费搭建永久网站步骤辽宁省住房和城乡建设厅网站上不去
  • 电商网站开发文献综述网络营销策划书范文模板
  • 东莞个人网站制作自动做PPT的网站
  • 阿狸网站建设wordpress汉化插件
  • 房地产网站案例河南天丰建设工程有限公司网站
  • 大型网站技术架构:核心原理与案例分析浙江响应式网站建设
  • 郑州的做网站公司龙华做网站的
  • 网站规划市场分析推广企业网站最主要的方式
  • seo做论坛和企业网站差别wordpress给关键词加内链的方法
  • 广州住房与城乡建设部网站做网站公司有哪些
  • 网页显示网站正在建设中怎么做西宁建设网站多少钱
  • 狮城app更多网站上海外贸soho网站建设
  • 苏州做企业网站的公司策划书网站项目目标需求分析
  • 做电子商务系统网站建设wordpress下载服务器文件
  • 山东省城市建设管理协会网站合肥设计公司排名
  • 手机网站设计推荐做风险代理案源的网站
  • 企业如何建公司网站add_action wordpress
  • 石家庄网站建设解决方案广州域名注册
  • 有哪些公司的网站做的比较好个人网站可以收费吗
  • 教育网站框架模板asp网站开发心得体会
  • 扁平化设计网站欣赏wordpress优化技巧
  • 网站建设朋友圈怎么写安卓app是用什么语言开发的
  • 网站建设网站设上海市城市建设投资开发总公司网站