VS2010編寫動態連結庫DLL及單元測試用例,呼叫DLL測試正確性

微wx笑發表於2014-05-27

本文將建立一個簡單的動態連結庫,並編寫一個控制應用程式使用該動態連結庫,該動態連結庫為“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 const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);
原始檔simpleDLL.cpp:

//------------------ 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 const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId)
{
	static wchar_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 const char* getUrl(const char* mgrIp, long mgrPort, long materialId)
{
	static char 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;
}
2、引用simpleDLL專案。右鍵單擊SimpleDLLTest專案,選擇專案依賴項。


3、依賴於視窗中勾選SimpleDLL,單擊確定。


4、設定SimpleDLLTest專案為活動專案。右鍵單擊SimpleDLLTest專案,選擇設為啟動專案。


6、生成解決方案。Debug執行結果如下:


注意:現在建立的DLL只能由c++呼叫,C語言等其它語言是呼叫不了的!

我們來用工具看一下,在解決方案上單擊滑鼠右鍵,在Windows資源管理器中開啟資料夾


我編譯的是Release版本,所以開啟Release資料夾,找到SimpleDLL.dll檔案,用Depends工具開啟它


目前編譯的版本對MSVCR100.DLL還有依賴,這樣複製到其它沒有安裝VS2010的電腦上是用不了的;

在專案上單擊滑鼠右鍵,屬性:


在左側的配置屬性中選擇常規,在右側找到MFC的使用,選擇在靜態庫中使用MFC


這裡是修改MFC的使用,還有另一種方法:vs2010釋出時去除msvcp100.dll和msvcr100.dll圖解說明

再看函式,帶有一些特殊字元,這樣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 const wchar_t* getPlayUrl(const wchar_t* mgrIp, long mgrPort, long materialId);
extern "C" DLL_API const char* getUrl(const char* mgrIp, long mgrPort, long materialId);
重新編譯,再Depends工具開啟它,可以發現依賴項已經沒有了,函式名稱也正常了:


參考:演練:建立和使用動態連結庫 (C++)

解決方案原始碼下載:http://download.csdn.net/detail/testcs_dn/7411383

相關文章