VS2017 编写 C++ DLL 给 易语言,C++,C#等第三方调用


1.用VS2017编写一个C++动态链接库(DLL)供第三方调用
2.开发环境VS2017

创建DLL

第一步:

首先我们VS界面左上角:文件(F)-》新建项目-》visual C++ -》windows 桌面 -》动态链接库(DLL)
在这里插入图片描述
得到以下界面
在这里插入图片描述

第二步:

我们新建一个头文件:<Dll1.h>
在这里插入图片描述

第三步:

我们在Dll1.cpp里面编写代码
1.需要用到头文件<Dll1.h>和 <Windows.h>
2.在函数前面 返回值类型 后面加上 “__stdcall” 也就是宏“WINAPI”

  • 微软解释:
    调用约定用于调用Win32 API函数。被调用者会清除堆栈,因此编译器会生成vararg函数。使用这种调用约定的函数需要一个函数原型。下面的列表显示了这个调用约定的实现。

  • 符合国人的解释:
    几乎我们写的每一个WINDOWS API函数都是__stdcall类型的。
    首先,需要了解两者之间的区别: WINDOWS的函数调用时需要用到栈(STACK,一种先入后出的存储结构)。
    当函数调用完成后,栈需要清除,【这里就是问题的关键】,如何清除??
    如果我们的函数使用了_cdecl,那么栈的清除工作是由调用者,用COM的术语来讲就是客户来完成的。这样带来了一个棘手的问题,不同的编译器产生栈的方式不尽相同,那么调用者能否正常的完成清除工作呢?答案是不能。 如果使用__stdcall,上面的问题就解决了,函数自己解决清除工作。所以,在跨(开发)平台的调用中,我们都使用__stdcall(虽然有时是以WINAPI的样子出现)。那么为什么还需要_cdecl呢?当我们遇到这样的函数如fprintf()它的参数是可变的,不定长的,被调用者事先无法知道参数的长度,事后的清除工作也无法正常的进行,因此,这种情况我们只能使用_cdecl。到这里我们有一个结论,如果你的程序中没有涉及可变参数,最好使用__stdcall关键字。

// Dll1.cpp : 定义 DLL 应用程序的导出函数。
//

#include "Dll1.h"
#include "stdafx.h"
#include <Windows.h>

//两数相加
int WINAPI add(int n1, int n2)
{
    return n1 + n2;
}

在这里插入图片描述

第四步:

我们在 <Dll1.h> 头文件里:声明函数

#pragma once

int WINAPI add(int n1, int n2);

在这里插入图片描述

第五步:

导出函数:有 3种 导出方法,头文件和cpp都要改
1.第一种:在函数返回值类型前面加上 __declspec(dllexport)

__declspec(dllexport) int WINAPI add(int n1, int n2);

得到效果如图:
在这里插入图片描述
由于C++支持函数重载,国人称之为 “名称粉碎机制” 所以导出函数名会改变,第三方调用的时候需带如图名称,显然不是很适合咱

2.第二种:在函数返回值类型前面加上 extern “C” __declspec(dllexport) 指定该函数是个C语言的函数

extern "C" __declspec(dllexport) int WINAPI add(int n1, int n2);

得到效果如图:
在这里插入图片描述
第三方调用的时候需带如图名称了,显然也不是很合适
3.第三种:新建 “def” 文件实现函数导出

在这里插入图片描述
“Dll1.def ” 写入代码:

LIBRARY
EXPORTS
add

.def 文件中的第一条 LIBRARY 语句不是必须的,但LIBRARY 语句后面的 DLL 的名称必须正确,即与生成的动态链接库的名称必须匹配。此语句将 .def 文件标识为属于 DLL。链接器将此名称放到 DLL 的导入库中。

EXPORTS语句列出名称,可能的话还会列出 DLL 导出函数的序号值。通过在函数名的后面加上 @ 符和一个数字,给函数分配序号值。当指定序号值时,序号值的范围必须是从 1 到 N,其中 N 是 DLL 导出函数的个数。
在这里插入图片描述
得到效果如图:

最后编写好如下3个文件及内容:
在这里插入图片描述
此时我们就可以编译代码给第三方程序调用了;

C++ 调用例子

1.将DLL放到运行目录

在这里插入图片描述

// TEST.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include <iostream>
#include <Windows.h>

//定义一个函数指针返回值和参数必须和原函数一致,声明该函数是 WINAPI 自己释放栈的
typedef int(WINAPI *ADD)(int n1, int n2);

int main()
{
    //LoadLibrary函数将指定的可执行模块映射到调用进程的地址空间。L表示宽字符的DLL名称
    HMODULE hDll = LoadLibrary(L"Dll1.dll");
    if (!hDll)
    {
        std::cout << "error LoadLibrary";
        return -1;
    }
    //GetProcAddress函数从指定的动态链接库(DLL)中检索导出的函数或变量的地址。
    ADD add = (ADD)GetProcAddress(hDll,"add");
    //调用并输出返回值
    std::cout << add(6,9); 
    //释放句柄
    FreeLibrary(hDll);
}

易语言调用例子:

1.将DLL放到运行目录

在这里插入图片描述

.版本 2

.DLL命令 add, 整数型, "Dll1.dll", "add"
    .参数 a, 整数型
    .参数 b, 整数型

调试输出 (add (3, 4))
  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Dear ImGui 1.77   Dear ImGui is a bloat-free graphical user interface library for C++. It outputs optimized vertex buffers that you can render anytime in your 3D-pipeline enabled application. It is fast, portable, renderer agnostic and self-contained (no external dependencies).   Dear ImGui is designed to enable fast iterations and to empower programmers to create content creation tools and visualization / debug tools (as opposed to UI for the average end-user). It favors simplicity and productivity toward this goal, and lacks certain features normally found in more high-level libraries.   Dear ImGui is particularly suited to integration in games engine (for tooling), real-time 3D applications, fullscreen applications, embedded applications, or any applications on consoles platforms where operating system features are non-standard. 开源地址GitHub 使用ImGui的用户 Ubisoft (刺客信条的开发商) 暴雪 微软 亚马逊 索尼 任天堂 谷歌 英伟达 n+1................... ImGui不单单是适合游戏UI设计,使用ImGui开发的工具其实非常多,建模,大数据展示平台,天文展示平台,地理展示平台,城市公交车调度平台等等等,可能是易语言 用户不爱去正规企业搞开发的原因吧。所以私企定制化需求了解得少。 假设你去了中铁,现在叫你要开发一款 “钻机实时监测”程序 那么什么WEB UI ,Win32 基础控件,GDI+控件是压根行不通的,因为钻机很多都是进口的,随便一台也是几百上千万,工作成本非常昂贵,不然开一条隧道几个亿呢~ 所以它每0.1秒的工作成本也非常高,由于它太精密,所以就导致需要1秒内实时显示成千上万组数据,这个时候ImGui就能排得上用场。 本模块实际上是使用C++封装DLL给E调用封装了整个ImGui大概有90%左右的基础函数, 函数和用法基本和官方Demo一致。所以是英文的函数,所以你就算基本上照着官方的Demo写E代码也可以。不喜勿用! 如果你需要“ImGui纯E源码” 那你可以自行翻译ImGuiC++代码到E,在你熟悉E和C++的情况下,大概需要你半年左右的时间。 吐槽一下 因为群里一直有人催我发,我已经说了没封装完,但是还是催。其实很烦的,因为我又不欠你的,我要上班养家糊口的。这些只能用我业余时间搞搞,进度自然慢。所以我就干脆发出来来吧,大概完成度为80%左右,不影响正常使用,函数备注什么的就自己去官方查吧。 根据之前的情况来看,易语言用户群体至少80%以上是白嫖怪,所以拿人手短,不要那么理直气壮,我不爽,大家也别愉快的玩耍,明白????再根据之前ETStudio  来看,很多人都不知道,易语言配色是什么,甚至很多人不知道原来易语言还有一个“设置”功能??还有一大部分人也不看说明 ,有问题只知道弹窗,在? 你这个有XX问题啊,在?这里怎么写? 在?能给我远程一下么? 我是崩溃的,所以有任何问题,请现在自行去GIT,百度,谷歌,维基等等查询。另外 本模块自带了一个列子,虽然比较乱,但是它是一个非常完善的基础使用列子,请认真自行阅读并理解!部分机器可能需要DX运行环境https://www.microsoft.com/zh-cn/download/details.aspx?id=35 除了封装ImGui之外,还会封装一些“有趣”的插件,比如已经完全封装完毕的ImPlot(图表)插件。模块内的是Dx11,其实也可以是DX10 DX 9 OPENGL之类的,以后有时间在慢慢搞了。 附上图吧 请勿将本模块用在一切非法用途,违者自负!!!!!!! G2U函数在WI

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值