• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Code Knight

            Programming is so cool
            隨筆 - 52, 文章 - 0, 評論 - 14, 引用 - 0
            數據加載中……

            total commader插件編寫

                  休息了將近十天左右,代碼的東西一點都沒摸,完全脫離出代碼的世界,有時覺得程序員不應該總沉浸于自己的代碼世界,這段時間走走看看,把腦子打開去體會更多的東西,感受到以前自娛自樂的那種渺小,人應該有張有弛的,什么事情都不能過度,該做什么的時候絕對不要想著不該去想的東西,活在當下,才是幸福。
                  新的一年,要開始工作了,今天看看自己的電腦,感覺好亂,想把所有的資料全扔進Total commander里,也想寫一些插件來做一些額外的工作,比如把電影音樂打上tag或寫上評論待以后方便查看等,先存一篇文章,以后有空的時候動手做這些事情的時候也許有用。

            /////////////////////////////////////////////////////////////////////////////////////////////////////////////華麗分割線
                  應nevermind版主之約,寫了插件開發的一個Guild,簡單介紹了如何為TC開發一個插件以及插件的基本工作過程,僅僅是一個入門介紹,詳細的編程細節需要從網上下載幫助,下面文章中都給出了下載地址。

            首先聲明,本文撰寫背景是TC 6.03a,6.5會加入新的插件內容,但估計向下兼容應該是沒有問題的。
            眾所周知,TC的插件現在分為3類,Lister插件(.wlx)、FileSystem插件(.wfx)和Packer插件(.wcx)(另外還有傳說中6.5新加的Content插件(.wdx),現在還不見廬山真面目,先按下不表)。盡管擴展名穿上了不同的馬甲,但其本質都是一樣的,都是Windows的DLL動態鏈接庫,我們需要做的僅僅是按照TC的規范,實現其給定的DLL接口函數,最后把 dll擴展名改成相應擴展名就萬事大吉了(使用不同的擴展名,只不過使其容易區分而已)。

            1. 開發方法、環境和工具
            如前所述,TC插件本質上都是Windows的DLL動態鏈接庫,其開發方法和普通的DLL程序開發并沒有什么不同,任何一個可用來開發DLL的環境和工具都可以用來開發TC插件
            因此,寫TC插件首先得熟悉DLL的編寫,更高一點的要求是熟悉一些常用的Windows API,對于一個程序員老手來說應該是很容易的事情,而用什么開發環境和工具都是次要的。但是對于新手,筆者推薦使用VC或者Delphi來編寫,一方面的原因是TC作者提供的函數頭文件聲明只有C/C++和Pascal,可以省卻改寫成別的語言的麻煩;另一方面原因是TC作者給的幫助、例子,甚至網上公開源碼的插件大都是基于此兩種環境的,而有一個可參考的源碼例子能在很大程度上提供編寫幫助。另外由于TC作者提供的例子(VC環境下)已經搭建起了 插件的整個框架,我們甚至可以直接在此例子上修改開發。

            Lister插件的官方源碼例子:http://ghisler.fileburst.com/lsplugins/listplugsample.zip。
            FS插件的官方源碼例子:http://ghisler.fileburst.com/fsplugins/sampleplugin.zip。
            其它第3方插件的源碼例子可以從以下各個插件站點找到:
            http://www.ghisler.com/plugins.htm
            http://www.totalcmd.net
            http://clubtotal.free.fr

            2. Lister 插件
            首先說明一下Lister插件的工作過程:默認快捷鍵情況下,當在TC中對一個文件按下F3或者Ctrl+Q的時候,TC會檢查wincmd.ini中[ListerPlugins]一節,以下是個例子:
            [ListerPlugins]
            0=%COMMANDER_PATH%\plugins\Imagine\Imagine.wlx
            0_detect="MULTIMEDIA"
            1=%COMMANDER_PATH%\plugins\FlashView\FlashView.wlx
            1_detect="([0]="F" & [1]="W" & [2]="S")|([0]="C" & [1]="W" & [2]="S")"

            TC會順序檢查該節中每個插件對應的x_detect字段,該字段實際上是一個邏輯判斷表達式,如果此表達式結果為真,TC就會Load該插件并調用其ListLoad函數,否則檢查下一個插件。如果插件對應的x_detect字段根本就不存在,TC會調 用插件的ListGetDetectString函數,如果此函數存在,TC會將函數的返回結果保存在x_detect字段中再檢查,如果此函數仍然不存在,則TC就直接調用插件的ListLoad函數。最后,如果調用了ListLoad函數,還要判斷該 函數的返回值,如果該值是一個Windows句柄,則插件調用成功;若返回值為0(NULL),則調用失敗,繼續檢查下一個插件

            Lister插件的詳細接口函數介紹可以從網上下到:http://ghisler.fileburst.com/lsplugins/listplughelp1.2.zip。

            實際上,Lister插件必需的函數只有ListLoad一個,它是插件的核心實現函數。插件必須在此函數中讀入文件內容,創建一個窗口并顯示文件內容,最后返回這個窗口的句柄,Lister會獲得并Subclass該句柄,并在Lister內顯示。

            其余的接口函數都是可選函數,但其中有兩個比較重要的函數:ListGetDetectString和ListCloseWindow,這兩個函數與ListLoad一起構成了插件的主干部分。

            ListGetDetectString雖然是可選函數,但是我強烈建議實現這個函數,這對Lister的效率有很大的影響。從Lister工作過程可以看出,這個函數僅僅是在插件第一次被調用時才被調用,功能是返回一個檢測字符串以填寫x_detec t字段,在此之后,Lister都將只檢查此字段以決定是否調用插件。因此,一個好的檢測字符串可以讓Lister迅速判斷插件是否適用于顯示文件,如果沒有這個,Lister每次顯示文件都將不得不把插件一個個都Load進來、分配空間、調用ListL oad,直到找到一個合適的,這個速度可是偏離了Lister快速查看的本意。例如:檢測字符串是“ext="HTM" | ext="HTML"”,這時TC只需要根據文件擴展名是否是htm或html就可以直接判斷該插件是否適合,而無需讀入任何文件,這就是為什么在插件眾多的時候,Lister仍然能很快顯示的原因。當然,在某些情況下,確實難以給出一個合適的檢測字符串,這就要求ListL oad函數在文件類型判斷上的速度應該盡可能快。

            ListColseWindow是在用戶關閉Lister或在Lister中顯示另一個文件時被調用,如果此函數不存在,Lister將直接調用DestroyWindow()關閉插件窗口。通常情況下,我們需要在這里做窗口關閉時的善后工作,包括釋放 資源等等。

            除以上3個函數外,其它的幾個可選函數都涉及一些具體的附加功能,取決于具體需求。

            2. FileSystem插件
            與Lister插件不同,當用戶安裝一個FS插件時,該插件就會被第一次Load進來,并調用FsGetDefRootName以獲得插件名稱,也是該FS根目錄的名字,如果這個函數不存在,TC會直接使用wfx文件的名字做插件名稱(去掉文件擴展名) ,該名稱會保存在wincmd.ini文件[FileSystemPlugins]一節,下面是個例子:
            [FileSystemPlugins]
            Linux-drives=%COMMANDER_PATH%\plugins\ex2fs\ex2fs.wfx
            Calendar=%COMMANDER_PATH%\plugins\calendar\calendar.wfx
            Shared files=%COMMANDER_PATH%\plugins\netmon\NetMon.wfx
            這樣,當用戶進入網上鄰居時,TC不需要Load插件就可以把所有插件列出來,插件只有在用戶試圖進入FS插件目錄時才真正被Load進來。

            大致結構上,FS插件需要提供的接口函數與一個真正文件系統的基本函數有些類似。其必需的函數有4個:FsInit、FsFindFirst、FsFindNext和 FsFindClose,是不是看了很眼熟,就和平時列舉一個目錄下所有文件所用的函數 結構一樣。顧名思義,FsInit是用于插件初始化的函數,同時TC會傳給插件3個TC提供給FS插件調用的callback函數地址(下面會介紹);FsFindFirst和FsFindNext用于列舉一個目錄下所有的文件;FsFindClose用 于終止FsFindFirst/FsFindNext的文件列舉。有了這4個函數,就構成了最小的FS插件,就可以瀏覽FS插件的各個目錄了。

            有了文件目錄結構后,就到了根據需要提供各種文件功能的時候了,包括刪除文件FsDeleteFile;刪除目錄FsRemoveDir;建立目錄 FsMkDir;執行文件FsExecuteFile;設置文件屬性FsSetAttr;設置文件時間Fs SetTime;拷貝文件FsGetFile/FsPutFile/FsRenMovFile。大致上都和普通文件操作功能差不多,需要說明的是拷貝文件,由于FS插件的特殊性,拷貝文件分成了3種情況:FsGetFile是從FS中往本地硬盤拷貝;FsPutFile是從本地硬盤往FS拷貝;FsRenMovFile是 在FS內部拷貝、移動或重命名文件。

            此外,根據FS插件的需要,TC還提供了3個callback函數以供其調用:
            1) ProgressProc,用于顯示一個進度條,例如拷貝文件時的進度條。
            2) LogProc,用于顯示FTP工具欄,插件可以在工具欄中顯示log信息,并寫入log文件。如果顯示了FTP工具欄,點擊“斷開連接”按鈕時還將調用插件的FsDisconnect函數。
            3) RequestProc,用于顯示一個輸入對話框,例如要求用戶輸入用戶名和密碼等等。

            最后,FS插件還可以實現一個函數FsStatusInfo,如果這個函數被實現,TC在調用插件的任何函數(除了FsInit和FsDisconnect)之前和之后都將調用此函數,以方便插件釋放資源等等操作。

            FS插件的詳細接口函數介紹可以從網上下載:http://ghisler.fileburst.com/fsplugins/fspluginhelp1.3.zip。

            2. FileSystem插件
            與Lister插件不同,當用戶安裝一個FS插件時,該插件就會被第一次Load進來,并調用FsGetDefRootName以獲得插件名稱,也是該FS根目錄的名字,如果這個函數不存在,TC會直接使用wfx文件的名字做插件名稱(去掉文件擴展名) ,該名稱會保存在wincmd.ini文件[FileSystemPlugins]一節,下面是個例子:
            [FileSystemPlugins]
            Linux-drives=%COMMANDER_PATH%\plugins\ex2fs\ex2fs.wfx
            Calendar=%COMMANDER_PATH%\plugins\calendar\calendar.wfx
            Shared files=%COMMANDER_PATH%\plugins\netmon\NetMon.wfx
            這樣,當用戶進入網上鄰居時,TC不需要Load插件就可以把所有插件列出來,插件只有在用戶試圖進入FS插件目錄時才真正被Load進來。

            大致結構上,FS插件需要提供的接口函數與一個真正文件系統的基本函數有些類似。其必需的函數有4個:FsInit、FsFindFirst、FsFindNext和 FsFindClose,是不是看了很眼熟,就和平時列舉一個目錄下所有文件所用的函數 結構一樣。顧名思義,FsInit是用于插件初始化的函數,同時TC會傳給插件3個TC提供給FS插件調用的callback函數地址(下面會介紹);FsFindFirst和FsFindNext用于列舉一個目錄下所有的文件;FsFindClose用 于終止FsFindFirst/FsFindNext的文件列舉。有了這4個函數,就構成了最小的FS插件,就可以瀏覽FS插件的各個目錄了。

            有了文件目錄結構后,就到了根據需要提供各種文件功能的時候了,包括刪除文件FsDeleteFile;刪除目錄FsRemoveDir;建立目錄 FsMkDir;執行文件FsExecuteFile;設置文件屬性FsSetAttr;設置文件時間Fs SetTime;拷貝文件FsGetFile/FsPutFile/FsRenMovFile。大致上都和普通文件操作功能差不多,需要說明的是拷貝文件,由于FS插件的特殊性,拷貝文件分成了3種情況:FsGetFile是從FS中往本地硬盤拷貝;FsPutFile是從本地硬盤往FS拷貝;FsRenMovFile是 在FS內部拷貝、移動或重命名文件。

            此外,根據FS插件的需要,TC還提供了3個callback函數以供其調用:
            1) ProgressProc,用于顯示一個進度條,例如拷貝文件時的進度條。
            2) LogProc,用于顯示FTP工具欄,插件可以在工具欄中顯示log信息,并寫入log文件。如果顯示了FTP工具欄,點擊“斷開連接”按鈕時還將調用插件的FsDisconnect函數。
            3) RequestProc,用于顯示一個輸入對話框,例如要求用戶輸入用戶名和密碼等等。

            最后,FS插件還可以實現一個函數FsStatusInfo,如果這個函數被實現,TC在調用插件的任何函數(除了FsInit和FsDisconnect)之前和之后都將調用此函數,以方便插件釋放資源等等操作。

            FS插件的詳細接口函數介紹可以從網上下載:http://ghisler.fileburst.com/fsplugins/fspluginhelp1.3.zip。

            posted on 2010-02-19 14:53 Code Knight 閱讀(1343) 評論(0)  編輯 收藏 引用 所屬分類: C++與編程之道

            激情伊人五月天久久综合| 久久久久久久综合日本| 无码人妻久久一区二区三区蜜桃| 日本精品一区二区久久久| 亚洲精品无码久久千人斩| 国产精品热久久毛片| 久久亚洲中文字幕精品一区| 久久人妻无码中文字幕| 国产精品9999久久久久| 亚洲欧洲精品成人久久奇米网| 无码国内精品久久人妻| 色综合久久天天综线观看| 久久精品欧美日韩精品| 人妻无码精品久久亚瑟影视| 精品综合久久久久久888蜜芽| 日本精品一区二区久久久| 久久久久四虎国产精品| 一本久久知道综合久久| 久久这里只有精品视频99| 久久国产精品99久久久久久老狼 | 久久亚洲国产成人精品性色| 久久久久国产精品麻豆AR影院| 狠狠色婷婷久久一区二区三区| 思思久久精品在热线热| 伊人精品久久久久7777| 久久精品免费大片国产大片| 久久青青草原综合伊人| 91精品国产高清91久久久久久| 中文字幕人妻色偷偷久久| 中文字幕亚洲综合久久菠萝蜜| 久久天天躁狠狠躁夜夜av浪潮| 精品久久久久久无码中文野结衣| 国产精品99久久久久久人| 久久大香香蕉国产| 97久久久精品综合88久久| 99久久国产热无码精品免费| 久久久久久国产精品无码超碰| 久久久久久久久无码精品亚洲日韩 | 久久国产色AV免费观看| 久久超乳爆乳中文字幕| 国产精品免费看久久久|