描述:
我准备用Microsoft的Index Sever中的Language Resource Object组件实现一些简单的分词。
以下是文件头定义:
EXTERN_C const CLSID CLSID_SimplifiedChineseWord ={
0x9717fc70, 0xc1bc, 0x11d0,
{0x96, 0x92, 0x0, 0xa0, 0xc9, 0x08, 0x14, 0x6e } };
//----------------------------------------------------------------------------------------
typedef interface IWordSink IWordSink;
EXTERN_C const IID IID_IWordSink;
MIDL_INTERFACE("CC907054-C058-101A-B554-08002B33B0E6")
IWordSink : public IUnknown
{ public:
virtual void PutWord(
ULONG cwc, const WCHAR *pwcInBuf, ULONG cwcSrcLen, ULONG cwcSrcPos) = 0;
};
//----------------------------------------------------------------------------------------
typedef interface IWordBreaker IWordBreaker;
EXTERN_C const IID IID_IWordBreaker;
MIDL_INTERFACE("D53552C8-77E3-101A-B552-08002B33B0E6")
IWordBreaker : public IUnknown
{ public:
virtual HRESULT STDMETHODCALLTYPE Init(
BOOL fQuery, ULONG ulMaxTokenSize, BOOL *pfLicense ) = 0;
virtual HRESULT STDMETHODCALLTYPE BreakText(
TEXT_SOURCE *pTextSource, IWordSink *pWordSink, IPhraseSink *pPhraseSink) = 0;
};
下面是我做的简单测试程序:
我调用中文分词中的IWordBreaker接口,然后调用BreakText就可以分词了,但它要求实例化一个WordSink对象(详细定义参见上面的文件头),但我需要根据IWordSink重新定制这个WordSink类的PutWord方法,以满足我的需要,所以有如下代码:
class CWordSink:IWordSink
{
public:
virtual void PutWord(
ULONG cwc, const WCHAR *pwcInBuf, ULONG cwcSrcLen, ULONG cwcSrcPos) ;
};
void PutWord( ULONG cwc, const WCHAR *pwcInBuf, ULONG cwcSrcLen, ULONG cwcSrcPos)
{ 在这里写我自已的代码,以满足各种需要 }
主运行程序:
void main(void)
{
HRESULT hr;
LPVOID *WordBreaker = NULL;
hr = CoInitialize(0);
if(SUCCEEDED(hr))
{
hr = CoCreateInstance(
CLSID_SimplifiedChineseWord,
0,
CLSCTX_INPROC_SERVER,
IID_IWordBreaker,
( LPVOID * ) &WordBreaker );
BOOL License=true;
WCHAR *str=L"中华人民共和国是个伟大的国家";
IWordBreaker *iwb = (IWordBreaker *)WordBreaker; //注意:这一行有错
以上执行全部正确,但这一行提示我:error C2259: “CWordSink”不能实例化抽象类
iwb->Init(true,1000, &License);
CWordSink *WordSink = new CWordSink();
iwb->BreakText(txtSource,(IWordSink*)WordSink,NULL);
wprintf(L"Success!\n");
}
CoUninitialize();
}
不知高手们看明白了没有?我的问题就是这样的,我怎么样去重新制定IWordSink接口中的PutWord方法,并且能够得到一个IWordSink的对象