1.靜態連結庫與動態連結程式庫區別:
靜態連結庫:lib中的指令被直接包含在最終產生的EXE檔案中。
動態連結程式庫:dll不必被包含在最終的EXE中,EXE檔案執行時可以動態地引用和卸載DLL檔案。
同時,靜態連結庫中不能再包含其他的動態連結程式庫或靜態庫,而動態連結程式庫中可以包含其他的動態或靜態庫。
2.VC++支援的DLL:
DLL的編製與具體的程式設計語言及編譯器無關,動態連結程式庫隨處可見,VC++支援三種DLL:非MFC動態庫、MFC規則DLL和MFC擴充DLL。DLL匯出函數(或變數、類)可供應用程式調用;DLL內建函式只能在DLL程式內使用,應用程式無法調用它們。
3.匯出函數的聲明方式:
一種在函式宣告類型和函數名之間加上“_declspec(dllexport)”。
另外一種採用模組定義(.def)檔案聲明,需要在庫工程中添加模組檔案,格式如下:
LIBRARY 庫工程名稱
EXPORTS 匯出函數名
4.DLL的調用方式:
一種靜態調用,由編譯系統完成對DLL的載入和應用程式結束時DLL的卸載。
另外一種動態調用,由編程者用API函數載入和卸載DLL(DLL載入—DLL函數地址擷取—DLL釋放)方式。
5.所有庫工程編譯時間必須Release方式:
Build—set active configuration—選擇庫工程的release方式
6.樣本:
一、 函數----建立動態連結程式庫(MFC規則DLL)
1. New--projects--MFC AppWizard(dll)--Regular DLL using shared MFC DLL //取名為MFC_dll
2. def檔案中添加:函數名(Add_new)
3. h檔案中添加:外部函式宣告//求和函數,函數名為Add_new
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b);
4. cpp檔案中添加: 外部函數實現
extern "C" __declspec(dllexport) int __stdcall Add_new(int a,int b)
{
return a+b;
}
5. build--set active configuration--win32 release--ok
6. 產生
7. 根目錄下release檔案夾中dll,lib與根目錄下h檔案即為所需
二、 函數----調用動態連結程式庫(把MFC_dll.dll和MFC_dll.lib拷到工程所在目錄)
//靜態調用(.h可以寫到.cpp檔案中)
1. new--projects--win32 console application--an empty project
2. 添加h檔案:(test.h)
#pragma comment(lib,"MFC_dll.lib") //告訴編譯器DLL相對應的lib檔案所在路徑和檔案名稱
extern "C" _declspec(dllimport) int _stdcall Add_new(int a,int b);//聲明匯入函數
3. 添加cpp檔案:(main.cpp)
#include "test.h"
int main()
{
cout<
return 0;
}
//動態調用
#include
#include
typedef int (* lpAddFun)(int ,int);//定義一個與Add_new函數接受參數類型和傳回值均相同的函數指標類型
int main()
{
HINSTANCE hDll;//控制代碼
lpAddFun addFun;//函數指標
hDll=LoadLibrary("dllTest.dll");//動態載入DLL模組控制代碼
if(hDll)
{
addFun=(lpAddFun) GetProcAddress(hDll,"Add_new");//得到所載入DLL模組中函數的地址
if(addFun)
{
int result=addFun(2,3);
printf("%d",result); } FreeLibrary(hDll);//釋放已經載入的DLL模組
}
return 0;
}
三、 變數----建立動態連結程式庫(非MFC DLL)
1. new---projects---win32 dynamic-link library----an empty project(Sample)
2. 添加sample.h
#ifndef SAMPLE_H
#define SAMPLE_H
extern int dllGlobalVar;
#endif
3. 添加 sample.cpp
#include "sample.h"
#include
int dllGlobalVar;
bool APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
//windows在載入DLL時,需要一個入口函數,就如同控制台或DOS程式需要main函數、win32程式需要winmain函數一樣。所以引入一個不做任何操作的預設DllMain的函數版本。是DLL的內建函式。