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. windows环境下配置zookeeper

    环境: windows10 zookeeper版本:3.4.9 1.从官网 http://mirror.bit.edu.cn/apache/zookeeper/下载对应的版本 2.将下载的文件解压到任 ...

  2. 设置input框文字垂直居中和宽度

    input { solid #999;height:22px; background:#ffffff; line-height:22px; margin:0px; padding:0px;/*表单输入 ...

  3. 利用Google浏览器调试js代码

    1.js有两种引入方式,外链和内嵌: 内嵌在浏览中直接调试,外链要在断点处写debugger; 示例代码: <!DOCTYPE html> <html lang="en&q ...

  4. HTML的基本标签

    整理一下这一周学习的一些知识. 首先是一些基本标签. <!DOCTYPE HTML><html> 文档类型声明: 让浏览器,按照html5的标准对代码进行解释与执行.文档类型声 ...

  5. 程序员也是弱势群体?——从WePhone开发者事件说起

    作为一名不爱凑热闹的人,今天一直在持续关注一个热点事件--WePhone开发者自杀,即使前几天热议的孕妇跳楼新闻我都不太关注,但是这个事件却让我深深的震撼,花了几个小时在微博上搜索了相关的信息,去了解 ...

  6. 实现一个简单的Laravel的dd库

    前几天写了一个简单的Laravel的dd库. 为什么自己要写一个这样的库? Laravel本身已经实现了自己的输出dd函数,但是我之所以要写这样一个库,一来是因为Laravel本身对这个库的封装没办法 ...

  7. WeTest+微信:小程序云端测试系统上线

    日前,微信新增小程序测试系统,可便于开发者检测小程序缺陷,评估小程序产品质量.在小程序发布之前,开发者可将小程序代码提交到测试系统,在不同型号的手机真机上运行,执行完毕后自动生成测试报告.小程序云端测 ...

  8. IPv4子网掩码回顾

    子网掩码的介绍: IP协议标准规定:每一个使用子网的节点都选择一个32位的位模式,若位模式中的某位置为1,则对应IP地址中的某位就为网络地址(包括网络部分和子网号)中的一位:若位模式中的某位置0,则对 ...

  9. 详解 mpls vpn 的实现

    MPLS VPN的实现 一.实验目的 该实验通过MPLS VPN的数据配置,使学生掌握路由器相关接口的IP地址设置.路由协议的配置以及MPLS VPN的完整的创建过程, 从而加深对IP网络的IP编址. ...

  10. RobotFramework安装完成后怎么在桌面显示ride图标

    安装了RobotFramework后,怎么让桌面上显示带有机器人的图标呢? 一.桌面上创建ride快捷方式 进入到python的安装目录的/Scripts目录下,找到ride.py文件-->右键 ...