动态链接库的创建

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的更多相关文章

  1. C#创建dll类库

    类库让我们的代码可复用,我们只需要在类库中声明变量一次,就能在接下来的过程中无数次地使用,而无需在每次使用前都要声明它.这样一来,就节省了我们的内存空间.而想要在类库添加什么类,还需取决于类库要实现哪 ...

  2. 创建dll教程

    先看我的总结: 总结: 1.头文件中如果想以C形式提供,要判断,如果定义了 _cplusplus, extern "c"{  这里写接口声明 } 2.接口声明中,要表明接口接入点的 ...

  3. 在VS2015中用C++创建DLL并用C#调用且同时实现对DLL的调试

    from:http://m.blog.csdn.net/article/details?id=51075023 在VS2015中先创建C#项目,然后再创建要编写的动态库DLL项目,这样做的好处是整个解 ...

  4. C#加载dll 创建类对象

    //加载dll 创建类对象string sqlightAssembly = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "syst ...

  5. VC++2008 用空工程创建 DLL

    VC++2008 用空工程创建 DLL 一.创建 DLL 工程项目: 1)点击菜单[File] -> [New] -> [Project...] 弹出 “New Project” 对话框: ...

  6. windows编程:创建DLL

    创建DLL Dll是动态链接库的缩写,可以作为附加代码动态映射到进程的地址空间中. 动态库的一般创建方法如下 方法1.使用 __declspec(dllexport)  方式导出 一般的框架如下 // ...

  7. VS2010环境下用ANSI C创建DLL和使用方法(转)

    源:VS2010环境下用ANSI C创建DLL和使用方法 . 创建DLL工程 1.2 创建一个dll工程. 操作:a.文件->新建->项目->Win32控制台应用程序. b.输入工程 ...

  8. C# 创建Dll文件供程序调用方法

    C# 创建Dll文件供程序调用方法 使用C#创建动态Dll文件方法: 1.  在VS2017环境下,新建-项目-选择类库类型: 2. 新创建一个.cs文件(如test.cs),编写代码如下: usin ...

  9. 利用C++创建DLL并C#调用

    日期:2018年11月26日 环境:window 10,VS2015 community 一.利用C++创建DLL 1.新建项目: 2.打开CreateDLL.cpp文件,并输入测试代码 #inclu ...

  10. MinGW 使用和创建 DLL 应注意的问题

    MinGW 是 GCC 的 Windows 版本,稳定版已经到了 4.5.2,功能和性能上很好,感觉不比 Microsoft 自家的 VC 差啊.但是 MinGW 下使用和创建 DLL 倒是要特别注意 ...

随机推荐

  1. CSS 世界中的方位与顺序

    在 CSS 中,我们经常会与各种方向方位打交道. 譬如 margin.padding,它们就会有 margin-left.margin-right 或者是 padding-left.padding-r ...

  2. Kubernetes实战:高可用集群的搭建和部署

    摘要:官方只提到了一句"使用负载均衡器将 apiserver 暴露给工作节点",而这恰恰是部署过程中需要解决的重点问题. 本文分享自华为云社区<Kubernetes 高可用集 ...

  3. Scala学习——模式匹配

    scala模式匹配 1.基础match case(类似java里switch case,但功能强大些) object MatchApp { def main(args: Array[String]): ...

  4. vuejs第一集之:vuejs了解

    1,了解到前后端分离2,连接到vuejs3,搜集书籍: Vuejs前端开发基础与项目实战 (https://detail.tmall.com/item.htm?spm=a230r.1.14.107.6 ...

  5. 基于 Blazor 打造一款实时字幕

    早先在录制视频的时候一直使用的是 obs-auto-subtitle 作为实时字幕展示功能.不过这个是以 OBS 插件的形式存在,不管是语言和功能上都有一定的限制.故而使用 Blazor server ...

  6. 如何在 PyCharm 中设置 Python 代码模板

    #!/usr/bin/env python # -*- coding: utf-8 -*- # Created by iFantastic on $DATE if __name__ == '__mai ...

  7. P4494 [HAOI2018]反色游戏

    P4494 [HAOI2018]反色游戏 题意 给你一个无向图,图上每个点是黑色或者白色.你可以将一条边的两个端点颜色取反.问你有多少种方法每个边至多取反一次使得图上全变成白色的点. 思路 若任意一个 ...

  8. C++派生类的拷贝构造

    一. 概述 通过几个简单的实验,回顾下派生类中拷贝构造的相关知识. 环境:Centos7 64位, g++ 4.8.5 在继承中,构造器与析构器均没有被继承下来.拷贝构造,也是一种构造,也没有被继承下 ...

  9. YGC问题排查

    在高并发下, Java程序的GC问题属于很典型的一类问题,带来的影响往往会被进一步放大. 不管是 「GC频率过快」还是「GC耗时太长」,由于GC期间都存在Stop The World问题,因此很容易导 ...

  10. 小技巧 | Get 到一个 Web 自动化方案,绝了!

    1. 前言 大家好,我是安果! 无论是 Chrome,还是 Firefox 浏览器,它们的强大性在很大程度上都是依赖于海量的插件,让我们能高效办公 那我们是否可以编写一个插件,让浏览器自动化完成一些日 ...