所屬欄目:計算機應用論文 發布日期:2015-06-22 15:28 熱度:
動態庫又稱動態鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數據的庫,DLL不是可執行文件。動態庫是計算機網絡和通信技術上不可缺少的一部分,本文是一篇研究生發表論文期刊投稿的論文范文,文章論述了利用動態庫技術進行通信協議模塊化設計。
摘要:該文針對利用動態庫技術進行通信協議模塊化設計進行研究,首先簡要地介紹了動態庫基本理論,然后給通信協議動態庫設計方法和設計要點,最后給出了基于UDP的通信協議動態庫開發實例。
關鍵詞:動態庫
在設計通信程序時,在其程序的實現形式上主要分為可執行應用程序和動態鏈接庫。前者能夠獨立運行,通常針對某一特定需求而使用,功能完備但可移植性不強;后者不能獨立運行,只是以庫的形式提供相關功能的函數、類及其他數據,動態庫可以為某一特定需求而定制。
利用動態庫技術進行通信協議設計,按照從核心到外圍的層次關系進行模塊化組合設計,各模塊動態加載,可擴展,獨立編譯,軟件系統層次明確、內外松散耦合,便于功能組合和升級改造,提升軟件質量。
1 動態庫基本理論
1.1動態庫分類
VC支持三種DLL,它們是:
1)Non-MFC DLL:指的是不用MFC的類庫結構,直接用C語言寫的DLL,其輸出函數一般用的是標準C接口,并能被非MFC或MFC編寫的應用程序所調用。
2)Regular DLL:和下述Extension DLL一樣,是用MFC類庫編寫的,能夠被所有支持DLL技術的語言所編寫的應用程序調用。在這種動態鏈接庫中,它必需有一個從CWinAPP繼承下來的類,DLLMain函數被MFC提供,不用自己顯式的寫出來。
3)Extension DLL:只被用MFC類庫所編寫的應用程序所調用。在這種動態鏈接庫中,用戶可以從MFC繼承想要的、更適于自己用的類,并把它提供給自己的應用程序。與Regular DLL不一樣,它沒有一個從CWinAPP繼承下來的類的對象,用戶必需為自己的DLLMain函數添加初始化代碼和結束代碼。
1.2 DLL調用方法
DLL的創建是供可執行應用程序調用的。使用了外部DLL的應用程序的創建與普通應用程序的創建完全一樣。在此基礎上可以對外部DLL進行顯式或隱式調用。對DLL的調用分為兩種,一種是顯式的調用,一種是隱式的調用。所謂顯示的調用,是指在應用程序中用LoadLibrary或MFC提供的AfxLoadLibrary顯示地將自己所做的動態庫調進來,動態鏈接庫的文件名即是上面函數的參數,再用GetProcAddress獲取想要引入的函數。自此,就可以像使用應用程序自定義的函數一樣來調用此引入函數了。在應用程序退出之前,應該用FreeLibrary或MFC提供的AfxFreeLibrary釋放動態鏈接庫。
隱式的調用則需要把產生動態鏈接庫時產生的.LIB文件加入到應用程序的工程中,想使用DLL中的函數時,只需聲明一下即可,而無需調用LoadLibrary和FreeLibrary對DLL進行顯示加載、卸載。
隱式調用的方法比較簡單,但隱式調用的DLL在應用程序加載的同時被加載到內存中,當應用程序調用的DLL比較多時,裝入的過程十分緩慢。通過延遲加載技術可以很好地解決該問題。但除了必須的.dll文件外還需要DLL的.h文件和.lib文件。這在那些只提供.dll文件的場合就無法使用了,而只能采用顯式調用方式。
1.3 輸入函數和輸出函數
模塊是Windows的基本構成單元,主要由應用程序模塊和DLL模塊組成。這兩類模塊的結構是一樣的,都可以“輸出”(export)函數供其他模塊使用,也可以“輸入”(import)其他模塊的函數。輸入一個函數就是在代碼中創建指向該函數的動態鏈接,而非像在靜態鏈接中那樣實際裝配該函數的代碼。與DLL不同,由應用程序模塊輸出的函數是無法為其他應用程序模塊所輸入的。
MFC提供的用于輸出的函數的關鍵字是__declspec和dllexport。在要輸出的函數、類或數據的聲明前使用__declspec(dllexport)表示輸出。若要輸出動態庫中的函數mimafuwu(HWND hWnd)供應用程序輸入使用則在動態庫中聲明該函數如下:
#define REGULARMFCDLLLIB __declspec(dllexport)
extern "C" REGULARMFCDLLLIB unsigned short mimafuwu(HWND hWnd);
在應用程序輸入聲明如下,_cdecl為調用約定:
unsigned short (_cdecl *Func)(HWND);
2 通信協議動態庫設計
2.1 動態庫結構
通信協議動態庫一般只包含一個輸出函數和由該輸出函數創建的三個UI線程(用戶界面線程)即主控線程、數據接收線程和數據發送線程組成。三個線程分別對應三個模塊:DLL主控模塊,DLL數據接收模塊和DLL數據發送模塊。DLL主控模塊負責與調用DLL的應用程序及DLL數據收發模塊交互數據和消息,同時負責按接口協議進行解析、分包、組包、超時重傳等數據處理操作,DLL數據收發模塊負責與外部通信端進行物理層接口(如網口、串口等)的數據收發,DLL數據收發模塊相互獨立不涉及信息交互。通信協議動態庫結構示意圖見圖1。
2.2 動態庫接口及協議
通信協議動態庫接口設計為內部接口和外部接口。如圖2所示,內部接口為動態庫內部模塊之間的接口,外部接口有兩種,分為動態庫與調用其的應用程序之間的接口和動態庫與外部通信端之間的接口。
2.2.1內部接口及協議
動態庫內部接口為DLL主控模塊與DLL數據發送模塊之間和DLL主控模塊與DLL數據接收模塊之間的接口。內部模塊之間主要通過自定義消息方式構造協議進行數據通信。 2.2.2外部接口及協議
2.2.2.1 動態庫和調用DLL的應用程序之間接口及協議
動態庫和調用DLL的應用程序之間接口為DLL輸出函數。兩者之間主要通過自定義消息方式構造協議進行數據通信。
2.2.2.2 動態庫和外部通信端之間接口及協議
動態庫和外部通信端之間的接口主要為以太網口和串口、并口等通信端口等。使用的接口協議主要有:基于TCP的網絡通信協議、基于UDP的網絡通信協議和基于串口/并口的端口通信協議等。
2.3 動態庫信息處理流程
調用DLL的A端應用程序擬制一份數據按動態庫和調用DLL的應用程序之間接口協議將其提交DLL主控模塊,DLL主控模塊按動態庫和外部通信端之間接口協議進行數據處理后再按內部接口協議將數據提交DLL發送模塊,DLL發送模塊將數據發送到B端。DLL接收模塊接收B端數據后按內部接口協議將其提交DLL主控模塊,DLL主控模塊按動態庫和外部通信端之間接口協議收齊數據后,再按動態庫和調用DLL的應用程序之間接口協議將數據提交A端應用程序。即:
1)A端調用DLL的應用程序->DDL主控模塊->DLL發送模塊- >B端
2)B端 - >DLL接收模塊->DLL主控模塊->A端調用DLL的應用程序
3 通信協議動態庫設計要點
3.1動態庫中的輸出函數
應用程序一啟動就應加載動態庫,調用動態庫輸出函數。動態庫中一般只有一個輸出函數,該函數只負責創建UI線程。輸出函數參數須包含應用程序某窗口句柄,一般為主框架窗口句柄,同時輸出函數將必要的變量信息如動態庫創建的某個線程的線程號回傳至應用程序。通過窗口句柄和線程號作為參數,以便于應用程序和動態庫之間以自定義消息的方式進行通信。
3.2動態庫中的超時時鐘設置
動態庫中超時時鐘的設置與應用程序有別,不能使用ON_WM_TIMER()消息機制,需采用自定義消息方式。具體方法如下。
自定義超時消息:
ON_MESSAGE(WM_TIMER, OnTimer)
設置超時時鐘:
UNIT m_iTimer=::SetTimer(0,0,3000,NULL);//3000表示定時3秒
超時消息處理函數:
void OnTimer(WPARAM wparam,LPARAM lparam)
{
UINT nIDEvent =(UINT)wparam;
if(nIDEvent==m_iTimer)
{
//超時處理
}
}
關閉超時時鐘:
KillTimer(0,m_iTimer);
3.3動態庫與調用DLL的應用程序之間的消息傳遞
如前所述,動態庫與調用DLL的應用程序之間消息傳遞時首先需要知道應用程序窗口句柄和動態庫某線程的線程號,使用的MFC消息函數如下。
動態庫往應用程序發消息:
::PostMessage(
ApphWnd,
WM_DLL_TO_APP_MSG,
WPARAM wparam,
LPARAM lparam);
其中,參數ApphWnd為應用程序主框架窗口句柄,WM_DLL_TO_APP_MSG為自定義消息標識,wparam為消息中攜帶的參數一(如數據指針等),lparam為消息中攜帶的參數二(如數據長度等)。
應用程序往動態庫發消息:
PostThreadMessage(
m_Threadid,
WM_APP_TO_DLL_MSG,
WPARAM wparam,
LPARAM lparam);
其中,參數m_Threadid為動態庫中某個線程的線程號,應用程序將消息發往該線程,WM_APP_TO_DLL_MSG為自定義的消息標識,wparam為消息中攜帶的參數一(如數據指針等),lparam為消息中攜帶的參數二(如數據長度等)。
3.4 通信參數的設置和使用
動態庫對通信參數(諸如IP地址、端口號、串口配置,動態庫路徑、分包長度、固定包頭、超時時鐘值和重傳次數等)的設置和使用一般有兩種方式。一種為,讀取第三方軟件形成的通信參數配置文件的方式。另一種為,應用程序調用輸出函數時將通信參數傳遞給動態庫,動態庫再進行通信參數的設置和使用。兩種方式以前者為優。
4 基于UDP的通信協議動態庫開發實例
結合第3節和第4節內容,本節以創建Regular DLL和顯式調用DLL為例,設計一個基于UDP的通信協議動態庫。為了使用該動態庫,首先創建一個調用該DLL的簡單應用程序。
第一步:創建應用程序
啟動VC++,單擊[File]->[New]菜單項,在project頁中選擇MFC AppWizard(exe),新建一個名為MyApp的基于單文檔界面的工程。
第二步:創建DLL
1)啟動VC++,單擊[File]->[New]菜單項,在project頁中選擇MFC AppWizard(dll),新建一個名為MyLib的工程,在第一步的時候選擇,創建一個動態鏈接MFC的規則DLL。
2)構造輸出函數mimafuwu():
① 在MyLib工程中填加空白源文件mimafuwu.cpp和mimafuwu.h; ② 在mimafuwu.cpp文件中輸入如下代碼:
#include "StdAfx.h"
#include "mimafuwu.h"
//輸出函數根據具體應用而定制。
extern "C" REGULARMFCDLLLIB unsigned short mimafuwu(HWND hWnd)
{
AfxMessageBox("裝載DLL模塊成功!");
return 0;
}
③ 在mimafuwu.h文件中輸入如下代碼:
#define REGULARMFCDLLLIB __declspec(dllexport)
//輸出函數聲明,輸出函數根據具體應用而定制。
extern "C" REGULARMFCDLLLIB unsigned short mimafuwu(HWND hWnd);
3)編譯后會生成庫文件MyLib.dll。
第三步:應用程序加載和使用DLL
1)在創建的MyApp工程的MainFrm.cpp文件的函數
CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
return語句前添加如下代碼,完成對MyLib.dll的動態鏈接,并完成對輸出函數mimafuwu()的調用:
//選擇好MyLib.dll文件路徑,裝載DLL模塊
HINSTANCE hDLL = ::LoadLibrary("MyLib.dll");
//輸入函數聲明
unsigned short (_cdecl *Func)(HWND);
// 獲取函數指針
Func = (unsigned short(_cdecl *)(HWND))::GetProcAddress(hDLL, "mimafuwu");
//調用DLL中的函數mimafuwu(HWND)
//同時將應用程序主框架窗口句柄傳至動態庫
unsigned short nResult = Func(GetSafeHwnd());
在上述代碼中,首先由LoadLibrary()將DLL模塊映射到進程的內存空間,對DLL模塊進行動態加載。其函數原型為:
LoadLibrary(LPCTSTR lpLibFileName);
其中,參數lpLibFileName為待加載的模塊名,如不特殊指定擴展名,Windows將指定默認的擴展名為“.dll”。如果成功加載則返回HINSTANCE值,標識了文件映像映射到進程地址空間的虛擬內存地址;如果加載失敗則返回NULL,可通過GetLastError()了解進一步的信息。
接下來的GetProcAddress()函數將在DLL模塊中找到要輸入符號的地址。其函數原型為:
FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName);
其中,參數hModule為通過LoadLibrary()等函數而得到的DLL模塊句柄,lpProcName為要查找的輸入符號名。GetProcAddress()在成功調用后將返回DLL的輸出符號地址,否則返回空指針NULL。通過其返回得到的內存地址即可完成對輸出函數的調用。
當進程中的線程不再需要DLL中的輸出符號時,可以通過AfxFreeLibrary()函數從進程的地址空間顯式卸載DLL。其函數原型如下:
BOOL FreeLibrary(HMODULE hLibModule);
其中參數hLibModule標識了要卸載的DLL模塊。
2) 編譯后會生成可執行文件MyApp.exe,確保文件MyLib.dll路徑正確。運行后若彈出提示框,則應用程序加載和使用DLL成功。
第四步:根據具體應用定制應用程序和DLL
在前面生成的MyApp和MyLib工程的基礎上進行修改。應用程序一啟動就加載一個開了三個UI線程(用戶界面線程)即數據接收線程、數據發送線程和主控線程的動態庫,應用程序與動態庫主控線程、動態庫收發線程與主控線程之間通過自定義消息方式進行數據交互。在動態庫庫數據接收線程中創建UDP套接字,通過將IP地址設置為127.0.0.l實現應用程序對數據的自發自收。
整個信息流程為:應用程序擬制一份數據提交動態庫主控線程,動態庫主控線程將收到到的數據提交動態庫發送線程發送,動態庫接收線程收到數據后提交動態庫主控線程,動態庫主控線程將數據提交應用程序,即:應用程序->DLL主控->DLL發送- >DLL接收->DLL主控->應用程序。數據在各提交過程中不做任何處理,應用程序發出的數據和收到的數據內容一致。
5 結束語
編寫通信協議動態鏈接庫DLL設計說明,目的是作為規范和指導DLL形式的通信協議程序模塊設計工作的技術文件。同時對DLL基本程序設計、實現DLL功能擴展和對第三方提供的DLL功能模塊調用等提供編程基礎。利用動態庫技術,遵循從核心到外圍的層次關系進行模塊化組合設計理念,使軟件系統層次明確,各模塊松散耦合、獨立開發、獨立驗證、獨立升級改造,便于整個軟件系統維護與功能擴展,提升軟件質量。
參考文獻:
[1] Roberts J W. Traffic control in the BISDN[J]. Computer Networks and ISDN Systems, 1993(25): 1055-1064.
[2] 郎銳, 孫方. Visual C++ 網絡通信程序開發基礎及實例解析[M]. 2版. 北京: 機械工業出版社, 2006.
[3] Kruglinski D J. Visual C++ 技術內幕[M]. 4版. 北京: 清華大學出版社, 2009.
[4] Ian Sommervill. 軟件工程[M]. 9版. 北京: 機械工業出版社, 2011.
研究生論文發表期刊推薦《通信管理與技術》雜志以“宣傳通信政策法規,關注通信發展趨勢,傳播通信管理理念,跟蹤通信前沿技術,搭建業界交流平臺,普及現代通信知識”為宗旨,努力成為政府與企業、企定與企業相互溝通與合作的紐帶,成為交流通信企業經營管理經驗和通信技術的平臺。
文章標題:研究生發表論文期刊投稿優秀論文范文賞析
轉載請注明來自:http://www.56st48f.cn/fblw/dianxin/yingyong/27170.html
攝影藝術領域AHCI期刊推薦《Phot...關注:105
Nature旗下多學科子刊Nature Com...關注:152
中小學教師值得了解,這些教育學...關注:47
2025年寫管理學論文可以用的19個...關注:192
測繪領域科技核心期刊選擇 輕松拿...關注:64
及時開論文檢索證明很重要關注:52
中國水產科學期刊是核心期刊嗎關注:54
國際出書需要了解的問題解答關注:58
合著出書能否評職稱?關注:48
電信學有哪些可投稿的SCI期刊,值...關注:66
通信工程行業論文選題關注:73
SCIE、ESCI、SSCI和AHCI期刊目錄...關注:120
評職稱發論文好還是出書好關注:68
復印報刊資料重要轉載來源期刊(...關注:51
英文期刊審稿常見的論文狀態及其...關注:69
copyright © www.56st48f.cn, All Rights Reserved
搜論文知識網 冀ICP備15021333號-3