查看: 206|回复: 1

[VC] C++封装DLL易语言调用实现功能菜单方法

[复制链接]

325

主题

325

帖子

989

积分

高级会员

Rank: 4

积分
989
发表于 2019-3-15 21:04:12 | 显示全部楼层 |阅读模式
C++封装DLL具体流程我这里用的是大众的方法。
第一步:先创建一个dll动态库--->添加自己要写的函数的头文件和cpp文件,
接下来要注意的是:要给易语言调用C++写的动态dll,需要在C++声明的函数之前加上"_stdcall ",注意前面有个下划线
要导出在dll里的函数前缀加上extern "C" __declspec(dllexport)
以自己的代码为例子,我建立了fir.h和fir.cpp,
在fir.h里面
  1. #pragma once//防止编译多次
  2. #include<Windows.h>//读写内存函数的头文件
  3. extern "C" __declspec(dllexport) int _stdcall  obj();//获取窗口句柄
  4.  
  5. extern "C" __declspec(dllexport) int _stdcall  gethpro();//获取进程句柄
  6.  
  7. extern "C" __declspec(dllexport) void _stdcall  upup(int sum);//修改阳光
  8.  
  9. extern "C" __declspec(dllexport) void _stdcall update();//无冷却实现
复制代码

在fir.cpp中
  1. #include"fir.h"
  2. #include"stdafx.h"
  3. #include<stdlib.h>
  4. #include <tchar.h>
  5.  
  6. constexpr auto BaseAddr = 0x006A9EC0; //这个是游戏的基址
  7.  
  8. extern "C" __declspec(dllexport) int _stdcall  obj()//获取窗口句柄
  9. {
  10.         HWND hwnd = ::FindWindow(NULL, _T("植物大战僵尸中文版"));
  11.         return (int)hwnd;
  12. }
  13.  
  14. extern "C" __declspec(dllexport) int _stdcall gethpro()//获取进程句柄
  15. {
  16.         HWND hwmd1 = ::FindWindow(NULL, _T("植物大战僵尸中文版"));
  17.         DWORD dwpid;
  18.         GetWindowThreadProcessId(hwmd1, &dwpid); //进程pid保存在这个变量dwpid中
  19.         HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwpid);
  20.         if (hProcess <=0)
  21.         {
  22.                 MessageBox(NULL, TEXT("获取句柄出错"),
  23.                         TEXT("读取失败"), MB_YESNO | MB_ICONQUESTION);
  24.                 exit(1);
  25.         }
  26.  
  27.         return (int)hProcess;
  28. }
  29.  
  30. extern "C" __declspec(dllexport) void _stdcall upup(int sum)//更新阳光
  31. {
  32.         HANDLE hProcess = (HANDLE)gethpro();
  33.         DWORD d = sum;
  34.         int Addr=0;       //临时保存的地址
  35.         ReadProcessMemory(hProcess, (LPCVOID)(BaseAddr), &Addr, 4, 0);
  36.         ReadProcessMemory(hProcess, (LPCVOID)(Addr + 0x768), &Addr, 4, 0);
  37.         WriteProcessMemory(hProcess, (LPVOID)(Addr + 0x5560), &d, 4, 0);
  38.  
  39. }
  40.  
  41. extern "C" __declspec(dllexport) void _stdcall update()//所有方框无冷却
  42. {
  43.         HANDLE hProcess = (HANDLE)gethpro();
  44.         int value = 1;//设置值为1方框就无冷却
  45.         int Addr=0;  //临时保存的地址
  46.         ReadProcessMemory(hProcess, (LPVOID)(BaseAddr), &Addr, 4, 0);
  47.         ReadProcessMemory(hProcess, (LPVOID)(Addr + 0x768), &Addr, 4, 0);
  48.         ReadProcessMemory(hProcess, (LPCVOID)(Addr + 0x144), &Addr, 4, 0);
  49.  
  50.         for (int i = 0; i < 10; i++)//利用循环每次加50,循环10次实现10个方框无冷却
  51.         {
  52.                 WriteProcessMemory(hProcess,
  53.                         (LPVOID)(Addr + 0x70 + (0x50)*i), &value, 4, 0);
  54.         }
  55. }
复制代码

第二步:然后生成dll,接下来把dll从debug目录里拷贝出来,随便拷贝到一个路径。
第三步:打开易语言,插入dll命令,接下来的自己百度就好啦。易语言调用dll挺简单的。
给大家分享一个dll函数查看器,因为dll生成之后,里面的函数名,跟你在C++里面写的名字有一定差异,。dll查看器我也会一并打包上传。
就比如我在上面写的update是无冷却函数,在dll里面函数名却是"_update@4 ",所以这里要注意,不然你用易语言调用他会显示找不到这个命令的
易语言我的源码也基本全写了注释方便大家观看,大家有更好的菜单也可以自己弄,这里只是举个简单的全局热键菜单的例子。

C++封装DLL易语言调用实现功能菜单方法

C++封装DLL易语言调用实现功能菜单方法

游客,如果您要查看本帖隐藏内容请回复
回复

使用道具 举报

0

主题

26

帖子

56

积分

注册会员

Rank: 2

积分
56
发表于 2019-4-4 14:17:54 | 显示全部楼层
好人一生平安
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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