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. 关于RequestDispatcher的原理

    RequestDispatcher简介 RequestDispatcher 代表请求的派发者.它有2个动作:forward 和 include .客户端对于任何一个请求,可以根据业务逻辑需要,选择不同 ...

  2. jmeter系列------变量的提取

    为了保证脚本的移植性,需要把一些变量提取出来,变量主要分为2类 1.一类是公用变量(全局变量),包括:IP.port.附件路径.CSV路径等,通常是使用用户定义的变量 组件 2.另一类是测试变量一般作 ...

  3. Promise的用法

    promise.then().promise.catch().Promise.all()... Promise 构造函数接受一个函数作为参数,该函数的2个参数分别是 resolve 和 reject. ...

  4. spring事务失效情况分析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113 <!--[if !supportLists]-->一.&l ...

  5. ROS学习记录(一)————创建简单的机器人模型smartcar

    这是我在古月居上找的(http://www.guyuehome.com/243),但直接运行的话,没办法跑起来,我也是查了好多博客和日志,才实现最后的功能的,所以,记录下来,以备后用吧,也欢迎其他和我 ...

  6. html标签缺省(自带)样式大全

    html标签默认样式整理 作者:佚名  来源:互联网 时间:07-30 16:54:48 文为大家整理了html标签默认样式属性及浏览器默认样式等等,喜欢css布局的朋友们可以学下,希望对大家有所帮助 ...

  7. OSX 10.8+下开启Web 共享 的方法

    MENU Home Archives About SUBSCRIBE ☰MENU OSX 10.8+ Mountain Lion 下开启 Web Sharing(Web 共享)的方法 JUL 28, ...

  8. 团队作业8——Beta 阶段冲刺4th day

    团队作业8--Beta 阶段冲刺4rd day 一.当天站立式会议   二.每个人的工作 (1)昨天已完成的工作(具体在表格中) 添加了支付功能,并且对支付功能进行了测试 (2)今天计划完成的工作(具 ...

  9. 团队作业8——第二次项目冲刺(Beta阶段)--第二天

    团队作业8--第二次项目冲刺(Beta阶段)--第二天 会议照片: 燃尽图: 项目进展: 今天完成了记录用户的姓名,其他的任务还在跟进. 团队贡献比: 队员 角色 团队贡献比 陈麟凤 PM 16% 张 ...

  10. #黑客社会工程学攻防演练#[Chapter 1]

    1.1 什么是社会工程学 社会工程学(Social Engineering)是关于建立理论通过自然的.社会的和制度上的途径并特别强调根据现实的双向计划和设计经验来一步一步地解决各种社会问题.社会工程学 ...