用__stdcall实现易语言调用C/C++的dll

0x0 前言

大家好啊!我是逆向区的版主,今天我到编程区的来水帖子了!

有些朋友问我,易语言的功能好少啊,我好多想法都没法实现,我想能不能用易语言调用c的dll呢?

答:可以!!!

0x1准备工作--工程

首先我们需要一个VS,VS下载和安装想必大家都知道的。

我们打开之后新建个项目,或者(Ctrl+shift+n)

出来个这个界面

我们是写的C++,所以左边点C++,然后是dll,选择MFC dll

名字大家随便填啊,完成之后确定

稍等片刻会出现这个界面。

此时我们需要注意下

不要点完成,而是点下一步!!

这边选择带静态的规则

为什么不选默认的第一个呢?这是因为由于操作系统不同,系统关键函数dll也不相同,

为了防止在其他系统虽然有dll文件但找不到函数的问题

这里使用第二个静态规则,然后点完成。

0x3 准备工作--->cpp文件

如图

点击左下角的解决方案管理器,展开所有文件,找到源文件中的cpp,打开。

代码如下

// dllll.cpp : 定义 DLL 的初始化例程。

//

#include "stdafx.h"

#include "dllll.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

//

//TODO: 如果此 DLL 相对于 MFC DLL 是动态链接的,

//                则从此 DLL 导出的任何调入

//                MFC 的函数必须将 AFX_MANAGE_STATE 宏添加到

//                该函数的最前面。

//

//                例如:

//

//                extern "C" BOOL PASCAL EXPORT ExportedFunction()

//                {

//                        AFX_MANAGE_STATE(AfxGetStaticModuleState());

//                        // 此处为普通函数体

//                }

//

//                此宏先于任何 MFC 调用

//                出现在每个函数中十分重要。这意味着

//                它必须作为函数中的第一个语句

//                出现,甚至先于所有对象变量声明,

//                这是因为它们的构造函数可能生成 MFC

//                DLL 调用。

//

//                有关其他详细信息,

//                请参阅 MFC 技术说明 33 和 58。

//

// CdllllApp

BEGIN_MESSAGE_MAP(CdllllApp, CWinApp)

END_MESSAGE_MAP()

// CdllllApp 构造

CdllllApp::CdllllApp()

{

// TODO: 在此处添加构造代码,

// 将所有重要的初始化放置在 InitInstance 中

}

// 唯一的一个 CdllllApp 对象

CdllllApp theApp;

// CdllllApp 初始化

BOOL CdllllApp::InitInstance()

{

CWinApp::InitInstance();

return TRUE;

}

[color=rgb(51, 102, 153) !important]复制代码

我们整理下,是这样的:

#include "stdafx.h"

#include "dllll.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

BEGIN_MESSAGE_MAP(CdllllApp, CWinApp)

END_MESSAGE_MAP()

CdllllApp::CdllllApp(){}

CdllllApp theApp;

BOOL CdllllApp::InitInstance(){CWinApp::InitInstance();return TRUE;}

[color=rgb(51, 102, 153) !important]复制代码

大家注意下代码里面的CxxxxxxxxxxxxApp;xxxxxxxxxxxxxx会随着你的工程文件名更改而更改,一般创建好了都有自带代码的,不用删,把注释整理(或删除)就行。!

0x4 开干--->写几个测试函数

我们用加法和减法函数,大家也可以用其他函数试试!(可能要加头文件)

我们在刚才的整理后的代码加上这些代码:

int __stdcall newadd(int a,int b){

return (a+b);}

int __stdcall newsub(int a,int b){

return (a-b);}

[color=rgb(51, 102, 153) !important]复制代码

此时就写完了主要代码了

接下来函数写完了

我们来写def定义文件(左边的解决方案管理器里面双击)

原来的默认代码是这样的:

; dllll.def : 声明 DLL 的模块参数。

LIBRARY

EXPORTS

; 此处可以是显式导出

[color=rgb(51, 102, 153) !important]复制代码

我们改成我们的:

; dllll.def : 声明 DLL 的模块参数。

LIBRARY "dllll"

EXPORTS

newadd

newsub

[color=rgb(51, 102, 153) !important]复制代码

其中LIBRARY "xxxxxxxxxxxx"中的xxxxxx写这个工程的名字,(就是def文件的名字,这里是dllll)EXPORTS下面一行就是你要保留函数名的函数,这里看cpp的代码就是newadd和newsub

可以依次叠加。

完事之后编译就行

重新生成(Ctrl+Alt+F7)

等待生成完毕我们去工程文件的目录(一开始创建的窗口注意下位置):

把这个dll复制出来。

0x4 调用

打开易语言,我们画两个编辑框,两个按钮

代码如下,dll声明:

.版本 2

.DLL命令 DLL命令1, 短整数型, "dllll.dll", "newadd"

.参数 a, 短整数型

.参数 b, 短整数型

.DLL命令 DLL命令2, 短整数型, "dllll.dll", "newsub"

.参数 a, 短整数型

.参数 b, 短整数型

[color=rgb(51, 102, 153) !important]复制代码

其中的dll命令名大家随便写,这个是在易语言显示的名字

库文件名就写刚才那个dll的名字,因为放同一个目录,这里就不写目录路径了,大家需要的自己补

在库中对应名看刚才的def文件,对应好了,多一个或者少一个字符都无效的。

然后c的int型对应的是短整数型,这里大家看下。

然后是程序集:

.版本 2

.程序集 窗口程序集_启动窗口

.子程序 _按钮1_被单击

信息框 (到文本 (DLL命令1 (到数值 (编辑框1.内容), 到数值 (编辑框2.内容))), 0, , )

.子程序 _按钮2_被单击

信息框 (到文本 (DLL命令2 (到数值 (编辑框1.内容), 到数值 (编辑框2.内容))), 0, , )

[color=rgb(51, 102, 153) !important]复制代码

好了我们静态编译(Shift+F7)。

测试下:

完美!!

附件如下:

https://www.lanzous.com/i4yml7i

易语言调用c 自定义数据类型,用__stdcall实现易语言调用C/C++的dll相关推荐

  1. 易语言调用c 自定义数据类型,跟我入门易语言 14 自定义数据类型

    自定义数据类型是一种特殊的数据类型,它与我们之前学习过的常见数据类型不同,我们自己也可以自己创建数据类型!一个自定义类型可以由许多成员组成,每一个成员可以是各种常见数据类型,甚至一个自定义数据类型中还 ...

  2. 结构体定义小的放前面_编程C语言进阶篇——自定义数据类型:结构体

    一.结构体 定义方法: 结构名 变量名 特点: 两个同类型的结构变量可以相互赋值,但是结构变量之间不能使用"<","=="等运算符,如果使用则需要对运算符 ...

  3. 博途数据类型wstring怎么用_博图V14关于自定义数据类型的疑问,大家都是怎么编程写中间标签的那。...

    由于单位最近要搞标准化编程.我负责编写程序块.用AB写程序的套路编写西门子博图V14的块. 1,建立自定义数据类型. 2,编写要调用的程序块.如果设备不多建议用FB生成背景数据库,又能保持定时器以及各 ...

  4. 【C语言三种自定义类型】

    目录 前言 一.结构体(struct) (一)结构体的声明 1.结构的声明 2.特殊的声明(不完全声明) 3.结构体的自引用 4.结构体的初始化与赋值 5.结构体内存对齐 内存对齐规则: 6.修改默认 ...

  5. 【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  6. 易语言 取自定义数据类型的大小

    先说一下易语言的变量储存机制 易语言有基本数据类型和复合数据类型两种 基本数据类型包括:1. 各种整数 2.各种浮点 3. 逻辑值 他们都是储存在栈上的 大小都是固定的 用不着取 复合类型一般储存在堆 ...

  7. 剑仙java_【剑仙教程】易语言的结构体。自定义数据类型。

    1楼. [剑仙教程]易语言的结构体.自定义数据类型. 在易语言中,有基本数据类型,自定义数据类型. 自定义数据类型,在C语言/C++中称为结构体.这是面向对象和类的编程. . . 先上代码.打开易语言 ...

  8. 易语言数据类型与c 对照,易语言利用自定义数据类型和数组. 制作键对值操作类/内存配置...

    易语言利用自定义数据类型和数组.  制作键对值操作类/内存配置.版本 2 .支持库 spec .子程序 _临时子程序 .局部变量 test, classKeyValue .局部变量 局_取值方法2,  ...

  9. 易语言自定义数据类型转c,一步一步跟我学易语言之自定义数据类型

    自定义数据类型 什么是"自定义数据类型"?顾名思义,就是用户可以随时在程序中自行定义新的数据类型.自定义数据类型时需要设置数据类型的名称及其成员.数据类型成员各属性的设置方法等同于 ...

最新文章

  1. 客户区和非客户区指的什么?窗口客户区和视图客户区的区别
  2. 使用openstack构建私有云计算平台
  3. 小程序菜单栏吸顶效果
  4. 15条最重要且最基本的SEO优化Tips和技巧
  5. kettle数据源连接的集群设置
  6. 短语密码_使用密码短语以提高安全性
  7. 如何计算iPhone和Apple Watch上的步数
  8. MySQL-03:数据表操作基本命令笔记
  9. event.keyCode列表
  10. Dubbo面试 - dubbo的工作原理
  11. RabbitMQ(三) HelloWorld 单生产者单消费者示例实现
  12. 资源放送丨《Oracle RAC 集群安装部署》PPT视频
  13. 保护REST API / Web服务的最佳实践[关闭]
  14. vant:修改van-nav-bar__title颜色——vant中nav-bar组件标题颜色
  15. Word文字怎么居中对齐
  16. android微信连wifi设置,微信小程序实现连接wifi功能的方法
  17. HC-05蓝牙模块简易说明
  18. 关闭tslint检测的简单方法
  19. 什么是爱情——碧海青天BBS
  20. HtmlCss光标(插入符caret)透明隐藏光标 221106笔记

热门文章

  1. css html5 css3
  2. sharpjs中文文档,sharpjs中文网
  3. 测试版ios15怎么信任软件,ios15的信任文件在哪?ios15信任授权在哪里设置?
  4. 树叶叶脉的提取及描述
  5. ubuntu20.04如何录制屏幕
  6. html往WPS粘贴格式乱,wps表格无法粘贴信息,原因是复制区域形状不同怎么解决?...
  7. 走弯路,才是人生的常态
  8. 基于java体育竞赛成绩管理系统(Java毕业设计)
  9. oracle存储过程中游标定义
  10. BurpSuite IP代理扩展(IPRotate_Burp_Extension)每次请求切换IP