版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院網(wǎng)絡(luò)與信息安全課程設(shè)計(jì)學(xué) 號(hào):專(zhuān) 業(yè):計(jì)算機(jī)科學(xué)與技術(shù)學(xué)生姓名: 任課教師:*2017年3月FTP服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)*計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,哈爾濱工程大學(xué)摘要:FTP 是File Transfer Protocol()的英文簡(jiǎn)稱(chēng),而中文簡(jiǎn)稱(chēng)為“文傳協(xié)議”。用于Internet上的的雙向傳輸。同時(shí),它也是一個(gè)(Application)。 基于不同的操作系統(tǒng)有不同的FTP應(yīng)用程序,而所有這些應(yīng)用程序都遵守同一種協(xié)議以傳輸文件。在FTP的使用當(dāng)中,用戶(hù)經(jīng)常遇到兩個(gè)概念:下載 (Download)和上傳(Upload)。下載文件就是從遠(yuǎn)程主機(jī)拷貝文件至自己的計(jì)算機(jī)上;上傳文件就是將
2、文件從自己的計(jì)算機(jī)中拷貝至 遠(yuǎn)程主機(jī)上。用Internet語(yǔ)言來(lái)說(shuō),用戶(hù)可通過(guò)客戶(hù)機(jī)程序向(從)遠(yuǎn)程主機(jī)上傳(下載)文件。本文基于FTP協(xié)議搭建了一個(gè)FTP服務(wù)器,實(shí)現(xiàn)簡(jiǎn)單的上傳下載功能。關(guān)鍵字:FTP,網(wǎng)絡(luò)協(xié)議,服務(wù)器FTP協(xié)議的工作原理1. 簡(jiǎn)介FTP是因特網(wǎng)網(wǎng)絡(luò)上歷史最悠久的網(wǎng)絡(luò)協(xié)議,憑借其獨(dú)特的優(yōu)勢(shì)一直都是因特網(wǎng)中最重要、最廣泛的服務(wù)之一。FTP是TCP/IP提供的標(biāo)準(zhǔn)機(jī)制,實(shí)現(xiàn)從一臺(tái)主機(jī)向另一臺(tái)主機(jī)傳送文件的任務(wù)。目前FTP客戶(hù)端軟件很多,大致我們可以把它們分為三類(lèi):第一類(lèi)是傳統(tǒng)的FTP客戶(hù)機(jī);第二類(lèi)是圖形化用戶(hù)界面的FTP軟件;第三類(lèi)是Web瀏覽器。從根本上說(shuō),F(xiàn)TP就是在網(wǎng)絡(luò)中各
3、種不同的計(jì)算機(jī)之間按照TCP/IP協(xié)議來(lái)傳輸文件。FTP采用的是現(xiàn)在流行的Client/Server模式,由FTP客戶(hù)端和FTP服務(wù)器端程序組成。通常服務(wù)器端是遠(yuǎn)程端點(diǎn),用戶(hù)可以通過(guò)Internet網(wǎng)絡(luò)連接到遠(yuǎn)程的FTP服務(wù)器站點(diǎn)。服務(wù)器的功能是主要的。只有當(dāng)FTP服務(wù)器支持各種協(xié)議和指令時(shí),才能夠開(kāi)發(fā)相應(yīng)的客戶(hù)端程序。開(kāi)發(fā)任何基于FTP的客戶(hù)端軟件都必須遵循FTP的工作原理,F(xiàn)TP的獨(dú)特的優(yōu)勢(shì)同時(shí)也是與其它客戶(hù)服務(wù)器程序最大的不同點(diǎn)就在于它在兩臺(tái)通信的主機(jī)之間使用了兩條TCP連接,一條是數(shù)據(jù)連接,用于數(shù)據(jù)傳送;另一條是控制連接,用于傳送控制信息(命令和響應(yīng)),這種將命令和數(shù)據(jù)分開(kāi)傳送的思想大
4、大提高了FTP的效率,而其它客戶(hù)服務(wù)器應(yīng)用程序一般只有一條TCP連接。圖1給出了FTP的基本模型??蛻?hù)有三個(gè)構(gòu)件:用戶(hù)接口、客戶(hù)控制進(jìn)程和客戶(hù)數(shù)據(jù)傳送進(jìn)程。服務(wù)器有兩個(gè)構(gòu)件:服務(wù)器控制進(jìn)程和服務(wù)器數(shù)據(jù)傳送進(jìn)程。在整個(gè)交互的FTP會(huì)話中,控制連接始終是處于連接狀態(tài)的,數(shù)據(jù)連接則在每一次文件傳送時(shí)先打開(kāi)后關(guān)閉。圖1 FTP的基本模型FTP是TCP/IP的一種具體應(yīng)用,它工作在OSI模型的第七層,TCP模型的第四層上,即應(yīng)用層,使用TCP傳輸而不是UDP,這樣FTP客戶(hù)在和服務(wù)器建立連接前就要經(jīng)過(guò)一個(gè)被廣為熟知的“三次握手”的過(guò)程,它帶來(lái)的意義在于客戶(hù)與服務(wù)器之間的連接是可靠的,而且是面向連接,為數(shù)
5、據(jù)的傳輸提供了可靠的保證。采用FTP協(xié)議可使 Internet用戶(hù)高效地從網(wǎng)上的FTP服務(wù)器下載大信息量的數(shù)據(jù)文件,將遠(yuǎn)程主機(jī)上的文件拷貝到自己的計(jì)算機(jī)上。以達(dá)到資源共享和傳遞信息的目的。由于FTP的使用使得Internet上出現(xiàn)大量為用戶(hù)提供的下載服務(wù)器。Internet成為了一個(gè)巨型的軟件倉(cāng)庫(kù)。FTP在文件傳輸中還支持?jǐn)帱c(diǎn)續(xù)傳功能,可以大幅度地減小CPU和網(wǎng)絡(luò)帶寬的開(kāi)銷(xiāo)。FTP需要2個(gè)端口,一個(gè)端口是控制連接端口,也即21端口,用于發(fā)送指令給服務(wù)器并等待服務(wù)器響應(yīng);另一個(gè)端口是數(shù)據(jù)傳輸端口,端口號(hào)為20(僅PORT模式),用于建立數(shù)據(jù)傳輸通道。FTP的連接模式有2種:PORT和PASV。P
6、ORT模式是一個(gè)主動(dòng)模式,PASV是被動(dòng)模式,二者都是相對(duì)于服務(wù)器而言的。2. FTP運(yùn)行原理FTP的工作原理與其他許多網(wǎng)絡(luò)實(shí)用程序一樣,也是基于客戶(hù)/服務(wù)器模式?;ヂ?lián)網(wǎng)文件傳輸協(xié)議(File Transfer Protocol) 標(biāo)準(zhǔn)是在FTC959說(shuō)明的。該協(xié)議定義了一個(gè)在遠(yuǎn)程計(jì)算機(jī)系統(tǒng)和本地計(jì)算機(jī)系統(tǒng)之間傳輸文件的標(biāo)準(zhǔn)。一般來(lái)說(shuō),要傳輸文件的用戶(hù)需先經(jīng)過(guò)認(rèn)證以后才能登錄ftp服務(wù)器,訪問(wèn)在遠(yuǎn)程服務(wù)器的文件。大多數(shù)的FTP服務(wù)器往往提供一個(gè)guest的公共帳戶(hù)來(lái)允許沒(méi)有FTP服務(wù)器帳戶(hù)的用戶(hù)可以訪問(wèn)該FTP服務(wù)器。一個(gè)FTP會(huì)話通常包括五個(gè)軟件元素的交互。就模型而言,從1973年以來(lái)并沒(méi)有
7、什么變化。如圖2所示。圖2 FTP協(xié)議模型在一個(gè)FTP會(huì)話中,會(huì)存在兩個(gè)獨(dú)立的網(wǎng)絡(luò)連接,一個(gè)是由兩端的PI使用的,另一個(gè)是由兩端的DTP使用的。PI之間的連接一般被稱(chēng)作控制連接(control connection),DTP之間的連接被稱(chēng)作數(shù)據(jù)連接(data connection)。通常情況下,ftp服務(wù)器監(jiān)聽(tīng)端口號(hào)21來(lái)等待控制連接建立請(qǐng)求,當(dāng)客戶(hù)連接請(qǐng)求到達(dá),會(huì)在客戶(hù)和ftp服務(wù)器之間建立一個(gè)控制連接。而數(shù)據(jù)連接端口號(hào)的選擇依賴(lài)于控制連接上的命令,通常是客戶(hù)發(fā)送一個(gè)控制消息來(lái)指定客戶(hù)需要建立一個(gè)數(shù)據(jù)連接來(lái)傳輸ftp數(shù)據(jù)(如下載/上載一個(gè)文件,顯示當(dāng)前目錄的內(nèi)容等等,都需要建立數(shù)據(jù)連接來(lái)傳輸
8、數(shù)據(jù)),在該消息中,指定了客戶(hù)監(jiān)聽(tīng)并等待連接的端口號(hào),而服務(wù)器從控制連接收到該命令,向客戶(hù)端發(fā)起一個(gè)連接請(qǐng)求到消息中指定的端口號(hào),客戶(hù)端收到該請(qǐng)求以后就會(huì)建立一個(gè)數(shù)據(jù)連接。連接建立以后,服務(wù)器或客戶(hù)就會(huì)主動(dòng)通過(guò)該連接發(fā)送數(shù)據(jù)(可能是要傳輸?shù)奈募部赡苁怯脩?hù)在命令行上發(fā)出的IS命令的輸出)。 系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)1 功能要求本系統(tǒng)是一個(gè)在局域網(wǎng)內(nèi)實(shí)現(xiàn)的小型FTP文件傳輸服務(wù)器。主要實(shí)現(xiàn)的是FTP服務(wù)器端功能,包括:FTP服務(wù)日志,在線用戶(hù)的管理,統(tǒng)計(jì)客戶(hù)端信息還有客戶(hù)端上傳、下載、選擇數(shù)據(jù)傳輸模式、改變目錄等,并給出相應(yīng)的提示。2 主界面程序界面主要包括服務(wù)器日志、在線用戶(hù)、統(tǒng)計(jì)信息、安全管理、菜單
9、欄、工具欄、狀態(tài)欄。如圖5所示。圖5 服務(wù)器用戶(hù)界面3 主要功能與實(shí)現(xiàn)用CSocket類(lèi)編制的服務(wù)器端的程序,其過(guò)程如下,其過(guò)程主要是:創(chuàng)建CSocket對(duì)象。創(chuàng)建底層套接字Socket。調(diào)用Listen,開(kāi)始監(jiān)聽(tīng)從客戶(hù)端發(fā)來(lái)的訪問(wèn)請(qǐng)求。如果收到請(qǐng)求,調(diào)用CAsyncSocket:Accept( )函數(shù)進(jìn)行接收外理。建立CSocketFile對(duì)象,并且使該對(duì)象與CSocket對(duì)象具備一定的聯(lián)系。建立Carchive對(duì)象,以便實(shí)現(xiàn)卸裝(接收)數(shù)據(jù)和存儲(chǔ)(發(fā)送)數(shù)據(jù)的目的地址。當(dāng)然,該Carchive對(duì)象應(yīng)該與前面的CSocketFile對(duì)象建立聯(lián)系。使用Carchive對(duì)象在客戶(hù)和服務(wù)器Sock
10、et之間傳遞數(shù)據(jù),從而實(shí)現(xiàn)服務(wù)器Socket和客戶(hù)機(jī)Socket之間的通信。值得注意的是,一個(gè)給定的Carchive對(duì)象只能在單一的方向上傳遞數(shù)據(jù):或者接收,或者發(fā)送。一般情況下,可能需要兩個(gè)Carchive對(duì)象來(lái)實(shí)現(xiàn)數(shù)據(jù)的雙向傳遞。3.1菜單欄功能模塊菜單攔包括:服務(wù)器,查看。服務(wù)器菜單包括:開(kāi)始,停止,用戶(hù)賬戶(hù)向?qū)?,用?hù)賬戶(hù)等功能。查看菜單包括:服務(wù)器日志,在線用戶(hù),配置,統(tǒng)計(jì),安全等功能。各項(xiàng)功能實(shí)現(xiàn)如下:服務(wù)器功能:(1) 帳戶(hù)向?qū)В寒?dāng)你 登錄服務(wù)器時(shí)你需要一個(gè)有效的賬戶(hù),用戶(hù)帳戶(hù)向?qū)⒁龑?dǎo)您通過(guò)必要的步驟,創(chuàng)造一個(gè)新的用戶(hù)帳戶(hù)。并將其添加到用戶(hù)帳戶(hù)對(duì)話框,創(chuàng)建用戶(hù)名,如圖6所示。圖6
11、 用戶(hù)帳戶(hù)向?qū)Т翱谕ㄟ^(guò)這個(gè)窗口你可以創(chuàng)建自己的用戶(hù)名以及密碼用以登陸FTP服務(wù)器,該部分功能實(shí)現(xiàn)代碼如下:(2) 用戶(hù)帳戶(hù)功能:這一功能主要是服務(wù)器端添加,修改和刪除用戶(hù)帳戶(hù),設(shè)置目錄權(quán)限(使用添加按鈕以添加一個(gè)新目錄,其中選定的用戶(hù)帳戶(hù)已具有訪問(wèn)權(quán)限,每小組目錄您可以設(shè)定不同的權(quán)限,例如你可以給所有權(quán)限到C:下載,但限制的權(quán)限為C :下載申請(qǐng)時(shí),沒(méi)有權(quán)限指定的目錄,在這個(gè)目錄中它會(huì)自動(dòng)阻止用戶(hù)要求上傳任何子目錄)。目錄屬性,當(dāng)您添加的編輯目錄的用戶(hù)帳戶(hù),目錄屬性對(duì)話框?qū)@示物理目錄(物理目錄是真正的路徑文件夾的名稱(chēng))。虛擬目錄(虛擬目錄是一個(gè)物理文件夾的別名,當(dāng)用戶(hù)連接到您的FTP服務(wù)器,它
12、將看到這個(gè)目錄名而不是真正的物理名稱(chēng))。設(shè)制服務(wù)端允許客戶(hù)端的權(quán)限,例如允許客戶(hù)端可以下載,上傳,重命名哪些服務(wù)器端的文件內(nèi)容。例如用戶(hù)123將: E:盤(pán)設(shè)為許可目錄,客戶(hù)端就可以隨時(shí)下載,上傳E:盤(pán)里面的內(nèi)容,如圖7所示。圖7 用戶(hù)帳戶(hù)窗口3.2 查看功能模塊(1) 服務(wù)器日志模塊的功能:在此屏幕,記錄客戶(hù)端與服務(wù)器端的連接信息以及傳輸信息,當(dāng)客戶(hù)端登陸服務(wù)器時(shí)服務(wù)器日志會(huì)顯示是否與服務(wù)器連接成功,當(dāng)客戶(hù)端要上傳文件或是下載文件成功時(shí)會(huì)記錄服務(wù)器和FTP客戶(hù)端的詳細(xì)資料,從而有助于您追蹤服務(wù)器與客戶(hù)端之間所有的通訊訊息,數(shù)目之間的方括號(hào) 是線程ID,如圖8所示。圖8 服務(wù)器日志窗口(2) 在
13、線用戶(hù)模塊的功能:通過(guò)服務(wù)器來(lái)查看在線客戶(hù)端的用戶(hù)名,用戶(hù)IP地址,用戶(hù)登陸時(shí)間等信息,如圖9所示。圖9 在線用戶(hù)窗口(3) 配置模塊的功能:配置FTP服務(wù)器所有的設(shè)置。默認(rèn)服務(wù)器端口為21,可以同時(shí)連接最多用戶(hù)數(shù),客戶(hù)端與服務(wù)器端連接時(shí)間(當(dāng)客戶(hù)端已閑置的具體時(shí)間,它會(huì)自動(dòng)斷開(kāi)),歡迎信息(當(dāng)客戶(hù)端連接到服務(wù)器時(shí)將會(huì)顯示該文本),再見(jiàn)訊息(文本將顯示當(dāng)一個(gè)客戶(hù)端從服務(wù)器斷開(kāi)時(shí))其他設(shè)置,F(xiàn)TP服務(wù)器在Windows下啟動(dòng),啟動(dòng)最小化在系統(tǒng)盤(pán) ,并在啟動(dòng)時(shí)自動(dòng)激活服務(wù)器。用戶(hù)還可以將用戶(hù)各種信息都記錄在服務(wù)器日志里,如圖10所示。 圖10 配置界面實(shí)驗(yàn)結(jié)論本次實(shí)驗(yàn)實(shí)現(xiàn)了一個(gè)基于FTP協(xié)議的服務(wù)
14、器系統(tǒng),基本完成了FTP服務(wù)器所需的大多數(shù)功能。用戶(hù)能夠選擇相應(yīng)的數(shù)據(jù)傳輸模式,對(duì)指定的文件進(jìn)行上傳下載。通過(guò)該程序的開(kāi)發(fā),涵蓋了一個(gè)FTP服務(wù)器所應(yīng)該具有的功能,能夠解釋一般的FTP命令,符合相應(yīng)的規(guī)范。參考文獻(xiàn)1蔡勇. FTP服務(wù)器技術(shù)研究及實(shí)現(xiàn)D.電子科技大學(xué),2005.2王占軍,王偉,趙志剛. 基于FTP協(xié)議的文件傳輸組件設(shè)計(jì)與實(shí)現(xiàn)J. 沈陽(yáng)師范大學(xué)學(xué)報(bào)(自然科學(xué)版),2012,03:375-377.3吳珂,盧秉亮,張磊. 基于FTP協(xié)議客戶(hù)端軟件的實(shí)現(xiàn)J. 沈陽(yáng)航空工業(yè)學(xué)院學(xué)報(bào),2006,04:39-42.源代碼/ stdafx.cpp : source file that incl
15、udes just the standard includes/FTPServer.pch will be the pre-compiled header/stdafx.obj will contain the pre-compiled type information#include stdafx.hCString BrowseForFolder(HWND hWnd, LPCSTR lpszTitle, UINT nFlags)/ Were going to use the shell to display a / Choose Directory dialog box for the us
16、er.CString strResult = ; LPMALLOC lpMalloc;if (:SHGetMalloc(&lpMalloc) != NOERROR)/ failed to get allocator return strResult; char szBuffer_MAX_PATH;char szDisplayName_MAX_PATH;BROWSEINFO browseInfo;browseInfo.hwndOwner = hWnd;/ set root at DesktopbrowseInfo.pidlRoot = NULL; browseInfo.pszDisplayNam
17、e = szDisplayName;browseInfo.lpszTitle = lpszTitle;browseInfo.ulFlags = nFlags;browseInfo.lpfn = NULL;browseInfo.lParam = 0;LPITEMIDLIST lpItemIDList;if (lpItemIDList = :SHBrowseForFolder(&browseInfo) != NULL)/ Get the path of the selected folder from the item ID list.if (:SHGetPathFromIDList(lpItem
18、IDList, szBuffer)/ At this point, szBuffer contains the path the user chose.if (szBuffer0 = 0)/ SHGetPathFromIDList failed, or SHBrowseForFolder failed.AfxMessageBox(Failed to get directory, MB_ICONSTOP|MB_OK);return strResult; / We have a path in szBuffer!strResult = szBuffer;return strResult;else/
19、 The thing referred to by lpItemIDList / might not have been a file system object./ For whatever reason, SHGetPathFromIDList didnt work!AfxMessageBox(Failed to get directory, MB_ICONSTOP|MB_OK);return strResult; / strResult is empty lpMalloc-Free(lpItemIDList);lpMalloc-Release(); return strResult;vo
20、id DoEvents()MSG msg;/ window message while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE) TranslateMessage(&msg); DispatchMessage(&msg); void GetAppDir(CString& strAppDir)TCHAR szFullPathMAX_PATH;TCHAR szDir_MAX_DIR;TCHAR szDrive_MAX_DRIVE;/ Get applications full path.:GetModuleFileName(NULL, szFullPa
21、th, MAX_PATH);/ Break full path into seperate components._splitpath(szFullPath, szDrive, szDir, NULL, NULL);/ Store applications drive and pathstrAppDir.Format(_T(%s%s), szDrive, szDir);PFNSHGETFOLDERPATHA GetFuncPtr_SHGetFolderPathA()static HMODULE hMod = NULL;PFNSHGETFOLDERPATHA pSHGetFolderPath =
22、 NULL;/ Load SHFolder.dll only onceif (!hMod)hMod = LoadLibrary(SHFolder.dll);/ Obtain a pointer to the SHGetFolderPathA functionif (hMod)pSHGetFolderPath = (PFNSHGETFOLDERPATHA)GetProcAddress(hMod, SHGetFolderPathA);return pSHGetFolderPath; HRESULT CreateStartMenuShortcut(LPSTR lpszShortcutFile, LP
23、STR lpszDescription, LPTSTR lpszRelativeFolder)HRESULT hr;PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;TCHAR lpszLinkMAX_PATH;BOOL bFound = FALSE;pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();/ Find the current users Start Menu Programs folderif (pSHGetFolderPath)bFound = SUCCEEDED(pSHGetFolderPat
24、h(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink);if (bFound)/ Proceed to create the shortcutIShellLink *pIShellLink = NULL;IPersistFile *ppf = NULL;WCHAR pLinkUnicodeMAX_PATH;CoInitialize(NULL);/ Get a pointer to the IShellLink interface.hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, I
25、ID_IShellLink, (void *)&pIShellLink);if (SUCCEEDED(hr)/ Get a pointer to IPersistFile interface for saving shortcuthr = pIShellLink-QueryInterface(IID_IPersistFile, (void *)&ppf);if (SUCCEEDED(hr) hr = pIShellLink-SetPath(lpszShortcutFile); hr = pIShellLink-SetDescription(lpszDescription);if (SUCCEE
26、DED(hr)/ Add the target folder to the Start Menu Programs pathlstrcat(lpszLink, );lstrcat(lpszLink, lpszRelativeFolder);lstrcat(lpszLink, );/ Create the directory if it does not existCreateDirectory(lpszLink,NULL);/ Add the file name for the shortcutlstrcat(lpszLink, lpszDescription);lstrcat(lpszLin
27、k, .lnk);/ Convert string to Unicode, and call IPersistFile:Save()MultiByteToWideChar(CP_ACP, 0, lpszLink, -1, pLinkUnicode, MAX_PATH);hr = ppf-Save(pLinkUnicode, TRUE);ppf-Release();pIShellLink-Release();CoUninitialize();return hr; void RemoveStartMenuShortcut(LPSTR lpszDescription, LPTSTR lpszRela
28、tiveFolder)PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL;TCHAR lpszLinkMAX_PATH;BOOL bFound = FALSE;pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA();/ Find the current users Start Menu Programs folderif (pSHGetFolderPath)bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink);if (
29、bFound)/ Add the target folder to the Start Menu Programs pathlstrcat(lpszLink, );lstrcat(lpszLink, lpszRelativeFolder);lstrcat(lpszLink, );/ Add the file name for the shortcutlstrcat(lpszLink, lpszDescription);lstrcat(lpszLink, .lnk);DeleteFile(lpszLink); CString GetShortcutTarget(LPCTSTR lpszFilen
30、ame)CoInitialize(0);CString strResult;HRESULT hResult;IShellLink *psl;char szPathMAX_PATH;WIN32_FIND_DATA findData;/ Get a pointer to the IShellLink interface.hResult = CoCreateInstance (CLSID_ShellLink, NULL,CLSCTX_INPROC_SERVER, IID_IShellLink, (void *)&psl);if (SUCCEEDED(hResult)IPersistFile *ppf
31、;/ Get a pointer to the IPersistFile interface.hResult = psl-QueryInterface (IID_IPersistFile, (void *)&ppf);if (SUCCEEDED(hResult)WORD wsz MAX_PATH; / buffer for Unicode string/ Ensure that the string consists of Unicode characters.MultiByteToWideChar (CP_ACP, 0, lpszFilename, -1, wsz, MAX_PATH);/
32、Load the shortcut.hResult = ppf-Load (wsz, STGM_READ);if (SUCCEEDED (hResult)/ Resolve the shortcut.hResult = psl-Resolve (0, SLR_ANY_MATCH|SLR_NO_UI);if (SUCCEEDED (hResult)lstrcpy (szPath, lpszFilename);/ Get the path to the shortcut target.hResult = psl-GetPath(szPath, MAX_PATH, (WIN32_FIND_DATA *)&findData, 0); strResult = szPath;/ Release the pointer to IPersistFile.ppf-Release ();/ Release the pointer to IShellLink.psl-Release ();CoUninitialize();if (SUCCEEDED(
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年折疊筷子:課堂演示與環(huán)保的完美結(jié)合
- 2023年9月15日中級(jí)注冊(cè)安全工程師-安全生產(chǎn)法律法規(guī)真題
- 人教部編版《道德與法治》二年級(jí)上冊(cè)第3課《歡歡喜喜慶國(guó)慶》精美課件(第2課時(shí))
- 智能衛(wèi)浴用品制造業(yè)的賬務(wù)處理-記賬實(shí)操
- 老舊小區(qū)安裝電梯后費(fèi)用分擔(dān)協(xié)議-物業(yè)管理
- 2024版《工程制圖》教案:探索與創(chuàng)新
- 2024年《教育學(xué)原理》課件在高等教育中的作用
- 2024年HAZOP培訓(xùn)課件:深入解析
- 2024年《燃燒與滅火》教案設(shè)計(jì):教育與科技的結(jié)合
- 5種“謝謝你”的表達(dá)方法
- 企業(yè)財(cái)務(wù)管理課件:如何正確認(rèn)識(shí)企業(yè)財(cái)務(wù)管理
- 2024年哈爾濱鐵道職業(yè)技術(shù)學(xué)院高職單招(英語(yǔ)/數(shù)學(xué)/語(yǔ)文)筆試歷年參考題庫(kù)含答案解析
- 養(yǎng)老事業(yè)與養(yǎng)老產(chǎn)業(yè)的比較研究以日本養(yǎng)老事業(yè)與養(yǎng)老產(chǎn)業(yè)為例
- 下肢動(dòng)脈閉塞癥的護(hù)理
- 微觀經(jīng)濟(jì)學(xué)(第三版)課程標(biāo)準(zhǔn)
- 單位職工酒駕檢討書(shū)范文
- 心臟驟停與猝死
- 《功能材料概論》課件
- 工程師職稱(chēng)代評(píng)銷(xiāo)售話術(shù)
- 私立民辦初中學(xué)校項(xiàng)目融資計(jì)劃書(shū)
- 膿毒性休克病人護(hù)理查房課件
評(píng)論
0/150
提交評(píng)論