線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1713
推到 Plurk!
推到 Facebook!

用Delphi在局域網中實現網上影院

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-28 05:11:35 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 用Delphi在局域網中實現網上影院 相信用過“超級解霸”的人都知道裏面有個“接收網路DVB廣播”,可以在局部網中實現一台電腦播放視頻文件而另一台接收。因?DVB涉及的知識面太廣,下面我們用另外一個巧妙的思路來實現局部網中的“網路播放”。 因?涉及到多媒體文件的播放,所以我們在程式中使用了一個Mediaplay控制項,但是很多使用過這個控制項做播放器的人都遇到過這樣一個問題:就是在播放MPG等副檔名的文件時出現“MCI初始化錯誤”,如果安裝了WindvdPlayer後又沒有問題了,怎?回事呢?現在市面上所有的有關DELPHI多媒體編程的書都沒有講到這個問題和如何解決。原來,我們要自己修改win.ini裏面[mciextensions]小節,另外還要修改一下system.ini裏面的[mci]小節。舉例說,你想讓Mediaplay可以播放MPG?副檔名的文件時,可以按照如下格式修改: [mciextensions] mpeg=MPEGVideo mpg=MPEGVideo …… 在這裏,我們寫了個自定義函數WriteMciConfig來達到這一目的,詳細代碼請看根源程式。 解霸的左右聲道設置好像也沒有什?書籍介紹如何實現,實際上我們可以調用底層API函數mciSendString,不過好像只對Wav,Mid等音頻文件有效。比如說左聲道設置: mciSendString('setallaudioalloff',nil,0,Handle); mciSendString('setallaudiolefton',nil,0,Handle); 先把所有聲道關閉,然後打開左聲道。如果你設計過防火牆,會發現有些防火牆也是這樣的:先關上所有埠,然後打開常用的埠。注意:因?這裏調用了多媒體方面的API,所以程式必須加上MMsystem這個單元,否則將無法編譯。 還有一個難點就是如何實現全螢幕播放。可能讀者會說:先把Form的BorderStyle動態設置?BsNone,再把Form的WindowState:=wsMaximized不就行了嗎?呵呵,是嗎?你試試看。結果播放螢幕的視頻不見了。只看到一個光禿禿的面板。解決的方法是用API函數: SetWindowLong(Handle,GWL_STYLE,GetWindowLong(Handle,GWL_STYLE)and(notWS_CAPTION)); 動態把視窗標題欄隱藏起來,再最大化。另外,?了保持窗口最大化後播放的尺寸仍然保持跟窗口大小融合,必須在窗口的OnResize事件中寫上MediaPlayer1.DisplayRect:=Panel1.ClientRect; 另外,程式中還有“彈出CD-ROM”,文件拖放,音量控制等功能,讀者可自行參考代碼,均附了注釋。 實際上,我們上面的程式已經是一個功能比較完善的“多媒體播放器”了,下面我們就來添加我們的“網路播放”功能。 先來熱熱身。 大家知道,局部網中大家互相訪問對方共用的文件夾時,可以直接在IE的地址欄輸入如“\\機器名\共用名稱”形式來打開。比如說電腦Boy的共用文件夾mpgfile下有一個MPG文件Andy.mpg,則平時我們就可以用“\\Boy\mpegfile\Andy.mpg”來打開它。聰明的讀者可能已經想到,把這個名稱傳給播放器不就可以播放了嗎? 對!我們的程式原理是這樣的:甲機播放視頻文件時,動態把文件所在目錄“隱形”共用,並打開一個Socket服務進行監聽,當客戶Socket連接時把文件完整的路徑和名稱發送過去,客戶機取得名稱後賦給Mediaplay控制項的Filename即可進行播放。 但是現在問題又來了: 1.如何實現“動態共用”?你總不能叫用戶自己去擊滑鼠共用吧? 2.如何實現“隱形共用”?這裏的“隱形”包括兩方面:比如說Boy共用了一個文件夾,那?必須做到同一個局部網的用戶打開“網上鄰居”時看不見該文件夾。另外,用戶在Boy上共用的文件夾擊滑鼠右鍵的“共用”一項裏看不到該文件夾共用。 共用文件夾可以通過修改註冊表,而且在DELPHI中操作註冊表也很簡單。但是通過修改註冊表實現共用必須在電腦重新?動後才生效,即使你用API向系統廣播註冊表內容已經改變的消息也無效。但是,?什?Windows系統本身可以實現動態共用? 它肯定調用了什?東西。是什?呢?原來在Win9X下它調用了SVRAPI.DLL中的一個函數:NetShareAdd,在NT/2000下則是NETAPI32.DLL。其實有很多所謂的“系統漏洞”,比如說在Win9x下動態隱藏自己的功能就是系統自己本身用的用來運行某些系統程式的功能,而不是什?漏洞。只不過是微軟不公佈,後來有人發現了才叫“漏洞”。跟蹤系統和分析系統可以讓你跟系統更加靠近。 因?網路共用這個不是我們的主題,所以下面只給出實現的單元My_Share(見源代碼),感興趣的朋友可自行翻閱相關資料。調用規則如下: 刪除一個共用:DeleteShare(nil,Pchar(共用名稱稱)); 添加一個唯讀共用:ShareResource(nil,pchar(路徑),Pchar(共用名稱稱),Pchar(共用說明),STYPE_DISKTREE,SHI50F_RDONLY,'',''); 添加一個完全共用:ShareResource(nil,pchar(路徑),Pchar(共用名稱稱),Pchar(共用說明),STYPE_DISKTREE,SSHI50F_FULL,'',''); 好,第一個問題解決了,下面來解決第二個。我也不想浪費納稅人的金錢了。具體方法如下: 1.添加一個參數SHI50F_SYSTEM,這樣一來在共用的文件夾擊右鍵的“共用”裏面就看不到自己的文件夾共用了。 如:ShareResource(nil,pchar(路徑),Pchar(共用名稱稱),Pchar(共用說明),STYPE_DISKTREE, SHI50F_RDONLYorSHI50F_SYSTEM,'',''); 2.共用文件夾時在共用名稱稱後面加上一個$符號,這樣一來打開“網上鄰居”就看不見共用的文件夾了,但是還是可以訪問。如:\\Boy\Myfile$ 好,到這裏,我們的具有“網路播放”功能的播放器就完成了。程式碼很粗糙,沒有作過多容錯檢查,請讀者自行完善。另外,在程式中文件進度的拖放我們用的是Delphi自身帶的TrackBar控制項,所以在播放時有時會出現稍微短暫的停頓,建議讀者改用其他控制項比如說Trackbar95。?了功能的完整性和照顧沒有第三方控制項的讀者,我們這裏保留了該控制項。有機會的話下次手把手介紹大家做個FTP密碼破解器:) 老貓點評:如果大家對黑客軟體感興趣,那?一定聽說過作者陳經韜的大名——他的“黑洞2000”無論從功能上還是介面上都不弱於冰河,不過現在的金山毒霸和瑞星都能查出黑洞了。現在讀者一樣可以看到,經韜會的不僅僅是黑軟!
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-03-28 18:08:09
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!