vs生成dll的学习

By admin at 2020-01-07 • 0人收藏 • 620人看过

之前都是用dll , 最近可能需要提供dll给别人, 那么dll怎么生成呢?

bilibili上面有很多这类视频教程 , 以下是自己记录自己学习的路.

image.png


image.png

image.png

在打开的writedll.cpp里面, 模仿上面的写法,写add()函数

image.png

然后, 去h头文件里添加这个add函数,

右键点击头部那个 include<writedll.h> ,选择打开那个h文件

image.png

继续模仿上面给出的示例, 写入add函数

image.png

保存, 右键点击工程头,选择编译生成dll , 

image.png

生成成功提示:

image.png

我们去debug目录里找到那个dll

image.png

这样就生成了一个简单的dll , 里面有封装add()这个函数, 以后别的程序可以调用这个dll来使用这个add函数了

4 个回复 | 最后更新于 2020-03-09
2020-01-07   #1

用dll函数查看工具查看下刚刚生成的dll ,

image.png

这里面的add函数名字加了@@这样的乱七八糟的东西, 为什么?

据说是c++的特性导致, 编译的时候会动态修改函数名....

那么我们可以添加一些限制给编译器, 不让他修改, 在writedll.h头文件里添加

image.png

#ifdef __cplusplus
extern "C" {
#endif

//你原来的导出函数

#ifdef __cplusplus
}
#endif

用上面的语句判断下是不是c++环境,  是就执行C格式导出, 其实就是添加了一对大括号

extern "C" {

    //你原来的导出函数

}

然后,保存, 重新生成dll

再次用dll函数查看器查看函数

image.png

现在对应起来了

至于上面的那些看着像是乱码的函数, 嗯... 删除cpp里面的导出类和h文件里面的导出类即可

image.png


2020-01-07   #2

下面用aardio调用下这个dll中的add函数, 看看是不是能用

image.png

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio工程8";right=657;bottom=421)
mainForm.add()
/*}}*/


import console
console.open()


var dll = ..raw.loadDll("\res\Wrtiedll.dll","dllshare","cdecl");

console.log( dll.add(3,4) )

mainForm.show();
return win.loopMessage();

运行后可以看到:

image.png

同样调用示例的函数

image.png

2020-01-07   #3

dll中调用dll应该怎么写 ?( 封装dll为另外一个dll)

按照之前的方法, 新建一个win32的dll工程includedll

然后 , 把楼上之前生成的writedll.dll / writedll.h / writedll.Lib 这三个文件复制到刚刚新建的工程目录文件夹里面

image.png

然后在打开的includedll.cpp文件里添加

#include "Wrtiedll.h"
#pragma comment(lib,"Wrtiedll.lib")
// 这是导出函数的一个示例。
INCLUDEDLL_API int fadd(void)
{
    return add(43,56);
}

删掉原来的那些个声明函数, 修改后如下图

image.png

然后去includedll.h头文件那里把这个fadd()函数给声明下

image.png

保存工程, 编译,生成dll

image.png

成功了. 

下面用aardio调用下这个dll试试看

把这个生成的includedll.dll复制到上面的aardio工程里面

import console
console.open()

var dll = ..raw.loadDll("\res\includedll.dll",,"dllshare","cdecl");
console.log( dll.fadd() )

运行后出错误了.

image.png

提示说这个dll不能被加载,,,,...................

正常的,肯定会出错, 因为这个dll里面调用了另外一个dll里面的方法函数, 那么需要把被调用的那个writedll.dll也复制到同一个目录里去

image.png

再次运行, ok了

image.png

2020-03-16   #4

如果需要生成stdcall约定的dll, 那么在下面这个地方设置

捕获.PNG

这样设置完成后, 编译出来的dll又会变成乱码的样式, 那么我们就需要用.def文件来定义导出函数

点击项目右键->项目->新建项,

image.png

def文件内容如下:

第一行后面的名字必须和生成的dll同名

第二行是导出的关键词

后面是需要导出的函数名

注意:使用def文件的话就不需要在h头文件里定义之前那些,按照c语言那样直接写函数即可。


image.png

登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...