VC++:创建,调用Win32动态链接库

概述

DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类。
仓库的发展史经历了"无库" ---> "静态链接库"  ---> "动态链接库"。
静态链接库与动态链接库都能实现共享代码,如果使用静态链接库,编译后lib中的指令会被包含在生成的EXE文件中,如果使用动态链接库,则不会被包含到EXE文件中,EXE文件执行时动态加载和卸载dll文件。
 

库的分类

1.Win32库(非MFC)库
    Win32库又分为:动态链接库和静态链接库
    Win32库不采用MFC类库结构,导出函数为标准的C接口,可以被MFC或非MFC编写的应用程序调用。

2.MFC库
    MFC库又分为:MFC规则DLL和MFC扩展DLL
    MFC规则DLL:包含一个集成自CWinApp的类,但其无消息循环。
    MFC扩展DLL:采用MFC的动态链接库创建,它只能被MFC编写的应用程序调用。
 

创建Win32动态链接库

使用vs2010进行创建
 
1.“新建项目” 项目名为"wn32dll”--->选择"Win32项目" --->下一步 勾选 "Dll"和"导出符号"如下图:
 
 
wn32dll.cpp添加自定义函数:
  1. // wn32dll.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3. #include "stdafx.h"
  4. #include "wn32dll.h"
  5. // 这是导出变量的一个示例
  6. WN32DLL_API int nwn32dll=0;
  7. // 这是导出函数的一个示例。
  8. WN32DLL_API int fnwn32dll(void)
  9. {
  10. return 42;
  11. }
  12. // 这是已导出类的构造函数。
  13. // 有关类定义的信息,请参阅 wn32dll.h
  14. Cwn32dll::Cwn32dll()
  15. {
  16. return;
  17. }
  18. /*************自定义函数******************/
  19. WN32DLL_API int WN_Add(int a, int b)
  20. {
  21. return a + b;
  22. }

wn32dll.h中对声明自定义的函数

  1. // 下列 ifdef 块是创建使从 DLL 导出更简单的
  2. // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 WN32DLL_EXPORTS
  3. // 符号编译的。在使用此 DLL 的
  4. // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
  5. // WN32DLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
  6. // 符号视为是被导出的。
  7. #ifdef WN32DLL_EXPORTS
  8. #define WN32DLL_API __declspec(dllexport)
  9. #else
  10. #define WN32DLL_API __declspec(dllimport)
  11. #endif
  12. // 此类是从 wn32dll.dll 导出的
  13. class WN32DLL_API Cwn32dll {
  14. public:
  15. Cwn32dll(void);
  16. // TODO: 在此添加您的方法。
  17. };
  18. extern WN32DLL_API int nwn32dll;
  19. WN32DLL_API int fnwn32dll(void);
  20. //******************自定义函数**********************/
  21. WN32DLL_API int WN_Add(int a, int b);

编译该项目,会在Debug目录中生成wn32dll.dll和wn32dll.lib文件,使用Dependency Walker工具查看是否成功

 
 

调用Win32动态链接库

鼠标在解决方案右击  ---> "添加" ---> "新建项目",项目名称为"dllTest",选择win32控制台项目

在dllTest.cpp源文件中添加如下代码:
  1. // dllTest.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "stdafx.h"
  4. #include "../wn32dll/wn32dll.h"
  5. #ifdef _DEBUG
  6. #pragma comment(lib, "../Debug/wn32dll.lib")
  7. #else
  8. #pragma comment(lib, "../Release/wn32dll.lib")
  9. #endif
  10. int _tmain(int argc, _TCHAR* argv[])
  11. {
  12. int result = WN_Add(1, 5);
  13. printf("result = %d\n", result);
  14. getchar();
  15. return 0;
  16. }

编译连接生成dllTest.exe文件,执行结果如下:

VC++:创建,调用Win32动态链接库的更多相关文章

  1. VC++:创建,调用MFC动态链接库(扩展DLL)

    概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类. 仓库的发展史经历了"无库" ---& ...

  2. VC++:创建,调用Win32静态链接库

    概述 DLL(Dynamic Linkable Library)动态链接库,Dll可以看作一种仓库,仓库中包含了可以直接使用的变量,函数或类. 仓库的发展史经历了"无库" ---& ...

  3. 创建和使用动态链接库 (C++)

    创建和使用动态链接库 (C++) 转载:http://msdn.microsoft.com/zh-cn/library/ms235636.aspx 此分步演练演示如何创建用于 C++ 应用的动态链接库 ...

  4. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  5. WIN32动态链接库设计与使用

    WINDOWS动态链接库技术能很好地实现代码的分模块,综合来说,windows动态链接库分为三种WIN32动态链接库,使用WINDOWS api函数调用设计,贴近底层,体积小,是最初Windows程序 ...

  6. native关键字(本地方法)、 java调用so动态链接库

    Java native关键字 一. 什么是Native Method   简单地讲,一个Native Method就是一个java调用非java代码的接口.一个Native Method是这样一个ja ...

  7. C#中可直接调用WIN32的API函数--USER32.DLL

    Win32的API函数可以直接在C#中直接调用,在做WinForm时还是很有帮助的.有时候直接调用Win32的API,可以很高效的实现想要的效果. using System; using System ...

  8. 【转载】创建和使用动态链接库 (C++)

    原文:http://blog.csdn.net/handforcpp/article/details/3478254 也可参考MSDN: 演练:创建和使用动态链接库 (C++) 我们将创建的第一种类型 ...

  9. C#调用Win32 api学习总结

    从.NET平台调用Win32 API Win32 API可以直接控制Microsoft Windows的核心,因为API(Application Programming Interface)本来就是微 ...

随机推荐

  1. python自学1——接口测试

    尝试写了一个简单的接口测试,基于Python3.4,主要用到了Python读取excel以及requests库的知识,也算是对这段时间Python基础知识学习的一个巩固吧. 因为还没有学习到Pytho ...

  2. Mybatis --- 映射文件、参数处理、参数值的获取、select元素

    映射文件:指导着MyBatis如何进行数据库增删改查, 有着非常重要的意义:   - cache   命名空间的二级缓存配置 - cache-ref   其他命名空间缓存配置的引用. - result ...

  3. 通过日期在js中求出判断间隔天数,周期等实现分享

    在我们在项目的时候,可能出现这样的一种情况,有一个开始时间和一个结束时间,而这两个时间用$('#StartTime').val(); 取出来的时候又是datetime 类型,我们需要求这个时间中的间隔 ...

  4. 设置Linux环境变量的方法与区别(Ubuntu)

      设置 Linux 环境变量可以通过 export 实现,也可以通过修改几个文件来实现,有必要弄清楚这两种方法以及这几个文件的区别.   通过文件设置 Linux 环境变量 首先是设置全局环境变量, ...

  5. HTML <area><map>标签及在实际开发中的应用

    之前,我一直以为HTML <area>是一个鸡肋HTML,估计到了HTML5时代会被废弃的命.但是,最近一查资料,乖乖了个咚,不仅没被废弃,反而发展了,新增了一些标签属性,例如rel,me ...

  6. mysql:Linux系统下mysql5.6的安装卸载

    1.1. 下载rpm包 要使用yum 安装mysql,需要mysql的yum仓库,先从官网下载适合你系统的仓库 http://dev.mysql.com/downloads/repo/yum/ 我的是 ...

  7. 去掉vue地址栏中分隔#问题

    你需要开启HTML5 History 模式vue-router 默认 hash 模式 -- 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载.如果不想要很 ...

  8. web程序员标准环境之DreamWeaver【推荐】

    Adobe Dreamweaver,简称"DW",中文名称 "梦想编织者",是美国MACROMEDIA公司开发的集网页制作和管理网站于一身的所见即所得网页编辑器 ...

  9. centos6 内核优化

     以下为部分优化参数,具体优化方法还要看情况而定 [root@localhost ~]# vi /etc/sysctl.conf    #末尾添加如下参数 net.ipv4.tcp_syncookie ...

  10. 【Beta】 第六次Daily Scrum Meeting

    一.本次会议为第六次meeting会议 二.时间:10:00AM-10:20AM 地点:禹州楼 三.会议站立式照片 四.今日任务安排 成员 昨日任务 今日任务 林晓芳 对目前完成的模块进行全面测试,并 ...