?? lc_bcb_63.txt
字號:
Windows下DLL編程技術(shù)及應用
Windows下DLL編程技術(shù)及應用
摘 要:
本文介紹了DLL技術(shù)在Windows編程中的基本運用方法及應用,給出了直接內(nèi)存
訪問及端口I/O的兩個實用DLL的全部源代碼。
關(guān)鍵詞: DLL
Windows編程 內(nèi)存訪問 I/O
一 、引
言
由于Windows為微機提供了前所未有的標準用戶界面、圖形處理能力和簡單靈便的操作,絕大多數(shù)程序編制人員都已轉(zhuǎn)向或正在轉(zhuǎn)向Windows編程。在許多用戶設(shè)計的實際應用系統(tǒng)的編程任務(wù)中,常常要實現(xiàn)軟件對硬件資源和內(nèi)存資源的訪問,例如端口I/O、DMA、中斷、直接內(nèi)存訪問等等
。若是編制DOS程序,這是輕而易舉的事情,但要是編制Windows程序,尤其是WindowsNT環(huán)境下的程序,就會顯得較困難。
因為Windows具有"與設(shè)備無關(guān)"的特性,不提倡與機器底層的東西打交道,如果直接用Windows的
API函數(shù)或I/O讀寫指令進行訪問和操作,程序運行時往往就會產(chǎn)生保護模式錯誤甚至死機,更嚴重的情況會導致系統(tǒng)崩潰。那么在Windows下怎樣方便地解決上述問題呢?用DLL(Dynamic
Link
Libraries)技術(shù)就是良好途徑之一。
DLL是Windows最重要的組成要素,Windows中的許多新功能、新特性都是通過DLL來實現(xiàn)的,因此掌握它、應用它是非常重要的。其實Windows本身就是由許多的DLL組成的,它最基本的三大組成模塊Kernel、GDI和User
都是DLL,它所有的庫模塊也都設(shè)計成DLL。凡是以.DLL、.DRV、.FON、.SYS和許多以.EXE為擴展名的系統(tǒng)文件都是DLL,要是打開Windows\System目錄,就可以看到許多的DLL模塊。盡管DLL在Ring3優(yōu)先級下運行,仍是實現(xiàn)硬件接口的簡便途徑。DLL可以有自己的數(shù)據(jù)段,但沒有自己的堆棧,使用與調(diào)用它的應用程序相同的堆棧模式,減少了編程設(shè)計上的不便;同時,一個DLL在內(nèi)存中只有一個實例,使之能高效經(jīng)濟地使用內(nèi)存;DLL實現(xiàn)的代碼封裝性,使得程序簡潔明晰;此外還有一個最大的特點,即DLL的編制與具體的編程語言及編譯器無關(guān),只要遵守DLL的開發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不管用何種編程語言編制的DLL都具有通用性。例如在BC31中編制的DLL程序,可用于BC、VC、VB、Delphi等多種語言環(huán)境中。筆者在BC31環(huán)境下編譯了Windows下直接內(nèi)存訪問和端口I/O兩個DLL,用在多個自制系統(tǒng)的應用軟件中,
運行良好。
二、DLL的建立和調(diào)用
DLL的建立及調(diào)用方法在許多資料上有詳細的介紹,為了節(jié)省篇幅,在這里僅作一些
主要的概括。
1.DLL的建立
關(guān)于DLL的建立,有如下幾個方面的要素是不可缺少和必須掌握的:
?.
入口函數(shù)LibMain( )
就象C程序中的WinMain( )一樣,Windows每次加載DLL時都要執(zhí)行LibMain(
)函數(shù),主要用來進行一些初始化工作。通常的形式是:
int FAR PASCAL LibMain(HINSTANCE
hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR
lpszCmdLine)
{
if(wHeapSize!=0) //使局部堆、數(shù)據(jù)段可移動
UnlockData(0);
//解鎖數(shù)據(jù)段
/*此處可進行一些用戶必要的初始化工作*/
return 1; //初始化成功
}
?出口函數(shù)WEP(
)
Windows從內(nèi)存中卸載DLL時,調(diào)用相應的出口函數(shù)WEP(
),主要做一些清理工作,如釋放占用的內(nèi)存資源;丟棄某些字串、位圖等資源;關(guān)閉打開的文件等等。
?自定義的輸出函數(shù)
為了讓位于不同內(nèi)存段的應用程序進行遠程調(diào)用,自定義的輸出函數(shù)必須定義為遠程函數(shù)(使用FAR關(guān)鍵字),以防使用近程指針而得到意外的結(jié)果;同時,加上PASCAL關(guān)鍵字可加快程序的運行速度,使代碼簡單高效,提高程序的運行速度。
?輸出函數(shù)的引出方法
?
在DLL的模塊定義文件中(.DEF)由EXPORTS語句對輸出函數(shù)逐一列出。例如:
EXPORTS WEP @1 residentname
//residentname可提高DLL效率和處理速度
PortIn @2
PortOut @3 //通常對所有輸出函數(shù)附加系列號
?
在每個輸出函數(shù)定義的說明中使用_export關(guān)鍵字來對其引出。
以上兩種方法任選其中的一種即可,不可重復。后面的兩個實例分別使用了上述兩種不同的引出方式,請留意。
2.DLL的調(diào)用
加載DLL時,Windows尋找相應DLL的次序如下:
?.當前工作盤。
?Windows目錄;GetWindowsDirectory(
)函數(shù)可提供該目錄的路徑名。
?Windows系統(tǒng)目錄,即System子目錄;調(diào)用GetSystemDiretory(
)函數(shù)可獲得這個目錄的路徑名。
?DOS的PATH命令中羅列的所有目錄。
?網(wǎng)絡(luò)中映象的目錄列表中的全部目錄。
DLL模塊中輸出函數(shù)的調(diào)用方法:
不論使用何種語言對編譯好的DLL進行調(diào)用時,基本上都有兩種調(diào)用方式,即靜態(tài)調(diào)用方式和動態(tài)調(diào)用方式。靜態(tài)調(diào)用方式由編譯系統(tǒng)完成對DLL的加載和應用程序結(jié)束時DLL卸載的編碼(如還有其它程序使用該DLL,則Windows對DLL的應用記錄減1,直到所有相關(guān)程序都結(jié)束對該DLL的使用時才釋放它),簡單實用,但不夠靈活,只能滿足一般要求。動態(tài)調(diào)用方式是由編程者用API函數(shù)加載和卸載DLL來達到調(diào)用DLL的目的,使用上較復雜,但能更加有效地使用內(nèi)存,是編制大型應用程序時的重要方式。具體來說,可用如下的方法調(diào)用:
?.在應用程序模塊定義文件中,用IMPORTS語句列出所要調(diào)用DLL的函數(shù)名。如:
IMPORTS
MEMORYDLL.MemoryRead
MEMORYDLL.MemoryWrite
?讓應用程序運行時與DLL模塊動態(tài)鏈接
先用LoadLibrary加載DLL,再用GetProcAddress函數(shù)檢取其輸出函數(shù)的地址,獲得其指針來調(diào)用。如:
HANDLE
hLibrary;
FARPROC lpFunc;
int
PortValue;
M
hLibrary=LoadLibrary("PORTDLL.DLL");
//加載DLL
if(hLibrary>31) //加載成功
{
lpFunc=GetProcAddress(hLibrary,"PortIn");
//檢取PortIn函數(shù)地址
if(lpFunc!=(FARPROC)NULL)
//檢取成功則調(diào)用
PortValue=(*lpFunc)(port); //讀port端口的值
FreeLibrary(hLibrary);
//釋放占用的內(nèi)存
}
M
三、DLL應用實例源程序
1.直接內(nèi)存訪問的DLL源代碼
//.DEF文件
LIBRARY
MEMORYDLL
DESCRIPTION 'DLL FOR MEMORY_READ_WRITE '
EXETYPE WINDOWS
CODE
PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
//DLL無自己的堆棧,故沒有STACKSIZE語句
EXPORTS WEP @1 residentname
ReadMemory
@2
WriteMemory @3
//.CPP文件
#include <windows.h>
int
FAR PASCAL LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR
lpszCmdLine)
{
if(wHeapSize!=0)
UnlockData(0);
return
1;
}
int FAR PASCAL MemoryRead(unsigned int DosSeg,unsigned int
DosOffset)
{
WORD wDataSelector,wSelector;
char far *pData;
char
value;
wDataSelector=HIWORD((DWORD)(WORD FAR
*)&wDataSelector);
wSelector=AllocSelector(wDataSelector);
//分配選擇器
SetSelectorLimit(wSelector,0x2000);
//置存取界限
SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset);
//置基地址
pData=(char far
*)((DWORD)wSelector<<16);
value=*pData;
FreeSelector(wSelector);
//釋放選擇器
return (value);
}
void FAR PASCAL
MemoryWrite(unsigned int DosSeg,unsigned int DosOffset,char Data)
{
WORD
wDataSelector,wSelector;
char far
*pData;
wDataSelector=HIWORD((DWORD)(WORD FAR
*)&wDataSelector);
wSelector=AllocSelector(wDataSelector);
SetSelectorLimit(wSelector,0x2000);
SetSelectorBase(wSelector,(((DWORD)DosSeg)<<4)+(DWORD)DosOffset);
pData=(char
far
*)((DWORD)wSelector<<16);
*pData=Data;
FreeSelector(wSelector);
}
int
FAR PASCAL WEP(int nParam)
{
return 1;
}
2.端口讀寫I/O的DLL源代碼
//.DEF文件
LIBRARY PORTDLL
DESCRIPTION 'DLL FOR
PORT_IN_OUT '
EXETYPE WINDOWS
CODE PRELOAD MOVEABLE DISCARDABLE
DATA
PRELOAD MOVEABLE SINGLE
HEAPSIZE 1024
//.CPP文件
#include
<windows.h>
#include <dos.h>
int FAR PASCAL
LibMain(HINSTANCE hInstance,WORD wDataSeg,WORD
wHeapSize,LPSTR
lpszCmdLine)
{
if(wHeapSize!=0)
UnlockData(0);
return
1;
}
int FAR PASCAL _export PortOut(int port,unsigned char
value)
{
outp(port,value);
return 1;
}
int FAR PASCAL _export
PortIn(int port)
{
int result;
result=inp(port);
return
(result);
}
int FAR PASCAL _export WEP(int nParam)
{
return
1;
}
分別將上面兩個實例的.DEF文件和.CPP文件各自組成一個.PRJ文件,并進行編譯鏈接成.EXE或.DLL文件就可以在應用程序中對其進行調(diào)用。
四、結(jié)
束
語
在上面,我們利用DLL技術(shù)方便地實現(xiàn)了Windows環(huán)境下對內(nèi)存的直接訪問和端口I/O的訪問,仿效這兩個例子,還可以編制出更多的適合自己應用系統(tǒng)所需的DLL,如用于數(shù)據(jù)采集卡的端口操作及擴展內(nèi)存區(qū)訪問、視頻區(qū)緩沖區(qū)及BIOS數(shù)據(jù)區(qū)操作等許多實際應用的編程任務(wù)中。必要時只需直接更新DLL,而用不著對應用程序本身作任何改動就可以對應用程序的功能和用戶接口作較大的改善,實現(xiàn)版本升級。因此,掌握好DLL技術(shù)對Windows程序開發(fā)者很有裨益。
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本一区二区成人在线|
国产欧美视频在线观看|
成人免费观看视频|
久久疯狂做爰流白浆xx|
亚洲妇女屁股眼交7|
亚洲免费伊人电影|
中文字幕佐山爱一区二区免费|
国产午夜一区二区三区|
久久久综合精品|
久久九九久精品国产免费直播|
国产午夜亚洲精品理论片色戒
|
国产精品系列在线播放|
国精产品一区一区三区mba桃花|
蜜臀av性久久久久av蜜臀妖精|
日本欧美在线观看|
久久99国产精品尤物|
国内久久精品视频|
高清视频一区二区|
成人激情午夜影院|
91蜜桃传媒精品久久久一区二区|
91丨九色丨蝌蚪富婆spa|
91成人看片片|
91精品国产综合久久精品app
|
日本不卡视频在线|
久久99精品久久久久|
狠狠狠色丁香婷婷综合激情|
国产成人午夜精品5599|
成人一区二区在线观看|
日本高清不卡在线观看|
91精品欧美综合在线观看最新|
精品国产伦一区二区三区免费
|
国产91精品一区二区麻豆亚洲|
99re在线精品|
337p亚洲精品色噜噜噜|
精品电影一区二区三区|
国产精品欧美一区喷水|
亚洲高清在线视频|
国产精品一卡二卡在线观看|
色噜噜狠狠色综合中国|
精品日韩在线观看|
亚洲男帅同性gay1069|
久久福利资源站|
色婷婷狠狠综合|
精品精品国产高清一毛片一天堂|
中文字幕一区视频|
日本视频在线一区|
91国产免费看|
日本一区二区三区dvd视频在线|
亚洲综合清纯丝袜自拍|
国产精品影音先锋|
欧美顶级少妇做爰|
成人欧美一区二区三区视频网页
|
久久久精品2019中文字幕之3|
亚洲精品高清在线观看|
国产一区二区电影|
7777精品伊人久久久大香线蕉的|
国产精品丝袜久久久久久app|
首页综合国产亚洲丝袜|
成人18精品视频|
久久久噜噜噜久久中文字幕色伊伊|
一区二区三区四区亚洲|
岛国精品一区二区|
日韩精品一区二区三区视频播放|
一区二区三区精品在线观看|
国产激情视频一区二区三区欧美|
91精品国产综合久久蜜臀|
亚洲综合999|
色呦呦日韩精品|
国产精品久久看|
不卡视频一二三四|
国产午夜一区二区三区|
狠狠色丁香婷综合久久|
日韩欧美国产wwwww|
亚洲国产视频直播|
欧美三级中文字幕在线观看|
亚洲精品老司机|
色哟哟国产精品免费观看|
国产精品高清亚洲|
色婷婷综合久久久|
亚洲精品videosex极品|
色婷婷精品久久二区二区蜜臀av
|
色欧美日韩亚洲|
亚洲欧美日韩国产另类专区
|
亚洲综合一区在线|
在线观看中文字幕不卡|
亚洲精品成人少妇|
欧美性猛片aaaaaaa做受|
亚洲一区国产视频|
欧美高清视频www夜色资源网|
日韩高清在线一区|
日韩精品自拍偷拍|
国产在线视视频有精品|
久久精品夜色噜噜亚洲aⅴ|
国产麻豆精品95视频|
91精品婷婷国产综合久久竹菊|
久久久噜噜噜久久中文字幕色伊伊|
另类小说综合欧美亚洲|
日韩美女主播在线视频一区二区三区
|
91福利国产精品|
亚洲成人午夜影院|
精品精品国产高清一毛片一天堂|
精品亚洲porn|
亚洲色图视频网|
欧美精品丝袜久久久中文字幕|
日本成人超碰在线观看|
久久久电影一区二区三区|
成人的网站免费观看|
亚洲精品精品亚洲|
日韩一区二区视频|
高清视频一区二区|
五月综合激情日本mⅴ|
精品国产sm最大网站免费看|
成人国产精品免费观看视频|
亚洲v精品v日韩v欧美v专区|
精品久久五月天|
色综合久久88色综合天天6|
日韩电影在线观看网站|
国产精品亲子伦对白|
欧美男同性恋视频网站|
国产91在线看|
五月婷婷综合网|
中文字幕的久久|
在线不卡免费av|
99久久er热在这里只有精品15|
亚洲第一主播视频|
中文字幕亚洲不卡|
精品乱人伦小说|
欧美日本视频在线|
99久久国产综合精品麻豆|
久久电影网电视剧免费观看|
亚洲另类春色校园小说|
国产日韩欧美高清|
欧美一区二区日韩|
欧美中文字幕不卡|
99久久精品国产精品久久|
精品在线免费视频|
日韩国产欧美在线观看|
亚洲美女屁股眼交|
国产精品久久久久久久蜜臀|
日韩亚洲欧美高清|
777色狠狠一区二区三区|
色悠久久久久综合欧美99|
丁香啪啪综合成人亚洲小说|
国内精品伊人久久久久av一坑|
亚洲午夜国产一区99re久久|
综合av第一页|
国产精品理伦片|
国产欧美日韩亚州综合|
久久精品在线免费观看|
精品国产乱码久久久久久久|
欧美精品久久久久久久多人混战|
色欧美日韩亚洲|
欧美亚洲综合另类|
在线欧美日韩精品|
91久久精品一区二区二区|
91亚洲精品乱码久久久久久蜜桃|
高清成人免费视频|
成人午夜在线播放|
成人高清视频免费观看|
成人福利视频网站|
91亚洲男人天堂|
欧美日韩一区二区三区在线看|
色婷婷精品大在线视频
|
一区二区三区国产豹纹内裤在线|
欧美国产日本视频|
成人欧美一区二区三区小说|
中文字幕一区二区三区乱码在线|
中文字幕日本不卡|
亚洲精品日韩一|
日韩电影在线一区二区三区|
热久久久久久久|
国产乱码精品1区2区3区|
国产精品77777|
日本韩国欧美三级|
欧美三级乱人伦电影|
欧美久久一区二区|
精品国产乱码久久久久久免费|
国产日韩在线不卡|
亚洲综合999|
久久成人免费网|
99久久综合色|
91 com成人网|
国产精品色哟哟|
天天综合网天天综合色|
国产老妇另类xxxxx|
99国产精品视频免费观看|
欧美日韩成人一区二区|
久久这里只有精品6|
亚洲免费在线观看|
美国毛片一区二区三区|
99综合电影在线视频|
欧美日韩亚州综合|
久久精品夜夜夜夜久久|
亚洲午夜视频在线|
国产寡妇亲子伦一区二区|
欧美三级电影精品|
成人欧美一区二区三区小说
|
国产精品欧美一区喷水|
亚洲成人tv网|
成人午夜精品在线|