VS2010編寫動態連結庫DLL及單元測試用例
本文將建立一個簡單的動態連結庫,並編寫一個控制臺應用程式使用該動態連結庫,該動態連結庫為“JAVA呼叫動態連結庫DLL之JNative學習”中使用的DLL,只是專案及檔名稱不同。
建立動態連結庫專案:1、開啟Microsoft Visual Studio 2010,選擇檔案->新建->專案。
2、在新建專案視窗中選擇其他語言->Visual C++->Win32。
3、選擇Win32 專案,設定名稱:simpleDLL,設定解決方案名:simpleDLL。
4、單擊確定,在出現的Win32 應用程式嚮導的概述對話方塊中點選下一步。
5、在應用程式設定中,選擇應用程式型別下的DLL。
6、勾選附加選項下的空專案。
7、單擊完成建立專案。
向動態連結庫新增類:
1、新增新類標頭檔案。右鍵單擊simpleDLL專案,新增->新建項,選擇標頭檔案(.h),設定名稱為simpleDLL,單擊新增。
2、新增新類原始檔。右鍵單擊simpleDLL專案,新增->新建項,選擇C++ 檔案(.cpp),設定名稱為simpleDLL,單擊新增。
3、為新類新增內容。內容如下:
標頭檔案simpleDLL.h:
- //------------------ SimpleDLL.h ----------------
- #pragma once;
-
//該巨集完成在dll專案內部使用__declspec(dllexport)匯出
- //在dll專案外部使用時,用__declspec(dllimport)匯入
- //巨集DLL_IMPLEMENT在SimpleDLL.cpp中定義
- #ifdef DLL_IMPLEMENT
- #define DLL_API __declspec(dllexport)
- #else
- #define DLL_API __declspec(dllimport)
- #endif
- DLL_API int add(int x, int y); //簡單方法
-
DLL_API constwchar_t* getPlayUrl(constwchar_t* mgrIp, long mgrPort, long materialId);
- DLL_API constchar* getUrl(constchar* mgrIp, long mgrPort, long materialId);
- //------------------ SimpleDLL.cpp ----------------
- //注意此處的巨集定義需要寫在#include "SimpleDLL.h"之前
- //以完成在dll專案內部使用__declspec(dllexport)匯出
- //在dll專案外部使用時,用__declspec(dllimport)匯入
- #define DLL_IMPLEMENT
- #include "SimpleDLL.h"
- #include<Windows.h>
- #include <intrin.h>
- #include <stdlib.h>
- #include <string.h>
- int DLL_API add(int x, int y)
- {
- return x+y;
- }
- DLL_API constwchar_t* getPlayUrl(constwchar_t* mgrIp, long mgrPort, long materialId)
- {
- staticwchar_t url[260] = { 0 };
- wcscpy_s(url, L"http://中文");
- wcscat_s(url, mgrIp);
- wcscat_s(url, L":");
- wchar_t szPort[20] = { 0 };
- _ltow_s(mgrPort, szPort, 10);
- wcscat_s(url, szPort);
- return url;
- }
- DLL_API constchar* getUrl(constchar* mgrIp, long mgrPort, long materialId)
- {
- staticchar url[260] = { 0 };
- strcpy_s(url, "http://中文");
- strcat_s(url, mgrIp);
- strcat_s(url, ":");
- char szPort[20] = { 0 };
- _ltoa_s(mgrPort, szPort, 10);
- strcat_s(url, szPort);
- return url;
- }
建立引用動態連結庫的應用程式:
1、在解決方案上單擊滑鼠右鍵->新增->新建專案。
2、在新增新專案中選擇其它語言->Visual C++->Win32。
3、選擇Win32 控制檯應用程式,設定名稱:simpleDLLTest。
4、單擊確定,在出現的Win32 應用程式嚮導的概述對話方塊中點選下一步。
5、在應用程式設定中,選擇應用程式型別下的控制檯應用程式。
6、單擊完成建立專案。
在控制檯應用程式中使用類庫的功能:
1、為SimpleDLLTest.cpp新增內容。如下所示:
- // SimpleDLLTest.cpp : 定義控制檯應用程式的入口點。
- #include "stdafx.h"
- #include "../SimpleDLL/SimpleDLL.h" //新增標頭檔案引用
- #pragma comment(lib, "..\\..\\SimpleDLL\\Release\\SimpleDLL.lib") //新增lib檔案引用
- #include <process.h>
- #include <locale.h>
- int _tmain(int argc, _TCHAR* argv[])
- {
- setlocale(LC_ALL, "chs"); //配置地域化資訊為簡體中文,否則打印出來的中文是亂碼
- wprintf(L"getPlayUrl: %s\r\n", getPlayUrl(L"127.0.0.1", 10087, 1));
- printf("getUrl: %s\r\n", getUrl("127.0.0.1", 10087, 1));
- system("pause");
- return 0;
- }
3、依賴於視窗中勾選SimpleDLL,單擊確定。
4、設定SimpleDLLTest專案為活動專案。右鍵單擊SimpleDLLTest專案,選擇設為啟動專案。
6、生成解決方案。Debug執行結果如下:
注意:現在建立的DLL只能由c++呼叫,C語言等其它語言是調用不了的!
我們來用工具看一下,在解決方案上單擊滑鼠右鍵,在Windows資源管理器中開啟資料夾
我編譯的是Release版本,所以開啟Release資料夾,找到SimpleDLL.dll檔案,用Depends工具開啟它
目前編譯的版本對MSVCR100.DLL還有依賴,這樣複製到其它沒有安裝VS2010的電腦上是用不了的;
在專案上單擊滑鼠右鍵,屬性:
在左側的配置屬性中選擇常規,在右側找到MFC的使用,選擇在靜態庫中使用MFC
再看函式,帶有一些特殊字元,這樣c++之外其它語言是調用不了的;我們需要在標頭檔案的函式宣告中新增extern "C"標誌,程式碼如下:
- //------------------ SimpleDLL.h ----------------
- #pragma once;
- //該巨集完成在dll專案內部使用__declspec(dllexport)匯出
- //在dll專案外部使用時,用__declspec(dllimport)匯入
- //巨集DLL_IMPLEMENT在SimpleDLL.cpp中定義
- #ifdef DLL_IMPLEMENT
- #define DLL_API __declspec(dllexport)
- #else
- #define DLL_API __declspec(dllimport)
- #endif
- extern"C" DLL_API int add(int x, int y); //簡單方法
- extern"C" DLL_API constwchar_t* getPlayUrl(constwchar_t* mgrIp, long mgrPort, long materialId);
- extern"C" DLL_API constchar* getUrl(constchar* mgrIp, long mgrPort, long materialId);