程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VS2010編寫動態鏈接庫DLL及單元測試用例,調用DLL測試正確性

VS2010編寫動態鏈接庫DLL及單元測試用例,調用DLL測試正確性

編輯:C++入門知識

本文將創建一個簡單的動態鏈接庫,並編寫一個控制台應用程序使用該動態鏈接庫,該動態鏈接庫為“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:<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD48cD48L3A+PHByZSBjbGFzcz0="brush:java;">//------------------ 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
#include 
#include 
#include 

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 
#include 

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++)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved