VC++:創建,調用Win32動態鏈接庫
阿新 • • 發佈:2017-08-01
結果 space ports 示例 iss 動態加載 endif 自定義函數 urn
倉庫的發展史經歷了"無庫" ---> "靜態鏈接庫" ---> "動態鏈接庫"。
靜態鏈接庫與動態鏈接庫都能實現共享代碼,如果使用靜態鏈接庫,編譯後lib中的指令會被包含在生成的EXE文件中,如果使用動態鏈接庫,則不會被包含到EXE文件中,EXE文件執行時動態加載和卸載dll文件。
Win32庫又分為:動態鏈接庫和靜態鏈接庫
Win32庫不采用MFC類庫結構,導出函數為標準的C接口,可以被MFC或非MFC編寫的應用程序調用。
2.MFC庫
MFC庫又分為:MFC規則DLL和MFC擴展DLL
MFC規則DLL:包含一個集成自CWinApp的類,但其無消息循環。
MFC擴展DLL:采用MFC的動態鏈接庫創建,它只能被MFC編寫的應用程序調用。
使用vs2010進行創建
1.“新建項目” 項目名為"wn32dll”--->選擇"Win32項目" --->下一步 勾選 "Dll"和"導出符號"如下圖:
wn32dll.cpp添加自定義函數:
[html] view plain copy
編譯該項目,會在Debug目錄中生成wn32dll.dll和wn32dll.lib文件,使用Dependency Walker工具查看是否成功
編譯連接生成dllTest.exe文件,執行結果如下:
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動態鏈接庫
- // wn32dll.cpp : 定義 DLL 應用程序的導出函數。
- //
- #include "stdafx.h"
- #include "wn32dll.h"
- // 這是導出變量的一個示例
- WN32DLL_API int nwn32dll=0;
- // 這是導出函數的一個示例。
- WN32DLL_API int fnwn32dll(void)
- {
- return 42;
- }
- // 這是已導出類的構造函數。
- // 有關類定義的信息,請參閱 wn32dll.h
- Cwn32dll::Cwn32dll()
- {
- return;
- }
- /*************自定義函數******************/
- WN32DLL_API int WN_Add(int a, int b)
- {
- return a + b;
- }
- // 下列 ifdef 塊是創建使從 DLL 導出更簡單的
- // 宏的標準方法。此 DLL 中的所有文件都是用命令行上定義的 WN32DLL_EXPORTS
- // 符號編譯的。在使用此 DLL 的
- // 任何其他項目上不應定義此符號。這樣,源文件中包含此文件的任何其他項目都會將
- // WN32DLL_API 函數視為是從 DLL 導入的,而此 DLL 則將用此宏定義的
- // 符號視為是被導出的。
- #ifdef WN32DLL_EXPORTS
- #define WN32DLL_API __declspec(dllexport)
- #else
- #define WN32DLL_API __declspec(dllimport)
- #endif
- // 此類是從 wn32dll.dll 導出的
- class WN32DLL_API Cwn32dll {
- public:
- Cwn32dll(void);
- // TODO: 在此添加您的方法。
- };
- extern WN32DLL_API int nwn32dll;
- WN32DLL_API int fnwn32dll(void);
- //******************自定義函數**********************/
- 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- // dllTest.cpp : 定義控制臺應用程序的入口點。
- //
- #include "stdafx.h"
- #include "../wn32dll/wn32dll.h"
- #ifdef _DEBUG
- #pragma comment(lib, "../Debug/wn32dll.lib")
- #else
- #pragma comment(lib, "../Release/wn32dll.lib")
- #endif
- int _tmain(int argc, _TCHAR* argv[])
- {
- int result = WN_Add(1, 5);
- printf("result = %d\n", result);
- getchar();
- return 0;
- }
編譯連接生成dllTest.exe文件,執行結果如下:
VC++:創建,調用Win32動態鏈接庫