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

学习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里面

#pragma once//防止编译多次
#include//读写内存函数的头文件
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中

#include"fir.h"
#include"stdafx.h"
#include
#include 
 
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

祝大家学习顺利!

C++封装DLL易语言调用,实现功能菜单_第1张图片

你可能感兴趣的:(c++)