VS2010下生成dll的方法
阿新 • • 發佈:2019-01-09
1.首先建立生成dll的專案:開啟VS2010,兩種途經建立dll專案,基於MFC DLL的和基於Win32控制檯應用程式的,這裡選擇基於Win32控制檯建立。
a.檔案--新建--專案(專案命名為simple_Dll)--Visual C++ --Win32--選擇Win32控制檯應用程式;
a.檔案--新建--專案(專案命名為simple_Dll)--Visual C++ --Win32--選擇Win32控制檯應用程式;
b.接下來下一步一直到如下圖,程式型別選擇DLL,如無特殊需要選擇空專案完成,專案建立完畢;
2.定義標頭檔案:為專案新增標頭檔案SimpleDll.h 內部新增如下程式碼,
3.定義原始檔:為專案新增相應的原始檔SimpleDll.cpp 之後便是在該原始檔中對函式進行定義,內部新增如下程式碼,#ifndef _DLL_API #define _DLL_API _declspec(dllexport) #else #define _DLL_API _declspec(dllimport) #endif #include<Windows.h> #include <intrin.h> #include <stdlib.h> #include <string.h> _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);
4.編譯至通過,生成dll:這裡有個小建議,因為dll專案不會生成exe,無法實時測試API,所以建議先在一般空專案內除錯並測試通過API的函式體程式碼,然後再建立dll專案直接編譯通過,這樣更方便可靠。 回到正題,dll專案編譯通過後有用的就是SimpleDll.h標頭檔案以及Debug目錄下新生成的Simple_Dll.dll 和Simple_Dll.lib檔案,#include "SimpleDLL.h" int add(int x, int y) { return x+y; } 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; } 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; }
5.呼叫dll:為了測試我們剛剛生成的dll,建立新的專案mytest。包含宣告SimpleDll.h標頭檔案,這裡存放了定義的介面。將simple_Dll.dll檔案放入新工程Debug資料夾下(.exe執行時需要呼叫,新專案如未編譯則沒有Debug資料夾,待編譯後有了該資料夾再將dll檔案放入)。將Simple_Dll.lib檔案放在與原始檔及標頭檔案相同路徑下(編譯時需要),接下來需要將.lib資源新增到專案中,兩種方法。
一種方法是,在專案屬性-連結器-輸入中“附加依賴項”加入Simple_Dll.lib檔案(當然,有過未設定此處亦編譯成功的經歷,但不建議);
另一種呼叫方法是在新專案主程式中新增如下命令 則無需設定依賴項;
#pragma comment(lib, "Simple_Dll.lib") //新增lib檔案引用
6.測試
#include "SimpleDll.h" //新增標頭檔案引用
#pragma comment(lib, "Simple_Dll.lib") //新增lib檔案引用
#include <process.h>
#include <locale.h>
int main()
{
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;
}