【编程基础】跟我学创建Windows动态库

如何简单快速创建Win32平台下的动态链接库?但是有的创建出来用C/C++调用时没有问题,但是在其它编程语言调用时可能会出现问题,下面我们就按四个傻瓜式的步骤创建通用的windows动态库过程。

  • 创建空的win32的工程。
  • 添加C/C++头文件内容(MyHead.h):

#ifndef __MYHEAD_H__

#define __MYHEAD_H__

#ifndef MY_API

#define MY_API extern "C" __declspec(dllimport)

#endif

现在添加你想要放到Dll中的引出函数,我们这里用一个加和减的函数功能来举例。

MY_API int WINAPI MyAdd(int a, int b);

MY_API int WINAPI MySub(int a, int b);

#endif //__MYHEAD_H__

本质上,在外面使用这个头文件是不会定义MY_API,所以在外使用DLL时,文件夹内容实际上为:

extern "C" __declspec(dllimport)int __stdcall MyAdd(int a, int b);

extern "C" __declspec(dllimport)int __stdcall MySub(int a, int b);

  • 添加C/C++原文件内容:

#include <windows.h>

#define MY_API extern "C" __declspec(dllexport)

#include "MyHead.h"

MY_APIint WINAPI MyAdd(int a, int b)

{

return (a + b);

}

MY_APIint WINAPI MySub(int a, int b)

{

return (a - b);

}

注意:这里定义了MY_API。本质上,这里的函数声明为:

extern "C" __declspec(dllexport)int __stdcall MyAdd(int a, int b);

extern "C" __declspec(dllexport)int __stdcall MySub(int a, int b);

  • 增加def文件(Mydll.def):

;DLL导出文件,名字Mydll可以加引号

;by John

LIBRARY Mydll

EXPORTS

MyAdd @1

MySub @2

注意:

1, 在def文件中,函数名和@索引之间需要有空格、TAB等分隔符。

2, def文件需要在“配置”,“配置属性”,“连接器”,“输入”,“模块定义文件”制定,否则即使添加到工程也不会起作用。在VS2008等后来版本中,也不能用#pragma comment(linker, "/DEF:\"Mydll.def\"")来让def文件起作用。

这样用def文件生产的dll才能在VC以及VB等其他语言中使用。

C语言编程调用dll时,只要引入MyHead.h和对于的lib,并加入dll文件即可编译运行。

比如在VB中可以声明为:

Declare Function MyAdd Lib "Mydll.dll" (ByVala As Long, ByValb As Long) As Long

DeclareFunction MySub Lib "Mydll.dll" (ByVala As Long, ByValb As Long) As Long

通过这五步,就可以把生成的Lib文件和dll文件提供给windows平台下的其它编程时使用,怎么样,比较简单吧?

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-06-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏乐沙弥的世界

Innobackupex 全备数据库

    对于MySQL数据库的热备,xtrabackup是除了MySQL enterprise backup之外的不二之选。该工具提供了基于innodb存储引擎...

722
来自专栏数据库新发现

Php部分常见问题总结

Php部分常见问题总结 作者:未知 来源:未知 1:为什么我得不到变量

612
来自专栏ChaMd5安全团队

LCTF “他们有什么秘密呢? ”详细解析

LCTF2017真有趣,让我长了不少见识,由于时间匆忙,我也就只做了一个web题,还是折腾了不久,我觉得这题考点还是蛮集中的,故此分享下。 进去后显示: ent...

25410
来自专栏小白安全

SQLMAP命令中文注释

sqlmap常用命令大全 sqlmap -u “http://url/news?id=1″ –current-user #获取当前用户名称sqlmap...

2765
来自专栏小尘哥的专栏

thymeleaf中使用layui

头部引入css,尾部引入js,定义两个模板(一个也可以,里面的碎片分开写,我喜欢写两个分别引入),注意th:fragment,fragment即碎片,可以在模板...

716
来自专栏林德熙的博客

win10 uwp 绑定密码

win10 下,密码框无法绑定到ViewModel,Password是不可以绑定。 我们可以自己使用简单方法去绑定。

411
来自专栏Golang语言社区

GDB使用详解

一、打开GDB 1、gdb filename 加载该文件到gdb 2、gdb file filename 如果gdb filename失败,可以在打开gd...

31310
来自专栏阮一峰的网络日志

require() 源码解读

2009年,Node.js 项目诞生,所有模块一律为 CommonJS 格式。 时至今日,Node.js 的模块仓库 npmjs.com ,已经存放了15万个模...

3388
来自专栏有趣的Python

最新Django2.0.1在线教育零基础到上线教程(三)-3&4&5

演示地址: http://mxonline.mtianyan.cn 教程仓库地址1: https://github.com/mtianyan/DjangoGe...

3945
来自专栏用户2442861的专栏

JavaWeb工程中web.xml基本配置

        先说下我记得xml规则,必须有且只有一个根节点,大小写敏感,标签不嵌套,必须配对。

461

扫描关注云+社区