freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

模擬實(shí)驗(yàn)測(cè)試平臺(tái)的設(shè)計(jì)與開(kāi)發(fā)—免費(fèi)畢業(yè)設(shè)計(jì)論文(編輯修改稿)

2025-01-06 17:36 本頁(yè)面
 

【文章內(nèi)容簡(jiǎn)介】 只要遵循約定的 DLL 接口規(guī)范和調(diào)用方式,用各種語(yǔ)言編寫(xiě)的 DLL 都可以相互調(diào)用。譬如 Windows 提供的系統(tǒng) DLL(其中包括了 Windows 的 API),在任何開(kāi)發(fā)環(huán)境中都能被調(diào)用,不在乎其是 Visual Basic、 Visual C++還是 Delphi。 動(dòng)態(tài)鏈接庫(kù)隨處可見(jiàn) 在 Windows 目錄下的 system32 文件夾中會(huì)看到 、 和, windows 的大多數(shù) API 都包含在這些 DLL 中。 中的函數(shù)主要處理內(nèi)存管理和進(jìn)程調(diào)度; 中的函數(shù)主要控制用戶(hù)界面; 中的函數(shù)則負(fù)責(zé)圖形方面的操作。一般的程序員都用過(guò)類(lèi)似 MessageBox的函數(shù),其實(shí)它就包含在 這個(gè)動(dòng)態(tài)鏈接庫(kù)中。由此可見(jiàn) DLL 其實(shí)并不陌生。 第 頁(yè) 共 51 頁(yè) 7 項(xiàng) 目要求 指定 DLL 庫(kù)的加載 目前流行將函數(shù)封裝為 DLL 函數(shù)庫(kù),便于更新及管理。目前所 要完成的測(cè)試平臺(tái) 也要求 能夠加載已經(jīng)編寫(xiě)好的各個(gè)器件類(lèi) DLL, 以便對(duì)其進(jìn)行測(cè)試,檢驗(yàn)其功能是否正常。 所以需要能夠?qū)?指定的 DLL 庫(kù)進(jìn)行加載。 DLL 庫(kù)內(nèi)函數(shù)的調(diào)用 既然涉及到 DLL 庫(kù),那么自然需要對(duì)其中的函數(shù)進(jìn)行調(diào)用,本課題要求 能夠不對(duì) DLL 庫(kù)中的 函數(shù)進(jìn)行定義而直接對(duì)其調(diào)用。 讀取器件信息 平臺(tái)要求能夠讀取器件的管腳、編號(hào)等等信息,以便畫(huà)出器件示意圖。 施加高低電平信號(hào) 在以前同學(xué)完成的項(xiàng)目中已經(jīng)提供了施加信號(hào)的函 數(shù), 該函數(shù)封裝在各器件類(lèi)的 DLL 庫(kù)中,只需要對(duì)其 進(jìn)行調(diào)用即可 完成信號(hào)的施加 ,不過(guò)本課題還需要信號(hào)的連續(xù)施加 功能 。 信號(hào)的連續(xù)施加 很多時(shí)候只是提供單一的信號(hào)并不能滿(mǎn)足器件的需求,手動(dòng)輸入信號(hào)過(guò)與緩慢不便于觀(guān)察,器件大多 數(shù)時(shí)候需要一串連續(xù)的信號(hào)輸入以便觀(guān)察器件的輸出。所以本程序需要 信號(hào)的連續(xù)輸入功能。以保證測(cè)試需要。 項(xiàng)目難點(diǎn)及解決方法 DLL 庫(kù)的加載 由于 DLL 是一個(gè)比較新的技術(shù),對(duì)于 DLL 的接觸也比較少,所以在理解和使用上也相對(duì)比較困難。通過(guò)查閱資料大致了解了 DLL 的概念, 對(duì) DLL 庫(kù)的裝載 也有了一定 的基礎(chǔ)了解。 在這里 裝載 DLL 庫(kù) 使用了一個(gè) API 中的函數(shù):HMODULE hMod = LoadLibrary()。用它 可以 對(duì)指定的 DLL 庫(kù)進(jìn)行加載,所以該函數(shù)要求提供具體的需要裝載的 DLL 庫(kù)的名稱(chēng)。使用該函數(shù)后 hMod 則等價(jià)與指定裝載的 DLL 庫(kù)。 DLL 庫(kù)內(nèi)的函數(shù)調(diào)用 在完成 DLL 庫(kù)加載后, 接下來(lái)就需要調(diào)用庫(kù)中的函數(shù),調(diào)用 DLL 庫(kù)中的函 第 頁(yè) 共 51 頁(yè) 8 數(shù)與一般的函數(shù)調(diào)用有很大差異,一般來(lái)說(shuō)函數(shù)的調(diào)用需要先對(duì)該函數(shù)進(jìn)行聲明然后才可以對(duì)它進(jìn)行調(diào)用,否則系統(tǒng)將無(wú)法識(shí)別該函數(shù)。但對(duì) DLL 中的函數(shù)調(diào)用不是通過(guò)聲明的方式來(lái)完成,多數(shù) 情況下它使用了一個(gè) DLL 庫(kù)中的導(dǎo)出函數(shù),pComp = pfnEF((LPVOID )pDoc)該函數(shù)的作用是生成一個(gè)庫(kù)中類(lèi)的對(duì)象,再將該對(duì)象的地址返回給一個(gè)該類(lèi)的指針,然后就可以通過(guò)這指針來(lái)調(diào)用庫(kù)中的函數(shù),它的好處是不用再在程序中給出函數(shù)的實(shí)現(xiàn)以及聲明就可以直接地函數(shù)進(jìn)行調(diào)用。 4 設(shè)計(jì)實(shí)現(xiàn) 指定 DLL 庫(kù)加載的實(shí)現(xiàn) 實(shí)現(xiàn) 對(duì) DLL 函數(shù) 庫(kù)的 加載 的 具體 方法 是用 HMODULE hMod = LoadLibrary(m_LibName+)。函數(shù) 對(duì)指定的 DLL 庫(kù)進(jìn)行加載。該函數(shù)括號(hào)中的 m_LibName+是需要加載的 DLL 庫(kù)的名稱(chēng)。 DLL庫(kù)內(nèi)函數(shù)調(diào)用的實(shí)現(xiàn) 在完成對(duì)指定的器件 DLL 庫(kù)的加載后,再用該 DLL 中的 pComp = pfnEF((LPVOID )pDoc)導(dǎo)出函數(shù) 返回了一個(gè)基類(lèi)指針值 pComp,由于在基類(lèi)中各函數(shù)被設(shè)置為了虛函數(shù),這樣就可以在測(cè)試平臺(tái)中不對(duì)需要調(diào)用的器件 DLL中的函數(shù)進(jìn)行聲明,而直接以這個(gè)指針來(lái)調(diào)用基類(lèi)的派生類(lèi)(也就是各種器件類(lèi))封裝的 DLL 中的函數(shù),于是實(shí)現(xiàn)了 DLL 庫(kù)內(nèi)函數(shù)的調(diào)用。 讀取器件信息的實(shí)現(xiàn) 首先在這先介紹一下器件信息的儲(chǔ)存方式,對(duì)于器件的信息 是采用 TXT 文檔的方式保存的,先將器件的信息按照特定的格式編寫(xiě)再將它儲(chǔ)存在 TXT 文檔中,這樣一來(lái)當(dāng)系統(tǒng)需要器件信息的時(shí)候只需要對(duì)該 TXT 文檔進(jìn)行讀操作,再做一定的處理就可以了。 這就是器件信息的保存思路。所以要實(shí)現(xiàn)該功能就需要對(duì)指定的文檔進(jìn)行讀取,于是在這設(shè)計(jì)了一個(gè)文檔內(nèi)容的讀取函數(shù) ReadInfo(fp, pDoc), 這函數(shù) 可以將指定的 .TXT 文本文檔中的器件信息進(jìn)行讀取, 該函數(shù)的使用需要先給定 fp 一個(gè)地址值,這由函數(shù) fp = fopen(m_CompMsg,rt)來(lái)完成,其中的參數(shù) m_CompMsg是 一個(gè)字符串它就是需要加載的器件的 TXT 文檔的名字。這樣就可以對(duì)一個(gè)指定的器件的信息進(jìn)行讀取。 第 頁(yè) 共 51 頁(yè) 9 施加單一信號(hào)的實(shí)現(xiàn) 以下是完成施加單一信號(hào)的核心函數(shù) pCompOutSig(m_Pin,m_SigVal),該函數(shù)中 m_pin 參數(shù)是管腳的編號(hào), m_SigVal 是施加的信號(hào),兩個(gè)參數(shù)的具體值需要測(cè)試人員手動(dòng)提供。 信號(hào)的連續(xù)施加的實(shí)現(xiàn) 實(shí)現(xiàn)連續(xù)信號(hào)輸入的思路和器件讀取的思路錯(cuò)別不大,都是先信號(hào)流以特定的格式保存在一個(gè) TXT 文檔中,再對(duì)該文檔進(jìn)行讀取,在 TXT 文檔中一行保存一個(gè)管腳編號(hào)以及它所對(duì)應(yīng)的信號(hào)值,每次 TXT 文檔讀完一行便調(diào)用一次pCompOutSig(m_Pin,m_SigVal)函數(shù)進(jìn)行一次設(shè)置,所以在這使用 了一個(gè)定時(shí)器 SetTimer(100,500,NULL)函數(shù),在定時(shí)器內(nèi)打開(kāi)了一個(gè) TXT 文檔,在這文檔中提取出了 2 個(gè)整形參數(shù)(管腳編號(hào)與信號(hào)值)再將它賦給相對(duì)應(yīng)的管腳后,再讀取下一行。 在讀完 整個(gè) 文檔后 結(jié)束 。 5 實(shí)現(xiàn)代碼及其效果介紹 程序效果介紹 該 平臺(tái) 它能夠 對(duì)各同學(xué) 編寫(xiě) 完成的 虛擬 器件進(jìn)行測(cè)試,首先要做的是將 編寫(xiě)好 的器件封裝成的 DLL 庫(kù)以及存放器件信息的 TXT 文件的名字告訴平臺(tái),然后平臺(tái)就可以對(duì) 其 進(jìn)行裝載,并且將器件顯示在器件圖中,之后就可以開(kāi)始對(duì)器件進(jìn)行簡(jiǎn)單的測(cè)試。 主要函數(shù)介紹 對(duì) DLL庫(kù)進(jìn)行裝載 下面一段 代碼實(shí)現(xiàn)了對(duì) DLL 函數(shù)庫(kù)的加載以及對(duì) DLL 庫(kù)里的函數(shù)調(diào)用,具體方法是用 HMODULE hMod = LoadLibrary(m_LibName+)。對(duì)指定的DLL 庫(kù)進(jìn)行了加載,然后再以 pComp = pfnEF((LPVOID )pDoc)導(dǎo)出函數(shù) 返回了一個(gè)指針值,然后就可以以這個(gè)指針來(lái)調(diào)用其中的函數(shù)。 void CTestComponentDlg::OnBtnLoad() { // TODO: Add your control notification handler code here UpdateData(TRUE)。 第 頁(yè) 共 51 頁(yè) 10 HMODULE hMod = LoadLibrary(m_LibName+)。 typedef DComponent* (*PExportedFn)(LPVOID )。 PExported FnpfnEF=(PExportedFn)GetProcAddress(hMod,Create+m_LibName)。 pComp = pfnEF((LPVOID )pDoc)。 // int ver = pCompGetVersion()。 UpdateData(FALSE)。 } 讀取器件信息 下面 這段代碼可以將指定的 .TXT 文本文檔中的器件信息進(jìn)行讀取,其中包括器件位置(畫(huà)圖時(shí)開(kāi)始的位置)、管腳信息等相關(guān)信息。 它首先是打開(kāi)了一個(gè)文檔,該文檔的開(kāi)始地址給了 FP 這個(gè)指針然后用自己編寫(xiě)的一個(gè)函數(shù) pCompReadInfo(fp,pDoc)對(duì)該文檔的內(nèi)容進(jìn)行了讀取 。 void CTestComponentDlg::OnBtnReadinfo() { // TODO: Add your control notification handler code here FILE *fp 。 UpdateData(TRUE)。 fp = fopen(m_CompMsg,rt)。 pCompReadInfo(fp,pDoc)。 fclose(fp)。 UpdateData(FALSE)。 } 顯示器件 這段代碼完成的是畫(huà)出器件圖的功能,它根據(jù)讀取器件代碼所讀取到的信息來(lái)完成器件圖 的顯示 。 void CTestComponentDlg::OnBtnDisp() { // TODO: Add your control notification handler code here CDC *pdc = ()。 第 頁(yè) 共 51 頁(yè) 11 // int ver = pCompGetVersion()。 // char *pName = pCompGetMyName() 。 pCompDrawObject(pdc)。 (pdc)。 } 對(duì)單一管腳施加信號(hào) 這是對(duì)單一管腳的信號(hào)施加代碼段 m_Pin 是管腳編號(hào), SigVal 是信號(hào)值。 void CTestComponentDlg::OnBtnaddsig() { // TODO: Add your control notification handler code here UpdateData(TRUE)。 pCompOutSig(m_Pin,m_SigVal)。 //m_Pin 是管腳編 SigVal 是信號(hào) UpdateData(FALSE)。 } 連續(xù)信號(hào)施加 在 這 里 由 于 要 施 加 連 續(xù) 信 號(hào) , 所 以 使 用 了 一 個(gè) 定 時(shí) 器SetTimer(100,500,NULL)函數(shù),在定時(shí)器內(nèi)打開(kāi)了一個(gè) TXT 文檔,在這文檔中提取出了 2 個(gè)整形參數(shù)(管腳編號(hào)與信號(hào)值)再將它賦給 相對(duì)應(yīng)的管腳。在讀完文檔后釋放了 fp 指針。 void CTestComponentDlg::OnButton1() { // TODO: Add your control notification handler code here SetTimer(100,500,NULL)。 fp = fopen(,r)。 } void CTestComponentDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default char buf[250]。 第 頁(yè) 共 51 頁(yè) 12 if(fp != NULL) { int pin,s。 fgets(buf,250,fp)。 sscanf(buf,%d,%d,amp。pin,amp。s)。 pCompOutSig(pin,s)。 // (buf)。 if(feof(fp)) { fclose(fp)。 fp = NULL 。 } } CDialog::OnTimer(nIDEvent)。 } 鼠標(biāo)操作 這是一段操作鼠標(biāo)的代碼,它留出了很多接口函數(shù)由編寫(xiě)器件時(shí)程序員自己對(duì)它進(jìn)行實(shí)現(xiàn)。當(dāng)在器件編碼中完成對(duì)這些接口的實(shí)現(xiàn)后,在本程序中就可以在顯示出的器件圖上通過(guò)鼠標(biāo)點(diǎn)擊來(lái)觸發(fā)一些事件,比如開(kāi)關(guān)開(kāi)啟等。 本程序在測(cè)試 8255 器件時(shí)并沒(méi)有使用到該功能。 include class CVisualexDoc。 class DComponent { public: CLine *Pin。 //保存引腳信息 char **pPinName。 int iPinNum 。 CString sComName 。 CPoint Position。 //位置信息 int cx。 int cy。 //器件的大小 第 頁(yè) 共 51 頁(yè) 13 protected: CVisualexDoc *pParent 。 public: DComponent(CVisualexDoc *p,int )。 virtual ~DComponent()。 virtual int OutSig(int iPinNo,int iSigVal)=0。 virtual char * GetMyName() {return null。}。 virtual int GetVersion(){return 1。}。 virtual int DrawObject(CDC* pDC)。//{return 1。}。 virtual int ReadInfo(FILE* file,CVisualexDo
點(diǎn)擊復(fù)制文檔內(nèi)容
公司管理相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖片鄂ICP備17016276號(hào)-1