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

国之珍微站个人网站蚂蚁链接bt链接

国之珍微站个人网站,蚂蚁链接bt链接,wordpress表格编辑,导购 网站模板相比于MFC的消息机制,WTL/ATL的实现更加优雅。后者将win32 API与面向对象技术完美地结合起来,去掉了庞杂的MFC依赖,生成的软件体积更小,运行速度更快。在其中,如何将窗口函数转变为对窗口对象成员函数的调用&#xff0…

相比于MFC的消息机制,WTL/ATL的实现更加优雅。后者将win32 API与面向对象技术完美地结合起来,去掉了庞杂的MFC依赖,生成的软件体积更小,运行速度更快。在其中,如何将窗口函数转变为对窗口对象成员函数的调用,是WTL/ATL消息机制的核心。以下利用trunk技术模拟了这一过程,仅供参考:

#include <Windows.h>
#include <assert.h>
#include <tchar.h>
thread_local void* pWnd = nullptr;#pragma pack(push,1)
struct _StdCallThunk32//x86
{DWORD		m_mov;ULONG_PTR   m_this;BYTE		m_jmp;ULONG_PTR   m_relproc;void Init(ULONG_PTR wPtr, ULONG_PTR proc){m_mov = 0x042444C7;//mov dword ptr [esp+4], pThism_this = wPtr;m_jmp = 0xe9;//jmp pRelFuncm_relproc = proc;}
};struct _StdCallThunk64//x64
{unsigned char mov_rax_1[2];unsigned char object[sizeof(ULONG_PTR)];unsigned char mov_rax_to_rcx[3];unsigned char mov_rax_2[2];unsigned char procedure[sizeof(ULONG_PTR)];unsigned char jump_rax[3];void Init(ULONG_PTR wPtr, ULONG_PTR proc){mov_rax_1[0] = 0x48;//mov rax, pThismov_rax_1[1] = 0xb8;memcpy(object, &wPtr, sizeof(ULONG_PTR));mov_rax_to_rcx[0] = 0x48;//mov rcx,raxmov_rax_to_rcx[1] = 0x89;mov_rax_to_rcx[2] = 0xc1;mov_rax_2[0] = 0x48;//mov rax, pFuncmov_rax_2[1] = 0xb8;memcpy(procedure, &proc, sizeof(ULONG_PTR));jump_rax[0] = 0x48;//jmp raxjump_rax[1] = 0xff;jump_rax[2] = 0xe0;}
};#pragma pack(pop)#if defined(_WIN64)
typedef struct _StdCallThunk64 StdCallThunk;
#elif defined(_WIN32)
typedef struct _StdCallThunk32 StdCallThunk;
#endif
class Window
{
public:Window();~Window();public:BOOL Create();protected:LRESULT WndProc(UINT message, WPARAM wParam, LPARAM lParam);protected:HWND          m_hWnd;StdCallThunk* m_pThunk;protected:static LRESULT CALLBACK TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);static LRESULT CALLBACK StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
};Window::Window():m_hWnd(NULL),m_pThunk(nullptr)
{}Window::~Window()
{if(m_pThunk != nullptr)VirtualFree(m_pThunk, sizeof(StdCallThunk), MEM_RELEASE);
}BOOL Window::Create()
{LPCTSTR lpszClassName = _T("ClassName");HINSTANCE hInstance = GetModuleHandle(NULL);WNDCLASSEX wcex = { sizeof(WNDCLASSEX) };wcex.lpfnWndProc = TempWndProc;wcex.hInstance = hInstance;wcex.lpszClassName = lpszClassName;wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);ATOM regRes = RegisterClassEx(&wcex);pWnd = this;m_pThunk = (StdCallThunk*)VirtualAlloc(NULL, sizeof(StdCallThunk), MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);m_hWnd = CreateWindow(lpszClassName, NULL, WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);if (m_hWnd == NULL){return FALSE;}ShowWindow(m_hWnd, SW_SHOW);UpdateWindow(m_hWnd);return TRUE;
}LRESULT Window::WndProc(UINT message, WPARAM wParam, LPARAM lParam)
{switch (message){case WM_LBUTTONUP:MessageBox(m_hWnd, _T("LButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);break;case WM_RBUTTONUP:MessageBox(m_hWnd, _T("RButtonUp"), _T("Message"), MB_OK | MB_ICONINFORMATION);break;case WM_DESTROY:PostQuitMessage(0);break;default:break;}return DefWindowProc(m_hWnd, message, wParam, lParam);
}LRESULT CALLBACK Window::TempWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{Window* pThis = (Window*)pWnd;assert(pThis != nullptr);WNDPROC pWndProc = (WNDPROC)pThis->m_pThunk;
#if defined(_WIN64)ULONG_PTR rel = (LONG_PTR)&Window::StaticWndProc;auto ret = SetWindowLongPtr(hWnd, GWLP_WNDPROC, (ULONG_PTR)pWndProc);
#elif defined(_WIN32)ULONG_PTR rel = (DWORD)&Window::StaticWndProc - ((DWORD)pThis->m_pThunk + sizeof(StdCallThunk));auto ret = SetWindowLong(hWnd, GWLP_WNDPROC, (ULONG)pWndProc);
#endifpThis->m_pThunk->Init((ULONG_PTR)pThis, rel);//FlushInstructionCache(GetCurrentProcess(), pThis->m_pThunk, sizeof(StdCallThunk));pThis->m_hWnd = hWnd;return pWndProc(hWnd, message, wParam, lParam);
}LRESULT CALLBACK Window::StaticWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{return ((Window*)hWnd)->WndProc(message, wParam, lParam);
}int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{Window wnd;wnd.Create();MSG msg;while (GetMessage(&msg, NULL, 0, 0)){TranslateMessage(&msg);DispatchMessage(&msg);}return (int)msg.wParam;
}

http://www.dtcms.com/wzjs/66820.html

相关文章:

  • 基金会网站建设方案品牌推广渠道
  • 网站美工培训课程jsurl中文转码
  • 怎么优化自己的网站网站怎样做推广
  • 跨境电商的发展现状大兵seo博客
  • 上海网站建设服务是什么本站3天更换一次域名yw
  • 株洲做网站360优化大师下载
  • 承包装修工程平台广州网站优化多少钱
  • 安顺网站建设兼职阿里云搜索引擎
  • excel可以做网站吗seo如何优化网站推广
  • 个人网站备案怎么做陕西网络营销优化公司
  • 网站banner图片制作成都网站优化seo
  • 南京做网站需要多少钱百度推广优化怎么做的
  • 阿拉丁做网站怎么做的seo建站网络公司
  • 苏州一建建筑集团有限公司seo推广的特点
  • 石家庄微网站建设电脑网页制作
  • 迎春彩灯制作公司站内优化
  • 网站做百度小程序改造的好处seo方案书案例
  • 购物网站创建今日头条新闻在线看
  • 专业微信网站建设公司首选公司seo每日工作内容
  • 办公室装修计入什么会计科目昆明排名优化
  • 怎样做网站链接免费网站建设
  • 手机移动端网站建设宣传福州关键词排名软件
  • 宝鸡网站设计seo怎么优化
  • 做汉字网站的外国人输入关键词就能写文章的软件
  • 眉山网站建设网页制作成品
  • 用网站做淘宝客的人多吗网上国网app推广方案
  • wordpress博客福利网整站源码爱网站关键词查询工具
  • 网站定制联通卡上海百度推广官方电话
  • 临海企业网站设计南宁seo公司哪家好
  • 怎样自己免费搭建网站互联网十大企业