終於搞定了Protocol Handler…

來源:互聯網
上載者:User

根據熊總的指示和安排,在關於Search的startkit中,有關於IFilter和Protocol Handler這兩大部分的內容。與一般的SharePoint開發不同的是,這兩個關於Search的擴充是深嵌在底層的,需要直接使用C++的COM來編寫……無奈我不會COM……不過至少看一看代碼改一改還是可以的。實際上不論是IFilter還是Protocol Handler都不是SharePoint中的新生事物,早在windows desktop search中就有這倆東西的身影了(尤其是IFilter)。

IFilter比較順利,網上的資料也比較多,雖然網上沒有sample,但是可以從windows的sdk中找到幾個例子,有簡單的也有複雜的。於是照貓畫虎地研究了一把mp3格式,寫了一個mp3的IFilter。如果有機會地話再詳細介紹IFilter吧。

而Protocol Handler這個東西就比較麻煩了,複雜程度不是IFilter可比的(實際上在Protocol Handler中,是包含了一種特殊的IFilter的),網上的資料很少,更別提sample code了。翻遍google和各個blog,只找到了一個用C#來編寫的東西(來自John Kozell),不過這隻是一個架構,沒有實質的內容。我按照這個架構嘗試寫了個例子,無奈在moss上跑不成功,並且把moss的搜尋給搞死了……於是只好等待。

(提外話,其實在SharePoint2001的sdk中,有一個Protocol Handler的例子,但是這個sdk已經找不到下載了……)

終於前些天等到了2007的SDK 1.2版發布,其中激動人心地包含了一個Protocol Handler的例子,拿過來翻了一遍代碼,功能並不複雜,只是換一種方式實現了共用資料夾的搜尋。但是,且不說這個sample毫無說明文檔(那個readme.txt不算),當我試圖編譯它的時候居然編譯都編譯不過去……改吧了好幾天終於在昨天晚上成功搞定,以下為內容。

這個sample編譯不過的主要原因,是因為缺了一個資源檔:SampleProtocolHandler.rc(在readme裡還有關於它的說明)。其實如果換一個對COM和ATL有些瞭解的人,估計搞這麼個東西應該不費吹灰之力。關鍵是我不會COM……

該檔案我放在otec上了,解壓後請自己改個副檔名…… 地址:SDK 1.2中Protocol Handler Sample中缺失的檔案

用這個rc的時候,需要把那個工程中資源的語言改成中文(0x804),當然把rc的語言設定改了也行。

幾個關鍵問題:

1、由於我是在原生編譯代碼放到虛機上執行的,但是由於虛機上沒裝vc8(就是vs2005對應的C++),由於在vc8中,編譯結果嵌入了manifest清單(這麼乾的目的是為了防止dll hell,從xp後設計出了一個類似於GAC的WinSxS[Side by Side]),所以要想在沒裝vc8的環境下運行vc8的程式或者使用其dll,必須先在環境中把對應的東西放到WinSxS裡。方法很簡單,在裝了vc8的機器上,在vs的目錄裡有SDK\v2.0\BootStrapper\Packages\vcredist_x86這個目錄,在需要部署的機器上運行裡面的vcredist_x86.exe就行了,會把需要的那些dll扔進winsxs裡。

2、在註冊COM的時候,一般都是使用regsvr32.exe xxxxx.dll去註冊的,實際上是調用了DllServerRegister方法。在sdk的那個sample中,註冊表資訊是寫在那個rgs檔案裡的,按道理說rgs應該是在.rc中被引用,然後編譯成.res,被連結到dll中。由於缺失了rc檔案,所以這個註冊資訊沒有寫進去,導致了regsvr32註冊失敗,錯誤號碼0x80070715(沒有資源)。補上rc後,發生了0x80070716,在資源內沒找到註冊資訊,看了一眼發現是多寫了倆引號……。再改再編譯再註冊,發生了0x80029c4a,未找到tlb檔案。原來註冊atl的com還要帶著tlb啊……把tlb拷過去,終於註冊成功了。

其實這裡所謂的註冊無非就是在註冊表裡填一些內容,如果有耐心的話,手填也行……我一開始就是手填的……

3、在moss中,新的Protocol Handler要建立一個內容來源來跑,但是在管理中心中,沒有out-of-box的介面去添加自訂的內容來源類型。好在sdk中還有另一個例子是如何添加自訂內容來源,這個就不多說了。

放個:

(編目記錄去爬那個sample://協議)

(搜尋結果。可以看到除了搜到了sample協議,而且還搜到了mp3裡面,這個歸功於之前寫的mp3的IFilter)

小知識:

IFilter:IFilter是在搜尋時按照相應的檔案類型、clsid或者progid去搜尋該類檔案內部的一個外掛程式。在moss中提供了常見的一些IFilter,比如office文檔、txt、html、xml等,在搜尋時,可以對這些文檔進行全文檢索索引。第三方的IFilter主要有pdf和autocad的。其實在windows案頭搜尋中已經用到了IFilter技術,在“我的電腦”中進行搜尋的時候,會有一個搜尋條件是檔案內容包含什麼什麼的,這個地方就是利用了同樣的IFilter來檢索檔案內部的。

Protocol Handler:在moss中進行耙梳搜尋的時候,會根據不同的類型採用不同的方式進行耙梳,預設提供了對於http、sharepoint、exchange public folder、共用資料夾等類型協議的支援。在預設安裝了moss搜尋後,其支援的協議有:bdc、bdc2、file、http、https、rb、rbs、sps、sps3、sps3s、spsimport、spss、sts、sts2、sts2s、sts3、sts3s這些,可以看到有很多都是sharepoint自己的耙梳協議。不同的協議採用了不同的Protocol Handler進行耙梳。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.