1. 程式人生 > >VC++:創建,調用Win32動態鏈接庫

VC++:創建,調用Win32動態鏈接庫

結果 space ports 示例 iss 動態加載 endif 自定義函數 urn

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. #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中對聲明自定義的函數 [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. // 此類是從 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源文件中添加如下代碼: [html] view plain copy
  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動態鏈接庫