【编程基础】跟我学创建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 条评论
登录 后参与评论

相关文章

来自专栏C/C++基础

jsoncpp初探

首先说一下JSON。JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSO...

592
来自专栏Linux驱动

41.Linux应用调试-修改内核来打印用户态的oops

1.在之前第36章里,我们学习了通过驱动的oops定位错误代码行 第36章的oops代码如下所示: Unable to handle kernel paging...

1965
来自专栏诸葛青云的专栏

C语言编程实例:清空对方应用程序

今天的文章跟大家讲一下,C语言中的文件操作——遍历文件夹和删除文件,以及如何应用这两个技能来写一个有趣的小程序,这篇文章涉及的知识点很少,也很简单,所以这篇文章...

240
来自专栏ImportSource

什么?JDK11发布了?学不动了啊!

我知道你学不动了,但还是很平静的告诉你,jdk11发布了。没错,就是昨天,2018年9月25日,它,发布了。

663
来自专栏MasiMaro 的技术博文

windows 多任务与进程

多任务的本质就是并行计算,它能够利用至少2处理器相互协调,同时计算同一个任务的不同部分,从而提高求解速度,或者求解单机无法求解的大规模问题。以前的分布式计算正是...

814
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十二天 Web商城实战二【悟空教程】

`cname` varchar(20) DEFAULT NULL, #分类名称

974
来自专栏cnblogs

webpack + vue 在dev和production模式下的小小区别

1312
来自专栏后端技术探索

php中常见编码问题

PHP程序设计中中文编码问题曾经困扰很多人,导致这个问题的原因其实很简单,每个国家(或区域)都规定了计算机信息交换用的字符编码集,如美国的扩展 ASCII 码,...

912
来自专栏数据和云

空与非空 EMPTY_LOB和NULL的区别

编辑手记: EMPTY_LOB与NULL在字面意思上看起来差不多,但实际上,它们却有天壤之别。 前不久写过一篇文章,描述如果表包含了触发器,在通过IMP导入数据...

2984
来自专栏架构师之路

或许你不知道的10条SQL技巧

这几天在写索引,想到一些有意思的TIPS,希望大家有收获。 一、一些常见的SQL实践 (1)负向条件查询不能使用索引 select * from order w...

36212

扫码关注云+社区