VS2010編寫動態連結庫DLL及單元測試用例,呼叫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 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工具開啟它,可以發現依賴項已經沒有了,函式名稱也正常了:相關文章
- Laravel 單元測試實戰(3)- 編寫整合測試確保介面和資料庫程式碼正確Laravel資料庫
- 動態連結庫(DLL)
- 用Junit Framework編寫單元測試Framework
- P/Invoke之C#呼叫動態連結庫DLLC#
- 【轉】測試用例編寫(功能測試框架)框架
- 用Junit Framework編寫單元測試 (轉)Framework
- 用 Swift 編寫網路層單元測試Swift
- lua——alien庫實現lua呼叫C動態連結庫(dll、so)
- 如何寫好測試用例以及go單元測試工具testify簡單介紹Go
- 如何編寫優秀的測試程式碼|單元測試
- 介面測試用例編寫和測試關注點
- 前端單元測試總結及測試工具介紹前端
- [iOS單元測試系列]單元測試編碼規範iOS
- 動態連結庫(DLL)的建立和使用
- 動態連結庫DLL_第1篇
- VC動態呼叫DLL
- Spring Boot之單元測試用例總結Spring Boot
- Web自動化-Selenium自動化測試-4-編寫測試用例Web
- 測試開發之單元測試-禪道結合ZTF驅動單元測試執行
- APISIX外掛如何編寫單元測試API
- Java呼叫C/C++編寫的第三方dll動態連結庫(非nativeAPI)—JNIJavaC++API
- Angular單元測試如何只執行指定的測試用例,提高測試速度Angular
- QueueUserApc實現DLL注入的測試
- 測試 之Java單元測試、Android單元測試JavaAndroid
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- Java呼叫C/C++編寫的第三方dll動態連結庫(非native API)--- JNIJavaC++API
- VS中呼叫DLL動態庫的方法
- iOS單元測試參考連結整理iOS
- PHP 單元測試與資料庫測試PHP資料庫
- postman寫測試用例Postman
- 軟體測試用例編寫(含思路)
- 單元測試內實現屬性自動繫結
- ABP入門系列(11)——編寫單元測試
- 如何編寫介面測試用例?測試工程師必備技能!工程師
- 如何測試 Flutter 應用? ー 單元測試Flutter
- 單元測試:單元測試中的mockMock
- Qt DLL總結【二】-建立及呼叫QT的 DLLQT
- JavaScript單元測試及原理JavaScript