zoukankan      html  css  js  c++  java
  • VC++:创建,调用Win32动态链接库

    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添加自定义函数:
    [html] view plain copy
    1. // wn32dll.cpp : 定义 DLL 应用程序的导出函数。  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "wn32dll.h"  
    6.   
    7.   
    8. // 这是导出变量的一个示例  
    9. WN32DLL_API int nwn32dll=0;  
    10.   
    11. // 这是导出函数的一个示例。  
    12. WN32DLL_API int fnwn32dll(void)  
    13. {  
    14.     return 42;  
    15. }  
    16.   
    17. // 这是已导出类的构造函数。  
    18. // 有关类定义的信息,请参阅 wn32dll.h  
    19. Cwn32dll::Cwn32dll()  
    20. {  
    21.     return;  
    22. }  
    23.   
    24. /*************自定义函数******************/  
    25. WN32DLL_API int WN_Add(int a, int b)  
    26. {  
    27.     return a + b;  
    28. }  
    wn32dll.h中对声明自定义的函数
    [html] view plain copy
    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.   
    13. // 此类是从 wn32dll.dll 导出的  
    14. class WN32DLL_API Cwn32dll {  
    15. public:  
    16.     Cwn32dll(void);  
    17.     // TODO: 在此添加您的方法。  
    18. };  
    19.   
    20. extern WN32DLL_API int nwn32dll;  
    21.   
    22. WN32DLL_API int fnwn32dll(void);  
    23.   
    24.   
    25. //******************自定义函数**********************/  
    26. WN32DLL_API int WN_Add(int a, int b);  

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

    调用Win32动态链接库

    鼠标在解决方案右击  ---> "添加" ---> "新建项目",项目名称为"dllTest",选择win32控制台项目
    在dllTest.cpp源文件中添加如下代码:
    [html] view plain copy
    1. // dllTest.cpp : 定义控制台应用程序的入口点。  
    2. //  
    3.   
    4. #include "stdafx.h"  
    5. #include "../wn32dll/wn32dll.h"  
    6.   
    7. #ifdef _DEBUG  
    8. #pragma comment(lib, "../Debug/wn32dll.lib")  
    9. #else  
    10. #pragma comment(lib, "../Release/wn32dll.lib")  
    11. #endif  
    12.   
    13.   
    14. int _tmain(int argc, _TCHAR* argv[])  
    15. {  
    16.     int result = WN_Add(1, 5);  
    17.     printf("result = %d ", result);  
    18.     getchar();  
    19.     return 0;  
    20. }  

    编译连接生成dllTest.exe文件,执行结果如下:
  • 相关阅读:
    MOSS发生“未能转换部分或所有标识引用”错误的处理
    Excel嵌入网页(二) 转载
    GridView的PagerTemplate分页
    深入探讨:如何理解.Net的三层架构(转)
    IIS报Service Unavailable错的解决方案
    浅谈C#托管程序中的资源释放问题(转)
    C#程序节省内存
    网页中嵌入Excel控件(补充)
    解决ajax的status=0问题
    翻开我的博客之旅
  • 原文地址:https://www.cnblogs.com/azbane/p/7268556.html
Copyright © 2011-2022 走看看