⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msime.pas

📁 这篇文档是讲如何利用IFELanguage接口实现对中文语句的分隔
💻 PAS
📖 第 1 页 / 共 3 页
字号:
///----------------------------------------------------------------------------
//    msime.h
//
//    Copyright (c) 1997-2001  Microsoft Corporation
//    Version 1.2
//
//----------------------------------------------------------------------------*/

(*//
标题:msime单元
说明:主要封装了IFELanguage接口,可对多国语言进行分词和注音处理
支持:wjhu111#21cn.com
日期:2007-08-06
//*)

//2007-08-06 ZswangY37 No.1 整理翻译

unit msime;

interface

uses Windows, ActiveX, office2000, imm;

const
  imeVersionMin = 6;
  imeVersionCur = 9;
  imeVersionMax = 16;

const
  IID_IFECommon: TGUID = '{019F7151-E6DB-11D0-83C3-00C04FDDB82E}';
  IID_IFELanguage: TGUID = '{019F7152-E6DB-11D0-83C3-00C04FDDB82E}';
  IID_IFELanguage2: TGUID = '{21164102-C24A-11D1-851A-00C04FCC6B14}';
  IID_IFEDictionary: TGUID = '{019F7153-E6DB-11D0-83C3-00C04FDDB82E}';

type
  IFEClassFactory = interface(IClassFactory)
    // IFEClassFactory members
    function CreateInstance(unkOuter: IUnknown; const iid: TIID;
      var obj): HResult; stdcall;
    function LockServer(fLock: BOOL): HResult; stdcall;
  end;

const
  IFEC_S_ALREADY_DEFAULT: HRESULT = SEVERITY_SUCCESS shl 31 or FACILITY_ITF shl 16 or $7400;

type
  _IMEDLG = packed record
    cbIMEDLG: Integer; //size of this structure
    hwnd: THandle; //parent window handle
    lpwstrWord: PWideChar; //optional string
    nTabId: Integer; //specifies a tab in dialog
  end;
  IMEDLG = _IMEDLG;
  PIMEDLG = ^IMEDLG;

  IFECommon = interface(IUnknown)
    ['{019F7151-E6DB-11D0-83C3-00C04FDDB82E}']
    // IFECommon members
    function IsDefaultIME(szName: PChar; cszName: Integer): HResult; stdcall;
    function SetDefaultIME: HResult; stdcall;
    function InvokeWordRegDialog(pimedlg: PIMEDLG): HResult; stdcall;
    function InvokeDictToolDialog(pimedlg: PIMEDLG): HResult; stdcall;
  end;

  tagWDD = packed record
    wDispPos: Word; // Offset of Output string
    wReadPos: Word; // Offset of Reading string
        //union wCompPos: Word;

    cchDisp: Word; //number of ptchDisp
    cchRead: Word; //number of ptchRead
        //union cchComp: Word;

    nReserve: Longword; //reserved

    nPos: Word; //part of speech

    wFlag1: Longword;
    wFlag2: Longword;
      //fPhrase : 1;//start of phrase
      //fAutoCorrect: 1;//auto-corrected
      //fNumericPrefix: 1;//kansu-shi expansion(JPN)
      //fUserRegistered: 1;//from user dictionary
      //fUnknown: 1;//unknown word (duplicated information with nPos.)
      //fRecentUsed: 1; //used recently flag
      //:10;        //
    pReserved: Pointer; //points directly to WORDITEM
  end;
  WDD = tagWDD;
  PWDD = ^WDD;

  tagMORRSLT = packed record
    dwSize: DWORD; // total size of this block.
    pwchOutput: PWideChar; // conversion result string.
    cchOutput: Word; // lengh of result string.
    pwchRead: PWideChar; // reading string
        //union pwchComp: PWideChar;
    cchRead: Word; // length of reading string.
        //union cchComp: Word;
    pchInputPos: PWORD; // index array of reading to input character.
    pchOutputIdxWDD: PWORD; // index array of output character to WDD
    pchReadIdxWDD: PWORD;
        //union pchCompIdxWDD: PWORD;
    paMonoRubyPos: PWORD; // array of position of monoruby
    pWDD: PWDD; // pointer to array of WDD
    cWDD: Integer; // number of WDD
    pPrivate: Pointer; // pointer of private data area
    BLKBuff: array[0..0]of WideChar;
                                    //  WCHAR   wchOutput[cchOutput];
                                    //  WCHAR   wchRead[cchRead];
                                    //  CHAR    chInputIdx[cwchInput];
                                    //  CHAR    chOutputIdx[cchOutput];
                                    //  CHAR    chReadIndx[cchRead];
                                    //  ????    Private
                                    //  WDD     WDDBlk[cWDD];
  end;
  MORRSLT = tagMORRSLT;
  PMORRSLT = ^MORRSLT;

// request for conversion (dwRequest)
const
  FELANG_REQ_CONV = $00010000;
  FELANG_REQ_RECONV = $00020000;
  FELANG_REQ_REV = $00030000;
  
// Conversion mode (dwCMode)
  FELANG_CMODE_MONORUBY = $00000002; //mono-ruby
  FELANG_CMODE_NOPRUNING = $00000004; //no pruning
  FELANG_CMODE_KATAKANAOUT = $00000008; //katakana output
  FELANG_CMODE_HIRAGANAOUT = $00000000; //default output
  FELANG_CMODE_HALFWIDTHOUT = $00000010; //half-width output
  FELANG_CMODE_FULLWIDTHOUT = $00000020; //full-width output
  FELANG_CMODE_BOPOMOFO = $00000040; //
  FELANG_CMODE_HANGUL = $00000080; //
  FELANG_CMODE_PINYIN = $00000100; //
  FELANG_CMODE_PRECONV = $00000200; //do conversion as follows:
                                                // - roma-ji to kana
                                                // - autocorrect before conversion
                                                // - periods, comma, and brackets
  FELANG_CMODE_RADICAL = $00000400; //
  FELANG_CMODE_UNKNOWNREADING = 00000800; //
  FELANG_CMODE_MERGECAND = $00001000; // merge display with same candidate
  FELANG_CMODE_ROMAN = $00002000; //
  FELANG_CMODE_BESTFIRST = $00004000; // only make 1st best
  FELANG_CMODE_USENOREVWORDS = $00008000; // use invalid revword on REV/RECONV.

  FELANG_CMODE_NONE = $01000000; // IME_SMODE_NONE
  FELANG_CMODE_PLAURALCLAUSE = $02000000; // IME_SMODE_PLAURALCLAUSE
  FELANG_CMODE_SINGLECONVERT = $04000000; // IME_SMODE_SINGLECONVERT
  FELANG_CMODE_AUTOMATIC = $08000000; // IME_SMODE_AUTOMATIC
  FELANG_CMODE_PHRASEPREDICT = $10000000; // IME_SMODE_PHRASEPREDICT
  FELANG_CMODE_CONVERSATION = $20000000; // IME_SMODE_CONVERSATION
  FELANG_CMODE_NAME = FELANG_CMODE_PHRASEPREDICT;  // Name mode (MSKKIME)
  FELANG_CMODE_NOINVISIBLECHAR = $40000000; // remove invisible chars (e.g. tone mark)

// Error message
  E_NOCAND = $30; //not enough candidates
  E_NOTENOUGH_BUFFER = $31; //out of string buffer
  E_NOTENOUGH_WDD = $32; //out of WDD buffer
  E_LARGEINPUT = $33; //large input string

//Morphology Info
  FELANG_CLMN_WBREAK = $01; //
  FELANG_CLMN_NOWBREAK = $02; //
  FELANG_CLMN_PBREAK = $04; //
  FELANG_CLMN_NOPBREAK = $08; //
  FELANG_CLMN_FIXR = $10; //
  FELANG_CLMN_FIXD = $20; // fix display of word

  FELANG_INVALD_PO = $FFFF; // unmatched position for input string

type
  IFELanguage = interface(IUnknown)
    ['{019F7152-E6DB-11D0-83C3-00C04FDDB82E}']
    // IUnknown members
    // Ijconv members.  must be virtual functions
    function Open: HResult; stdcall;
    function Close: HResult; stdcall;
    function GetJMorphResult(
      dwRequest: DWORD; // [in]
      dwCMode: DWORD; // [in]
      cwchInput: Integer; // [in]
      pwchInput: PWideChar; // [in]
      pfCInfo : PLongword; // [in, size_is(cwchInput)]
      ppResult: PMORRSLT // [out]
    ): HResult; stdcall;
    function GetConversionModeCaps(
      pdwCaps: PDWORD
    ): HResult; stdcall;
    function GetPhonetic(
      _string: WideString; // [in]
      start: Longint; // [in]
      length: Longint; // [in]
      phonetic: PWideString
    ): HResult; stdcall;
    function GetConversion(
      _string: WideString; // [in]
      start: Longint; // [in]
      length: Longint; // [in]
      result: PWideString
    ): HResult; stdcall;
  end;

////////////////////////////////
// Definitions for IFEDictionary
////////////////////////////////

const
// Part Of Speach
  IFED_POS_NONE = $00000000;
  IFED_POS_NOUN = $00000001;
  IFED_POS_VERB = $00000002;
  IFED_POS_ADJECTIVE = $00000004;
  IFED_POS_ADJECTIVE_VERB = $00000008;
  IFED_POS_ADVERB = $00000010;
  IFED_POS_ADNOUN = $00000020;
  IFED_POS_CONJUNCTION = $00000040;
  IFED_POS_INTERJECTION = $00000080;
  IFED_POS_INDEPENDENT = $000000ff;
  IFED_POS_INFLECTIONALSUFFIX = $00000100;
  IFED_POS_PREFIX = $00000200;
  IFED_POS_SUFFIX = $00000400;
  IFED_POS_AFFIX = $00000600;
  IFED_POS_TANKANJI = $00000800;
  IFED_POS_IDIOMS = $00001000;
  IFED_POS_SYMBOLS = $00002000;
  IFED_POS_PARTICLE = $00004000;
  IFED_POS_AUXILIARY_VERB = $00008000;
  IFED_POS_SUB_VERB = $00010000;
  IFED_POS_DEPENDENT = $0001c000;
  IFED_POS_ALL = $0001ffff;

// GetWord Selection Type
  IFED_SELECT_NONE = $00000000;
  IFED_SELECT_READING = $00000001;
  IFED_SELECT_DISPLAY = $00000002;
  IFED_SELECT_POS = $00000004;
  IFED_SELECT_COMMENT = $00000008;
  IFED_SELECT_ALL = $0000000f;

// Registered Word/Dependency Type
  IFED_REG_NONE = $00000000;
  IFED_REG_USER = $00000001;
  IFED_REG_AUTO = $00000002;
  IFED_REG_GRAMMAR = $00000004;
  IFED_REG_ALL = $00000007;

// Dictionary Type
  IFED_TYPE_NONE = $00000000;
  IFED_TYPE_GENERAL = $00000001;
  IFED_TYPE_NAMEPLACE = $00000002;
  IFED_TYPE_SPEECH = $00000004;
  IFED_TYPE_REVERSE = $00000008;
  IFED_TYPE_ENGLISH = $00000010;
  IFED_TYPE_ALL = $0000001f;

const
// HRESULTS for IFEDictionary interface
  //no more entries in the dictionary
  IFED_S_MORE_ENTRIES = SEVERITY_SUCCESS shl 31 or FACILITY_ITF shl 16 or $7200;
  //dictionary is empty, no header information is returned
  IFED_S_EMPTY_DICTIONARY = SEVERITY_SUCCESS shl 31 or FACILITY_ITF shl 16 or $7201;
  //word already exists in dictionary
  IFED_S_WORD_EXISTS = SEVERITY_SUCCESS shl 31 or FACILITY_ITF shl 16 or $7202;
  //word already exists in dictionary but only comment data is updated
  IFED_S_COMMENT_CHANGED = SEVERITY_SUCCESS shl 31 or FACILITY_ITF shl 16 or $7203;

  //dictionary is not found
  IFED_E_NOT_FOUND = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7300;
  //invalid dictionary format
  IFED_E_INVALID_FORMAT = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7301;
  //failed to open file
  IFED_E_OPEN_FAILED = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7302;
  //failed to write to file
  IFED_E_WRITE_FAILED = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7303;
  //no entry found in dictionary
  IFED_E_NO_ENTRY = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7304;
  //this routines doesn't support the current dictionary
  IFED_E_REGISTER_FAILED = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7305;
  //not a user dictionary
  IFED_E_NOT_USER_DIC = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7306;
  //not supported
  IFED_E_NOT_SUPPORTED = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7307;
  //failed to insert user comment
  IFED_E_USER_COMMENT = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7308;
  //improper POS is to be registered
  IFED_E_REGISTER_ILLEGAL_POS = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $7309;
  //improper word is to be registered
  IFED_E_REGISTER_IMPROPER_WORD = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $730a;
  //dictionary is disconnected
  IFED_E_REGISTER_DISCONNECTED = SEVERITY_ERROR shl 31 or FACILITY_ITF shl 16 or $730b;

  cbCommentMax = 256;

  //Private Unicode Character
  wchPrivate1 = $E000;

type
  IMEREG = (IFED_REG_HEAD, IFED_REG_TAIL, IFED_REG_DEL);
  IMEREL = (
    IFED_REL_NONE,
    IFED_REL_NO,
    IFED_REL_GA,
    IFED_REL_WO,
    IFED_REL_NI,
    IFED_REL_DE,
    IFED_REL_YORI,
    IFED_REL_KARA,
    IFED_REL_MADE,
    IFED_REL_HE,
    IFED_REL_TO,
    IFED_REL_IDEOM,
    IFED_REL_FUKU_YOUGEN,       //p2_1
    IFED_REL_KEIYOU_YOUGEN,     //p2_2
    IFED_REL_KEIDOU1_YOUGEN,    //p2_3
    IFED_REL_KEIDOU2_YOUGEN,    //p2_4
    IFED_REL_TAIGEN,            //p2_5
    IFED_REL_YOUGEN,            //p2_6
    IFED_REL_RENTAI_MEI,        //p3_1
    IFED_REL_RENSOU,            //p3_2
    IFED_REL_KEIYOU_TO_YOUGEN,  //p3_3
    IFED_REL_KEIYOU_TARU_YOUGEN,//p3_4
    IFED_REL_UNKNOWN1,          //p3_5
    IFED_REL_UNKNOWN2,          //p3_6
    IFED_REL_ALL               //any type
    );

  // Type of IME dictionary
  IMEFMT = (
    IFED_UNKNOWN,
    IFED_MSIME2_BIN_SYSTEM,
    IFED_MSIME2_BIN_USER,
    IFED_MSIME2_TEXT_USER,
    IFED_MSIME95_BIN_SYSTEM,
    IFED_MSIME95_BIN_USER,
    IFED_MSIME95_TEXT_USER,
    IFED_MSIME97_BIN_SYSTEM,
    IFED_MSIME97_BIN_USER,
    IFED_MSIME97_TEXT_USER,
    IFED_MSIME98_BIN_SYSTEM,
    IFED_MSIME98_BIN_USER,
    IFED_MSIME98_TEXT_USER,
    IFED_ACTIVE_DICT,
    IFED_ATOK9,
    IFED_ATOK10,
    IFED_NEC_AI_,
    IFED_WX_II,
    IFED_WX_III,
    IFED_VJE_20,
    IFED_MSIME98_SYSTEM_CE,
    IFED_MSIME_BIN_SYSTEM,
    IFED_MSIME_BIN_USER,
    IFED_MSIME_TEXT_USER,
    IFED_PIME2_BIN_USER,
    IFED_PIME2_BIN_SYSTEM,
    IFED_PIME2_BIN_STANDARD_SYSTEM
  );
  PIMEFMT = ^IMEFMT;
  
  // Type of User Comment
  IMEUCT = (
    IFED_UCT_NONE,
    IFED_UCT_STRING_SJIS,
    IFED_UCT_STRING_UNICODE,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -