根据熊总的指示和安排,在关于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进行爬网。