吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6362|回复: 7
收起左侧

[C&C++ 转载] C++封装DLL易语言调用,实现功能菜单,新手上路必看

[复制链接]
NSYGHIHI 发表于 2019-3-15 17:02
本帖最后由 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


祝大家学习顺利!
1.png
2.png
11.png

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
Daihui + 1 + 1 666666

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 2019-3-15 17:18
可以使用def文件来解决导出函数名改变的问题
 楼主| NSYGHIHI 发表于 2019-3-15 17:21
苏紫方璇 发表于 2019-3-15 17:18
可以使用def文件来解决导出函数名改变的问题

这样吗。有空了解一下谢谢大佬
runfog 发表于 2019-3-17 02:30
易语言调用C++写的动态dll,需要在C++声明的函数之前加上_stdcall
楠瓜兮兮 发表于 2019-3-19 14:09
楼主为啥e我用我的易语言打开失败呢。。。。
 楼主| NSYGHIHI 发表于 2019-3-19 20:29
楠瓜兮兮 发表于 2019-3-19 14:09
楼主为啥e我用我的易语言打开失败呢。。。。

dll不能打开的哦。自己调用相关命令就行了。你如果是用我的源码的话。dll要根据你自己放的路径去命令里改一下路径
ws02727644 发表于 2019-3-19 22:08
支持下,学习学习
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-16 05:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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