999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

Windows下動態鏈接庫的創建和使用

2007-07-05 01:40:06劉大鵬
智能計算機與應用 2007年3期

劉大鵬

摘要:介紹了Windows下動態鏈接庫的創建和使用方法。

關鍵詞:動態鏈接庫導出函數隱式鏈接顯式鏈接

中圖分類號TF311.52文獻標識碼B文章編號:1002-2422(2007)03--0048-02

1動態鏈接庫的創建

在VC++6.0開發系統的菜單“File”中單擊“New”,在彈出窗口中選擇Project選項卡,可以看到有Win32 Dy-name-Link Library和MFC AppWizard兩種方式創建動態鏈接庫。前者用來創建不與MFC(微軟基礎類庫)鏈接的動態鏈接庫,稱為非MFC動態庫,后者創建與MFC鏈接的動態鏈接庫,稱為MFC動態庫。

1.1創建非MFC動態庫

選擇Win32 Dynamic-Link Library,在Project name編輯框輸入工程名:MyDLL,創建一個空的非MFC工程。

要使DLL中包含的某些函數和數據能夠被外部應用程序調用,就應該在創建DLL時,指出這些函數(數據)是可導出的,稱為導出函數(數據)。導出函數有兩種方法,一種是在聲明函數原型語句中的函數類型關鍵字左邊添加導出關鍵字_declspec(dlhxport);另一種是使用模塊定義文件.def。

(1)使用導出關鍵字declapee(duexport)導出函數

在前面創建的空工程中加入MyDLL.h、MyDL、cpp兩個文件,

頭文件MyDLL.h.代碼如下:_declspec(dllexport)int Add(int x,int y);

實現文件MyDLL.cpp代碼如下:#include

#include“MyDLL.h”

int Add(int x,int y)

{return(x+y);}

在工程中有一個被導出函數(輸出函數)Add(),用來進行加法運算。

編譯、連接工程MyDLL,成功后,可以看到debug目錄下生成了動態庫MyDLL.d11和引入庫MyDLL.Iib這兩個文件。引入庫文件中存有對應DLL的文件名和輸出函數名等(MyDLL、Add等),動態庫文件中存有實際的函數和數據。

(2)使用模塊定義文件.def導出函數

對方法(1)中建立的工程,刪除文件MyDLL.h,保留文件MyDLL.cpp,再加入文本文件MyDLL.def作為模塊定義文件。在MyDLL.def中輸入代碼如下:

;MyDLL.def

LIBRARY MyDLL

EXPORTS

Add

一個模塊定義文件至少要有兩條語句,一條是LI-BRARY語句,用它指出DLL的名字,該語句必須位于除注釋語句外的其它語句之前;另一條是EXPORTS語句,在它之下列出輸出函數的名字。

1.2創建MFC動態庫

選擇MFC AppWizard,在Project name編輯框輸入工程名:MyDLL,單擊OK,可創建三種類型的MFC動態庫:第一種是與MFC靜態鏈接的常規DLL(Regular DLLWith MFG Statically Linked);第二種是與MFC動態鏈接的常規DLL(Regular DLL using shared MFC DLL)。常規DLL既可以被MFC應用程序使用,也可以被非MFC應用程序使用(BC,VB等)。第三種是MFC擴展型DLL(MFCExtension DLL),這種DLL與MFC動態鏈接,其特點是可導出MFC派生類,但MFC擴展型DLL只能被那些動態鏈接到MFC的應用程序使用。

MFC動態庫導出函數(或變量)的方法與非MFC動態庫的導出方法相同。

MFC擴展DLL導出類的常用方法是在類的聲明前加一個宏“AFX_EXT_CLASS”,例如:class AFX_EXT_CLASSCMyClass;

特別要注意的是,對于動態鏈接到MFC的DLL,其輸出函數若要調用MFC,則在該輸出函數的定義體內第一條語句必須是下面的宏語句:

AEX_MANAGE_STATE(AfxCetStaticModuleStme());

此語句保證在其后輸出函數中的語句能夠調用MFC。

新創建的動態鏈接庫提供給其它程序使用時(或發布)要提供三個文件:動態庫文件(MyDLLdll)、引入庫文件(MyDLL.lib)和頭文件(MyDLL.h)。發布與MFC動態鏈接的動態庫時還要附上VC++開發系統內的MFC#O.dll(文件名中#是MFC的版本號碼)和MSVCRT.dll這兩個動態庫。

2動態鏈接庫的使用

應用程序使用動態庫時可以采用兩種鏈接方式:隱式鏈接和顯式鏈接。

2.1隱式鏈接

應用程序使用引入庫(.lib)文件隱式鏈接到DLL,DLL中的函數和數據并不復制到可執行文件中,在可執行文件中,存放的不是被調用的函數代碼,而是DLL中所要調用的函數的內存地址。隱式鏈接方式下,操作系統加載應用程序時就加載DLL文件。

實現隱式鏈接需要創建動態庫時產生的三個文件:動態庫文件(.dll)、引入庫文件(.lib)和頭文件(.h)。隱式鏈接的三個要點如下:

(1)把動態庫的頭文件(.h)拷貝到應用程序工程目錄下,對其拷貝作如下修改:把所有的導出關鍵字declspec(dllexport)換成導入關鍵字_declspec(dllimport),在文件開始處加入語句:#pragma comment(lib,“引入庫名”),告訴Link要連接引入庫,在應用程序的各個使用DDL的.cpp文件中用語句#include包含這個頭文件(.h)。

(2)將引入庫(.lib)拷貝到應用程序工程目錄下,以便VC++的Link鏈接時使用。

(3)將動態庫(.dll)復制到應用程序工程目錄下,便于Windows查找。

下面是一個制臺應用程序DLLTestA隱式鏈接到前面創建的動態庫的例子。

頭文件DLLTestA.h代碼如下:

#pragma comment(lib,“MyDLL.lib”)

_declspec(dllimport)int Add(int x,int y);

實現文件DLLTestA.cpp代碼如下:

#1nchde

#include“DLLTestA.h”

void main()

{int a;

a=Add(20,10);

printf(“20+10=%d”,a);

}

DLLTextA.h文件中的關鍵字pmgam comment通知Link程序要鏈接MyDLL.lib。導入關鍵字_declspec(dl-Hmpoa)用來說明其后的函數是從動態庫中引入的。按Ctrl+F5鍵就可以編譯執行該程序。

2.2顯式鏈接

使用顯式鏈接時,應用程序不需要使用相應的.lib和.h文件,只需將.dll拷貝到當前工作目錄下即可。顯式鏈接方式下,應用程序運行時可以隨時加載和卸載DLL。

顯式鏈接的幾個要點如下:

(1)調用GetModuleHandle()函數檢查DLL是否已經被映射到進程的地址空間中:

(2)調用LoadLibrary函數加載DLL并得到其模塊句柄:

(3)調用GetProcAddress函數獲得DLL中輸出函數的地址:

(4)使用DLL結束后,調用FreeLibrary函數卸載DLL。

下面是在MFC對話框工程DLLTestB中實現顯式鏈接的部分代碼:

void CDLLTestBDlg::OnAdd()

{

HMODULE hlnst=GetModuleHandle(“MyDLL.dll”);

if(hlnst==NULL)

{hlnst=LoadLibrary(“MyDLL.dll”);}

typcda int(*AddProe)(int m,int n);

AddProc addp=(AddProc)GetProcAddress(hlnst“Add”);

if(!addp){“MessageBox(“獲取函數地址失敗!”);return;”}

CString str;

str.Format(“10+20=%d”,addp(10,20));

MessageBox(str);

FreeLibrary(hlnst);

}

上面代碼中使用類型定義關鍵字typedef定義與DLL中相同類型的函數指針,用來存函數的地址。

3結束語

DLL封裝了共享資源和代碼,在開發以Windows為平臺的應用程序時,使用DLL技術開發項目,可簡化項目管理,提高開發速度。因此,掌握DLL技術很有必要。

主站蜘蛛池模板: 国产真实乱人视频| 久久亚洲美女精品国产精品| 亚洲a级毛片| 国产第一色| 日韩精品一区二区三区swag| 99视频国产精品| 人妻精品久久久无码区色视| 91原创视频在线| 国产免费a级片| 亚洲美女视频一区| 99视频精品在线观看| 67194亚洲无码| 欧美色丁香| 露脸国产精品自产在线播| 一区二区三区毛片无码| 中日韩欧亚无码视频| 综合网天天| 欧美怡红院视频一区二区三区| 亚洲毛片一级带毛片基地| 国产精品无码一二三视频| 国产综合在线观看视频| 四虎影视国产精品| 亚洲综合久久成人AV| 日本一区二区三区精品AⅤ| 国产又大又粗又猛又爽的视频| 国产网站黄| 国内精品一区二区在线观看| 在线播放国产一区| 青青草原偷拍视频| 1769国产精品视频免费观看| 亚洲视频三级| 手机在线看片不卡中文字幕| 国产99久久亚洲综合精品西瓜tv| 久久国语对白| 欧美一级在线播放| 亚洲成肉网| 日韩欧美国产精品| 久久精品66| 99福利视频导航| 精品精品国产高清A毛片| 国产在线精品美女观看| 久久96热在精品国产高清| 午夜啪啪福利| 亚洲天堂福利视频| 亚洲中久无码永久在线观看软件| 在线无码私拍| 三级国产在线观看| 国产精品第| 久青草免费视频| 国产一级毛片yw| 国产sm重味一区二区三区| 国产午夜一级淫片| 欧美日韩成人在线观看 | 国产成人精品一区二区| 五月激情婷婷综合| 最新国产高清在线| 国产精品思思热在线| 日本一本正道综合久久dvd | 国产又色又爽又黄| 一本无码在线观看| 中美日韩在线网免费毛片视频| 亚洲中文字幕av无码区| 国产美女91视频| 亚洲国产成人综合精品2020| 午夜福利在线观看成人| 丝袜高跟美脚国产1区| www.99在线观看| 五月天久久婷婷| 国产男女免费视频| 日韩中文字幕亚洲无线码| 成人精品午夜福利在线播放| 九九九国产| 欧美第二区| 久久精品人人做人人综合试看| 久热中文字幕在线| 欧美无专区| 91成人试看福利体验区| 少妇精品网站| 一级毛片在线免费视频| a毛片在线| 亚洲午夜福利精品无码不卡| 欧美三级自拍|