📄 msime.pas
字号:
///----------------------------------------------------------------------------
// 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 + -