1. 程式人生 > >VS2010建立並使用動態連結庫(.dll)

VS2010建立並使用動態連結庫(.dll)

動態連結庫不能直接執行,也不能接收訊息。它是一個獨立的檔案,包含能被可執行程式其他DLL來呼叫其函式完成某項工作。

只有在其他模組呼叫動態連結庫中的函式時,動態連結庫才發揮作用。在實際程式設計中,可以把完成某種功能的函式放在一個動態連結庫中,

提供給其他程式呼叫。使用 DLL 是一種重用程式碼的絕佳方式。 您不必在自己建立的每個程式中重新實現同一例程,而只需對這些例程編寫一次,

然後從需要該功能的應用程式引用它們即可。

 
靜態庫(.LIB):
靜態連結庫中的所有指令全部被包含在最終生成的可執行檔案(.EXE)中。釋出可執行檔案時,不需要釋出靜態連結庫。
動態庫(.lib和.dll):

動態連結庫一般包含兩個檔案

:引入庫檔案(.lib)和DLL檔案(.dll)。引入庫檔案包含DLL檔案匯出的函式和變數的符號名,即API介面;

DLL檔案包含實際的函式和資料。在使用動態庫進行編譯連線時只需要連結引入庫檔案當可執行程式執行時,需要動態庫中的某個函式時,

才去載入所需的DLL,將DLL對映到程序的地址空間中,然後訪問DLL中的匯出的函式。釋出產品時,除了釋出可執行檔案,還要同時釋出該程式中將要呼叫的動態連結庫。

製作Dll檔案:

1.檔案--專案--Win32 控制檯程式

2.名稱:MathFuncsDll

  解決方案名稱:DynamicLibrary

3.應用程式型別--DLL、空專案

4.新建

.h檔案----新增MyMathFuns類,程式如下:

namespace MathFuncs
{
	class MyMathFuncs
	{
	public:
		///Return a+b
		<span style="color:#ff0000;">static _declspec(dllexport)</span> double Add(double a,double b);
		///Return a-b
		static _declspec(dllexport) double Subtract(double a,double b);
		///Return a*b
		static _declspec(dllexport) double Multiply(double a,double b);
		///Return a/b
		static _declspec(dllexport) double Divide(double a,double b);

		///注:_declspec(dllexport)修飾符:使DLL能夠匯出該方法以供其他應用程式使用
	};
}
注:
__declspec(dllexport) 修飾符:使 DLL 能夠匯出該方法以供其他應用程式使用。

5.新建.cpp檔案:

#include "MathFuncsDll.h"
#include <stdexcept>
using namespace std;
namespace MathFuncs
{
	double MyMathFuncs::Add(double a,double b)
	{
		return a+b;
	}
	double MyMathFuncs::Subtract(double a,double b)
	{
		return a-b;
	}
	double MyMathFuncs::Multiply(double a,double b)
	{
		return a*b;
	}
	double MyMathFuncs::Divide(double a,double b)
	{
		if(b==0)
		{
			throw new invalid_argument("b cannot be zero!");
		}

		return a/b;
	}
}

6.專案--屬性--配置屬性--常規--配置型別--.dll

7.生成解決方案。此時,在專案資料夾下新增了Debug資料夾,資料夾中包含新生成的.dll/.lib等檔案。

在程式中呼叫DLL檔案:

此方法即新增OpenCV動態連結庫的方法。

步驟:

1.將.h/.lib/.dll複製到工程資料夾中

例:

Project->xxxSystem(解決方案)->xxxSystem(專案)->.h

Project->xxxSystem(解決方案)->Debug->.lib/.dll

2.專案→屬性→VC++目錄→庫目錄→新增.lib檔案的絕對地址

或:在解決方案--右鍵--新增--.lib/.dll

3.新增標頭檔案

例:在xxxxxx.cpp中用到,則

#include "MyMathFuncs.h"

……

void Cxxxxxx::OnBnClickedButton1()

{

         CString str;

         doublea = 7.4,c;

         int b =99;

         c=MathFuncs::MyMathFuncs::Add(a,b);

         str.Format("a+b=%lf",c);

         MessageBox(str);

}