1. 程式人生 > >VS2010下生成dll的方法

VS2010下生成dll的方法

1.首先建立生成dll的專案:開啟VS2010,兩種途經建立dll專案,基於MFC DLL的和基於Win32控制檯應用程式的,這裡選擇基於Win32控制檯建立。
    a.檔案--新建--專案(專案命名為simple_Dll)--Visual C++ --Win32--選擇Win32控制檯應用程式;

    b.接下來下一步一直到如下圖,程式型別選擇DLL,如無特殊需要選擇空專案完成,專案建立完畢;

2.定義標頭檔案:為專案新增標頭檔案SimpleDll.h   內部新增如下程式碼,

#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);
3.定義原始檔:為專案新增相應的原始檔SimpleDll.cpp   之後便是在該原始檔中對函式進行定義,內部新增如下程式碼,
#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;
}
4.編譯至通過,生成dll:這裡有個小建議,因為dll專案不會生成exe,無法實時測試API,所以建議先在一般空專案內除錯並測試通過API的函式體程式碼,然後再建立dll專案直接編譯通過,這樣更方便可靠。  回到正題,dll專案編譯通過後有用的就是SimpleDll.h標頭檔案以及Debug目錄下新生成的Simple_Dll.dll 和Simple_Dll.lib檔案,

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;
}