DLL-创建DLL
动态链接库的创建
fangyukuan
2010.6.20
编写DLL时的函数与一般的函数方法基本一样。但要对库中的函数进行必要的声明,以说明哪些函数是可以导出的,哪些函数是不可以导出的。
把DLL中的函数声明为导出函数的方法有两种:
一是使用关键字_declspec(dllexport)来声明。
二是在.def文件中声明。
一、使用关键字_declspec(dllexport)来声明导出函数
声明函数SayHello为导出函数语句为:int _declspec(dllexport) SayHello ();
为了使一个用C++语言编写的DLL函数可以在C语言编写的应用程序中使用,在关键字_declspec(dllexport) 之前要附加另一个关键字:extern “C”,以通知编译器采用C链接方式。
例子:(用vs2008写的例子)
新建一个工程。
选择Win32 Project,工程名字为1_DLLDemo。确定。
选择DLL其它默认。
在文件1_DLLDemo.cpp编写代码如下:
extern "C" __declspec(dllexport) void SayHello()
{
::MessageBoxW(NULL, L"Hello", L"fangyukuan", MB_OK);
}
按F7编译即可。
再新建一个测试工程。这里简单一点,新建一个控制台工程就可以了。
选择Win32 console Application,其它全部默认。
编写如下代码:
#include "stdafx.h"
#include "stdlib.h" // for system("pause");
#include "windows.h"
#include <iostream>
using namespace std;
typedef void (SAYHELLO)(); // 定义一个这种类型的函数指针
int _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hDllInst;
// 这里为dll的路径,因为现在exe和dll在同一个目录下,所以只写名字即可
hDllInst=LoadLibrary(L"1_DLLDemo.dll");
if(NULL == hDllInst)
{
cout << "加载dll失败" << endl;
}
else
{
SAYHELLO * lpproc =(SAYHELLO *)GetProcAddress(hDllInst,"SayHello");
if(NULL != lpproc)
(*lpproc)();
FreeLibrary(hDllInst);
}
system("pause");
return 0;
}
按F7编译。再按F5运行。结果如下。
二、使用def文件声明导出函数
def文件又叫做模块定义文件,这是一个用于描述DLL属性的文本文件,每个def文件一般要包括以下模块定义语句:
A) LIBRARY语句,指出DLL的名字,链接器将把这个名字放到DLL库中。
B) EXPORTS语句,列出库中导出函数的名称及导出函数的序号(可选)。
C) DISCRIPION语句,该语句用来描述DLL的用途等说明。
可以在def文件分号“;”后面书写注释语句。
在创建DLL时,编译链接器将要使用def文件创建两个文件:一个导出文件(.EXP)和一个导入库文件(.LIB),然后使用导出文件再创建DLL文件。
外部应用程序使用的文件是导入库文件和DLL文件。由于在导入库文件中存放了外部应用程序可导入的DLL导出函数名称列表,因此外部应用程序需要把它连接在应用程序中,才能以它为索引到DLL中去找到要调用的导出函数。也就是说,导入库文件相当于是DLL可提供的服务项目表。
例子:(用vs2008写的例子)
方法同上面一样新建一个DLL工程。
在文件2_DLLDemo.cpp编写代码如下:
void SayHello()
{
::MessageBoxW(NULL, L"2_DLLDemo::Hello", L"fangyukuan", MB_OK);
}
然后再新建一个def文件。
在工程右键->add->New Item…
在def文件编写如下代码:
LIBRARY "2_DLLDemo"
EXPORTS
SayHello
按F7编译完成。
测试方法同上面例子一样。
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/06/20/1761464.html
DLL-创建DLL的更多相关文章
- C#创建dll类库
类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...
- 创建dll教程
先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{ 这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...
- 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试
from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...
- C#加载dll 创建类对象
//加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...
- VC++2008 用空工程创建 DLL
VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...
- windows编程:创建DLL
创建DLL Dll是动态链接库的缩写,可以作为附加代码动态映射到进程的地址空间中. 动态库的一般创建方法如下 方法1.使用 __declspec(dllexport) 方式导出 一般的框架如下 // ...
- VS2010环境下用ANSI C创建DLL和使用方法(转)
源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...
- C# 创建Dll文件供程序调用方法
C# 创建Dll文件供程序调用方法 使用C#创建动态Dll文件方法: 1. 在VS2017环境下,新建-项目-选择类库类型: 2. 新创建一个.cs文件(如test.cs),编写代码如下: usin ...
- 利用C++创建DLL并C#调用
日期:2018年11月26日 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 #inclu ...
- MinGW 使用和创建 DLL 应注意的问题
MinGW 是 GCC 的 Windows 版本,稳定版已经到了 4.5.2,功能和性能上很好,感觉不比 Microsoft 自家的 VC 差啊.但是 MinGW 下使用和创建 DLL 倒是要特别注意 ...
随机推荐
- SA20225394 舒蔚 高级软件工程实验总结
[实验]: 一.编程神器Visual Studio Code 配置好Visual Studio Code这一强大而又轻量的编辑器.其中有版本控制+代码补全+自动加载依赖,并且可以根据自己的需要添加插件 ...
- DL基础补全计划(三)---模型选择、欠拟合、过拟合
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- Spring Boot邮箱链接注册验证
Spring Boot邮箱链接注册验证 简单介绍 注册流程 [1]前端提交注册信息 [2]后端接受数据 [3]后端生成一个UUID做为token,将token作为redis的key值,用户数据作为re ...
- js中 typeof 和 instanceof 的区别
typeof 和 instanceof 都能判断数据类型,但是它们之间有什么区别呢,浅谈如下 typeof 用于判断数据类型,返回值为以下6种类型 1.string 2.boolean 3.numbe ...
- java并发编程基础——线程同步
线程同步 一.线程安全问题 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码.如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安 ...
- Jupyter notebook总是卡在int[*]怎么解决?
Jupyter notebook总是卡在int[*]怎么解决? 先看看后台的日志是怎么回事 运行Jupyter notebook会有一个命令行在运行,可以看看出现在error附近的的句子的意思再具体搜 ...
- Laravel 6 – 搭建管理后台的用户认证“脚手架”工具
1. 下载Laravel/ui 命令: composer require laravel/ui "^1.0" -dev 注意laravel framework 6只支持版本1的la ...
- 深入源码理解Spring整合MyBatis原理
写在前面 聊一聊MyBatis的核心概念.Spring相关的核心内容,主要结合源码理解Spring是如何整合MyBatis的.(结合右侧目录了解吧) MyBatis相关核心概念粗略回顾 SqlSess ...
- 第二十六篇 -- wifi学习
参考网址:https://blog.csdn.net/zwl1584671413/article/details/77936950 https://blog.csdn.net/Righthek/art ...
- mysql为什么用b+树做索引
关键字就是key的意思 一.B-Tree的性质 1.定义任意非叶子结点最多只有M个儿子,且M>2: 2.根结点的儿子数为[2, M]: 3.除根结点以外的非叶子结点的儿子数为[M/2, M]: ...