本帖最后由 NSYGHIHI 于 2019-3-15 17:17 编辑
大家好我是老凝,学习C++也半年了,昨天突然想到能不能用C++写的DLL给易语言调用,突然冒出了这个想法后来学习了半天,终于实现了。
先放上效果图一览,这篇文章适合刚入门dll调用的萌新(不是小白 ),结尾会分享dll和全部源代码,
下个阶段我还会更新CS透视自瞄的dll和dll里面全部代码的注释希望可以帮到大家。
C++封装DLL具体流程我这里用的是大众的方法。
第一步:先创建一个dll动态库--->添加自己要写的函数的头文件和cpp文件,
接下来要注意的是:要给易语言调用C++写的动态dll,需要在C++声明的函数之前加上"_stdcall ",注意前面有个下划线
要导出在dll里的函数前缀加上extern "C" __declspec(dllexport)
以我自己的代码为例子,我建立了fir.h和fir.cpp,
在fir.h里面
[C++] 纯文本查看 复制代码 #pragma once//防止编译多次
#include<Windows.h>//读写内存函数的头文件
extern "C" __declspec(dllexport) int _stdcall obj();//获取窗口句柄
extern "C" __declspec(dllexport) int _stdcall gethpro();//获取进程句柄
extern "C" __declspec(dllexport) void _stdcall upup(int sum);//修改阳光
extern "C" __declspec(dllexport) void _stdcall update();//无冷却实现
在fir.cpp中
[C++] 纯文本查看 复制代码 #include"fir.h"
#include"stdafx.h"
#include<stdlib.h>
#include <tchar.h>
constexpr auto BaseAddr = 0x006A9EC0; //这个是游戏的基址
extern "C" __declspec(dllexport) int _stdcall obj()//获取窗口句柄
{
HWND hwnd = ::FindWindow(NULL, _T("植物大战僵尸中文版"));
return (int)hwnd;
}
extern "C" __declspec(dllexport) int _stdcall gethpro()//获取进程句柄
{
HWND hwmd1 = ::FindWindow(NULL, _T("植物大战僵尸中文版"));
DWORD dwpid;
GetWindowThreadProcessId(hwmd1, &dwpid); //进程pid保存在这个变量dwpid中
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwpid);
if (hProcess <=0)
{
MessageBox(NULL, TEXT("获取句柄出错"),
TEXT("读取失败"), MB_YESNO | MB_ICONQUESTION);
exit(1);
}
return (int)hProcess;
}
extern "C" __declspec(dllexport) void _stdcall upup(int sum)//更新阳光
{
HANDLE hProcess = (HANDLE)gethpro();
DWORD d = sum;
int Addr=0; //临时保存的地址
ReadProcessMemory(hProcess, (LPCVOID)(BaseAddr), &Addr, 4, 0);
ReadProcessMemory(hProcess, (LPCVOID)(Addr + 0x768), &Addr, 4, 0);
WriteProcessMemory(hProcess, (LPVOID)(Addr + 0x5560), &d, 4, 0);
}
extern "C" __declspec(dllexport) void _stdcall update()//所有方框无冷却
{
HANDLE hProcess = (HANDLE)gethpro();
int value = 1;//设置值为1方框就无冷却
int Addr=0; //临时保存的地址
ReadProcessMemory(hProcess, (LPVOID)(BaseAddr), &Addr, 4, 0);
ReadProcessMemory(hProcess, (LPVOID)(Addr + 0x768), &Addr, 4, 0);
ReadProcessMemory(hProcess, (LPCVOID)(Addr + 0x144), &Addr, 4, 0);
for (int i = 0; i < 10; i++)//利用循环每次加50,循环10次实现10个方框无冷却
{
WriteProcessMemory(hProcess,
(LPVOID)(Addr + 0x70 + (0x50)*i), &value, 4, 0);
}
}
第二部:然后生成dll,接下来把dll从debug目录里拷贝出来,随便拷贝到一个路径。
第三步:打开易语言,插入dll命令,接下来的自己百度就好啦。易语言调用dll挺简单的。
给大家分享一个dll函数查看器,因为dll生成之后,里面的函数名,跟你在C++里面写的名字有一定差异,。dll查看器我也会一并打包上传。
就比如我在上面写的update是无冷却函数,在dll里面函数名却是"_update@4 ",所以这里要注意,不然你用易语言调用他会显示找不到这个命令的
易语言我的源码也基本全写了注释方便大家观看,大家有更好的菜单也可以自己弄,这里只是举个简单的全局热键菜单的例子。
源码百度网盘: https://pan.baidu.com/s/1JwrtoViSEb8amtRn5zJmCg 提取码: npfi
一个是安装包版一个是绿色版的,绿色版有的系统可能无法打开,就可以用安装版的了
植物大战僵尸游戏本体网盘链接: https://pan.baidu.com/s/1EZMdAZVtSdrXK2_avVlSUQ 提取码: p7du
祝大家学习顺利! |