深入淺出VC++動態鏈接庫

DLL(Dynamic Linkable Library)可以簡單的看成一種倉庫,它提供給你一些可以直接拿來用的變量、函數或類

靜態鏈接庫與動態鏈接庫都是共享代碼的方式,如果採用靜態鏈接庫,則無論你願不願意,lib中的指令都被直接包含在最終生成的EXE文件中了。但是若使用DLL,該DLL不必被包含在最終EXE文件中,EXE文件執行時可以“動態”地引用和卸載這個與EXE獨立的DLL文件。靜態鏈接庫和動態鏈接庫的另外一個區別在於靜態鏈接庫中不能再包含其他的動態鏈接庫或者靜態庫,而在動態鏈接庫中還可以再包含其他的動態或靜態鏈接庫。

Visual C++支持三種DLL,它們分別是Non-MFC DLL(非MFC動態庫)、MFC Regular DLL(MFC規則DLL)、MFC Extension DLL(MFC擴展DLL)。非MFC動態庫不採用MFC類庫結構,其導出函數爲標準的C接口,能被非MFC或MFC編寫的應用程序所調用;MFC規則DLL 包含一個繼承自CWinApp的類,但其無消息循環;MFC擴展DLL採用MFC的動態鏈接版本創建,它只能被用MFC類庫所編寫的應用程序所調用。

一。使用靜態鏈接庫

首先創建一個Win32項目


設置輸出爲靜態庫


新建一個.h文件,放置輸出函數的申明,內容如下:

#ifndef _STATIC_LIBRARY_H_
#define _STATIC_LIBRARY_H_

extern "C" int add(int a, int b);

#endif

新建一個cpp文件,放置輸出函數的定義,內容如下:

#include "StaticLibrary.h"

int add(int a, int b)
{
	return a + b;
}

編譯後,把.h文件和編譯出來的lib文件提供給使用方,使用方包含頭文件並且在工程中引用lib文件就可以調用靜態庫中的內容了

二。使用動態鏈接庫

首先創建一個Win32項目,同上,指定輸出爲Dll

新建.h文件,申明輸出函數的定義

#ifndef _DYNAMIC_LIBRARY_H_
#define _DYNAMIC_LIBRARY_H_

extern "C" int __declspec(dllexport) add(int x, int y);
#endif

新建.cpp文件,實現函數體

#include "DynamicLibrary.h"

int add(int x, int y)
{
	return x + y;
}

編譯這個工程後,就可以生成dll文件了,使用dll文件有兩種方式:

1)動態調用

	HINSTANCE hInstance = NULL;
	hInstance = ::LoadLibraryA("DynamicLibrary.dll");
	if (hInstance != NULL)
	{
		ADD pFunc = (ADD)(GetProcAddress(hInstance, "add"));
		if (pFunc != NULL)
		{
			cout << pFunc(2, 4) << endl;
		}
		::FreeLibrary(hInstance);
	}

動態調用的好處是,只有在使用的時候纔會將dll加載到內存,不用的時候可以卸載dll,節省內存

2)靜態調用

需要將動態庫編譯生成的lib文件和dll文件都提供給使用者,添加如下代碼

#pragma comment(lib, "..\\Debug\\DynamicLibrary.lib") 
extern "C" int __declspec(dllimport) add(int x,int y);
注意,lib文件的路徑是相對於使用者工程的路徑,而動態調用時的dll文件路徑,是相對於調用者本身的路徑

申明這個函數後,就可以直接使用了

cout << add(2, 4) << endl;




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章