分享
016-C,C++主线程代码传递复杂参数的实现【瑞客论坛 www.ruike1.com】.txt
下载文档

ID:3402495

大小:3.73KB

页数:4页

格式:TXT

时间:2024-04-28

收藏 分享赚钱
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
瑞客论坛 www.ruike1.com 016-C C+主线程代码传递复杂参数的实现【瑞客论坛 www.ruike1.com】 016 C+ 主
016-C,C++主线程代码传递复杂参数的实现 2021在线班 郁金香灬老师 QQ 150330575 交流群:158280115 学习目标: 主线直接调用接口 直接调用角色对象CALL测试 UINT_PTR 寻路CALL = 0x727400; char 参数2[8] = { 0,0,0,0,0,0,0 };//sizeof(char)*8=8 //int 参数二[2] = { 0,0 };//sizeof(int)*2=8 float 坐标[3] = { m_x ,m_y ,m_z }; //>=3 float 坐标xyz[3] = { -9005.76,-131.81, 83.927 }; //>=3 坐标xyz[0] 坐标xyz[1] 坐标xyz[2] MessageBeep(1); UINT_PTR ECX参数 = 返回值ECX;// 获取角色对象指针2(); __asm { push 0 lea eax, 坐标 push eax lea eax, 参数2 push eax push 4 mov ecx, ECX参数 //0x2BEF4B98 //这个参数记得从xdbg里从新获取 不然会出错 call 寻路CALL } void CPAGE00::OnBnClickedButton6FindWay() { // -8914.91,-136.131,80.4179 //新手村 // -8909.37,-104.881,81.8481 亚努斯*哈默纳克 武器锻造师 //float 坐标[3] = { -9005.76,-131.81, 83.927 }; float x = -8914.91; float y = -136.131; float z= 80.4179; 主线CALL_cdecl((UINT_PTR)寻路功能, *(UINT_PTR*)&x, *(UINT_PTR*)&y,*(UINT_PTR*)&z); } void CPAGE00::OnBnClickedButton7QuestSlot() { // TODO: 在此添加控件通知处理程序代码 主线CALL_cdecl((UINT_PTR)使用快捷栏,3); } #include "pch.h" #include "主线程调用CALL.h" #include <string> #include <fstream> #include <vector> #include <cstdio> #include <iostream> using namespace std; WNDPROC g_oldWindowProc = 0; // UINT_PTR _cdecl x86Call8_cdecl(UINT_PTR *argv) //数组传8个参数进来 { UINT_PTR retvar = 0; __asm { mov eax,argv push dword ptr[eax + 7 * 4] //参数6 push dword ptr[eax + 6 * 4] //参数5 push dword ptr[eax + 5 * 4] //参数4 push dword ptr[eax + 4 * 4] //参数3 push dword ptr[eax + 3 * 4] //参数2 push dword ptr[eax + 2 * 4] //参数1 mov ecx, dword ptr[eax + 1 * 4] //ecx参数 call dword ptr[eax + 0 * 4] //功能CALL add esp,0x18 //平栈7个参数 mov retvar,eax } return retvar; } LRESULT CALLBACK newWindowProc( HWND hwnd, // handle to window UINT uMsg, // message identifier WPARAM wParam, // first message parameter LPARAM lParam // second message parameter ) { switch (uMsg) { case WM_USER + 126: { #ifdef DEBUG printf("WM_USER + 126:pcall=%X begin\n", lParam); #endif // !DEBUG __asm { call lParam } #ifdef DEBUG printf("WM_USER + 126:pcall=%X End\n", lParam); #endif // !DEBUG return 123456; } case WM_USER + 128: { UINT_PTR *参数列表 = (UINT_PTR*)lParam; x86Call8_cdecl(参数列表); break; } case WM_USER + 138: { break; } } return CallWindowProcA(g_oldWindowProc, hwnd, uMsg, wParam, lParam); }; //挂接主线程 void 挂接主线程() { if (g_oldWindowProc) return;//如果已经挂接过主线程直接返回 HWND h = 获取窗口句柄(); g_oldWindowProc = (WNDPROC)SetWindowLongPtrA(h, GWLP_WNDPROC, (LONG_PTR)newWindowProc); } void 卸载主线程() { if (g_oldWindowProc==NULL) return;//如果已经挂接过主线程直接返回 HWND h = 获取窗口句柄(); (WNDPROC)SetWindowLongPtrA(h, GWLP_WNDPROC, (LONG_PTR)g_oldWindowProc); } void 调用主线代码(UINT_PTR pcall) { static HWND h = 获取窗口句柄(); ::SendMessageA(h, WM_USER + 126, 0, pcall); } UINT_PTR 主线CALL_cdecl(UINT_PTR pcall, UINT_PTR arg1 , UINT_PTR arg2, UINT_PTR arg3, UINT_PTR arg4, UINT_PTR arg5, UINT_PTR arg6, UINT_PTR vecx) { static HWND h = 获取窗口句柄(); UINT_PTR 参数列表[10] = { pcall,vecx,arg1,arg2,arg3,arg4,arg5,arg6 }; return::SendMessageA(h, WM_USER + 128, 0, (UINT_PTR)参数列表); };

此文档下载收益归作者所有

下载文档
收起
展开