winapi_ui_automation/um/
sapiddk51.rs

1// Licensed under the Apache License, Version 2.0
2// <LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
3// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your option.
4// All files in the project carrying such notice may not be copied, modified, or distributed
5// except according to those terms.
6use ctypes::{c_char, c_float, c_long, c_void};
7use shared::guiddef::{CLSID, GUID, IID, REFGUID};
8use shared::minwindef::{BOOL, BYTE, DWORD, ULONG, USHORT, WORD};
9use shared::mmreg::WAVEFORMATEX;
10use shared::windef::HWND;
11use um::oaidl::VARIANT;
12use um::objidlbase::IStream;
13use um::sapi::*;
14use um::unknwnbase::{IUnknown, IUnknownVtbl};
15use um::winnt::{HANDLE, HRESULT, LONG, LPCWSTR, LPWSTR, PVOID, ULONGLONG, WCHAR};
16pub const SPRECOEXTENSION: &'static str = "RecoExtension";
17pub const SPALTERNATESCLSID: &'static str = "AlternatesCLSID";
18RIDL!{#[uuid(0xf8e690f0, 0x39cb, 0x4843, 0xb8, 0xd7, 0xc8, 0x46, 0x96, 0xe1, 0x11, 0x9d)]
19interface ISpTokenUI(ISpTokenUIVtbl): IUnknown(IUnknownVtbl) {
20    fn IsUISupported(
21        pszTypeOfUI: LPCWSTR,
22        pvExtraData: *mut c_void,
23        cbExtraData: ULONG,
24        punkObject: *mut IUnknown,
25        pfSupported: *mut BOOL,
26    ) -> HRESULT,
27    fn DisplayUI(
28        hwndParent: HWND,
29        pszTitle: LPCWSTR,
30        pszTypeOfUI: LPCWSTR,
31        pvExtraData: *mut c_void,
32        cbExtraData: ULONG,
33        pToken: *mut ISpObjectToken,
34        punkObject: *mut IUnknown,
35    ) -> HRESULT,
36}}
37RIDL!{#[uuid(0x06b64f9f, 0x7fda, 0x11d2, 0xb4, 0xf2, 0x00, 0xc0, 0x4f, 0x79, 0x73, 0x96)]
38interface ISpObjectTokenEnumBuilder(ISpObjectTokenEnumBuilderVtbl):
39    IEnumSpObjectTokens(IEnumSpObjectTokensVtbl) {
40    fn SetAttribs(
41        pszReqAttribs: LPCWSTR,
42        pszOptAttribs: LPCWSTR,
43    ) -> HRESULT,
44    fn AddTokens(
45        cTokens: ULONG,
46        pToken: *mut *mut ISpObjectToken,
47    ) -> HRESULT,
48    fn AddTokensFromDataKey(
49        pDataKey: *mut ISpDataKey,
50        pszSubKey: LPCWSTR,
51        pszCategoryId: LPCWSTR,
52    ) -> HRESULT,
53    fn AddTokensFromTokenEnum(
54        pTokenEnum: *mut IEnumSpObjectTokens,
55    ) -> HRESULT,
56    fn Sort(
57        pszTokenIdToListFirst: LPCWSTR,
58    ) -> HRESULT,
59}}
60DECLARE_HANDLE!{SPWORDHANDLE, SPWORDHANDLE__}
61DECLARE_HANDLE!{SPRULEHANDLE, SPRULEHANDLE__}
62DECLARE_HANDLE!{SPGRAMMARHANDLE, SPGRAMMARHANDLE__}
63DECLARE_HANDLE!{SPRECOCONTEXTHANDLE, SPRECOCONTEXTHANDLE__}
64DECLARE_HANDLE!{SPPHRASERULEHANDLE, SPPHRASERULEHANDLE__}
65DECLARE_HANDLE!{SPPHRASEPROPERTYHANDLE, SPPHRASEPROPERTYHANDLE__}
66DECLARE_HANDLE!{SPTRANSITIONID, SPTRANSITIONID__}
67RIDL!{#[uuid(0xf4711347, 0xe608, 0x11d2, 0xa0, 0x86, 0x00, 0xc0, 0x4f, 0x8e, 0xf9, 0xb5)]
68interface ISpErrorLog(ISpErrorLogVtbl): IUnknown(IUnknownVtbl) {
69    fn AddError(
70        lLineNumber: c_long,
71        hr: HRESULT,
72        pszDescription: LPCWSTR,
73        pszHelpFile: LPCWSTR,
74        dwHelpContext: DWORD,
75    ) -> HRESULT,
76}}
77RIDL!{#[uuid(0xb1e29d58, 0xa675, 0x11d2, 0x83, 0x02, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
78interface ISpGrammarCompiler(ISpGrammarCompilerVtbl): IUnknown(IUnknownVtbl) {
79    fn CompileStream(
80        pSource: *mut IStream,
81        pDest: *mut IStream,
82        pHeader: *mut IStream,
83        pReserved: *mut IUnknown,
84        pErrorLog: *mut ISpErrorLog,
85        dwFlags: DWORD,
86    ) -> HRESULT,
87}}
88RIDL!{#[uuid(0x3ddca27c, 0x665c, 0x4786, 0x9f, 0x97, 0x8c, 0x90, 0xc3, 0x48, 0x8b, 0x61)]
89interface ISpGramCompBackend(ISpGramCompBackendVtbl): ISpGrammarBuilder(ISpGrammarBuilderVtbl) {
90    fn SetSaveObjects(
91        pStream: *mut IStream,
92        pErrorLog: *mut ISpErrorLog,
93    ) -> HRESULT,
94    fn InitFromBinaryGrammar(
95        pBinaryData: *const SPBINARYGRAMMAR,
96    ) -> HRESULT,
97}}
98RIDL!{#[uuid(0x12d7360f, 0xa1c9, 0x11d3, 0xbc, 0x90, 0x00, 0xc0, 0x4f, 0x72, 0xdf, 0x9f)]
99interface ISpITNProcessor(ISpITNProcessorVtbl): IUnknown(IUnknownVtbl) {
100    fn LoadITNGrammar(
101        pszCLSID: LPWSTR,
102    ) -> HRESULT,
103    fn ITNPhrase(
104        pPhrase: *mut ISpPhraseBuilder,
105    ) -> HRESULT,
106}}
107RIDL!{#[uuid(0x88a3342a, 0x0bed, 0x4834, 0x92, 0x2b, 0x88, 0xd4, 0x31, 0x73, 0x16, 0x2f)]
108interface ISpPhraseBuilder(ISpPhraseBuilderVtbl): ISpPhrase(ISpPhraseVtbl) {
109    fn InitFromPhrase(
110        pPhrase: *const SPPHRASE,
111    ) -> HRESULT,
112    fn InitFromSerializedPhrase(
113        pPhrase: *const SPSERIALIZEDPHRASE,
114    ) -> HRESULT,
115    fn AddElements(
116        cElements: ULONG,
117        pElement: *const SPPHRASEELEMENT,
118    ) -> HRESULT,
119    fn AddRules(
120        hParent: SPPHRASERULEHANDLE,
121        pRule: *const SPPHRASERULE,
122        phNewRule: *mut SPPHRASERULEHANDLE,
123    ) -> HRESULT,
124    fn AddProperties(
125        hParent: SPPHRASEPROPERTYHANDLE,
126        pProperty: *const SPPHRASEPROPERTY,
127        phNewProperty: *mut SPPHRASEPROPERTYHANDLE,
128    ) -> HRESULT,
129    fn AddReplacements(
130        cReplacements: ULONG,
131        pReplacements: *const SPPHRASEREPLACEMENT,
132    ) -> HRESULT,
133}}
134pub type ISpTask = *mut c_void;
135pub type ISpThreadTask = *mut c_void;
136RIDL!{#[uuid(0xa6be4d73, 0x4403, 0x4358, 0xb2, 0x2d, 0x03, 0x46, 0xe2, 0x3b, 0x17, 0x64)]
137interface ISpThreadControl(ISpThreadControlVtbl): ISpNotifySink(ISpNotifySinkVtbl) {
138    fn StartThread(
139        dwFlags: DWORD,
140        phwnd: *mut HWND,
141    ) -> HRESULT,
142    fn WaitForThreadDone(
143        fForceStop: BOOL,
144        phrThreadResult: *mut HRESULT,
145        msTimeOut: ULONG,
146    ) -> HRESULT,
147    fn TerminateThread() -> HRESULT,
148    fn ThreadHandle() -> HANDLE,
149    fn ThreadId() -> DWORD,
150    fn NotifyEvent() -> HANDLE,
151    fn WindowHandle() -> HWND,
152    fn ThreadCompleteEvent() -> HANDLE,
153    fn ExitThreadEvent() -> HANDLE,
154}}
155STRUCT!{struct SPTMTHREADINFO {
156    lPoolSize: c_long,
157    lPriority: c_long,
158    ulConcurrencyLimit: ULONG,
159    ulMaxQuickAllocThreads: ULONG,
160}}
161RIDL!{#[uuid(0x2baeef81, 0x2ca3, 0x4331, 0x98, 0xf3, 0x26, 0xec, 0x5a, 0xbe, 0xfb, 0x03)]
162interface ISpTaskManager(ISpTaskManagerVtbl): IUnknown(IUnknownVtbl) {
163    fn SetThreadPoolInfo(
164        pPoolInfo: *const SPTMTHREADINFO,
165    ) -> HRESULT,
166    fn GetThreadPoolInfo(
167        pPoolInfo: *mut SPTMTHREADINFO,
168    ) -> HRESULT,
169    fn QueueTask(
170        pTask: *mut ISpTask,
171        pvTaskData: *mut c_void,
172        hCompEvent: HANDLE,
173        pdwGroupId: *mut DWORD,
174        pTaskID: *mut DWORD,
175    ) -> HRESULT,
176    fn CreateReoccurringTask(
177        pTask: *mut ISpTask,
178        pvTaskData: *mut c_void,
179        hCompEvent: HANDLE,
180        ppTaskCtrl: *mut *mut ISpNotifySink,
181    ) -> HRESULT,
182    fn CreateThreadControl(
183        pTask: *mut ISpThreadTask,
184        pvTaskData: *mut c_void,
185        nPriority: c_long,
186        ppTaskCtrl: *mut *mut ISpThreadControl,
187    ) -> HRESULT,
188    fn TerminateTask(
189        dwGroupId: DWORD,
190        ulWaitPeriod: ULONG,
191    ) -> HRESULT,
192}}
193ENUM!{enum SPVSKIPTYPE {
194    SPVST_SENTENCE = 1 << 0,
195}}
196ENUM!{enum SPVESACTIONS {
197    SPVES_CONTINUE = 0,
198    SPVES_ABORT = 1 << 0,
199    SPVES_SKIP = 1 << 1,
200    SPVES_RATE = 1 << 2,
201    SPVES_VOLUME = 1 << 3,
202}}
203RIDL!{#[uuid(0x9880499b, 0xcce9, 0x11d2, 0xb5, 0x03, 0x00, 0xc0, 0x4f, 0x79, 0x73, 0x96)]
204interface ISpTTSEngineSite(ISpTTSEngineSiteVtbl): ISpEventSink(ISpEventSinkVtbl) {
205    fn GetActions() -> DWORD,
206    fn Write(
207        pBuff: *const c_void,
208        cb: ULONG,
209        pcbWritten: *mut ULONG,
210    ) -> HRESULT,
211    fn GetRate(
212        pRateAdjust: *mut c_long,
213    ) -> HRESULT,
214    fn GetVolume(pusVolume: *mut USHORT,
215    ) -> HRESULT,
216    fn GetSkipInfo(
217        peType: *mut SPVSKIPTYPE,
218        plNumItems: *mut c_long,
219    ) -> HRESULT,
220    fn CompleteSkip(
221        ulNumSkipped: c_long,
222    ) -> HRESULT,
223}}
224STRUCT!{struct SPVTEXTFRAG {
225    pNext: *mut SPVTEXTFRAG,
226    State: SPVSTATE,
227    pTextStart: LPCWSTR,
228    ulTextLen: ULONG,
229    ulTextSrcOffset: ULONG,
230}}
231RIDL!{#[uuid(0xa74d7c8e, 0x4cc5, 0x4f2f, 0xa6, 0xeb, 0x80, 0x4d, 0xee, 0x18, 0x50, 0x0e)]
232interface ISpTTSEngine(ISpTTSEngineVtbl): IUnknown(IUnknownVtbl) {
233    fn Speak(
234        dwSpeakFlags: DWORD,
235        rguidFormatId: REFGUID,
236        pWaveFormatEx: *const WAVEFORMATEX,
237        pTextFragList: *const SPVTEXTFRAG,
238        pOutputSite: *mut ISpTTSEngineSite,
239    ) -> HRESULT,
240    fn GetOutputFormat(
241        pTargetFmtId: *const GUID,
242        pTargetWaveFormatEx: *const WAVEFORMATEX,
243        pOutputFormatId: *mut GUID,
244        ppCoMemOutputWaveFormatEx: *mut WAVEFORMATEX,
245    ) -> HRESULT,
246}}
247STRUCT!{struct SPWORDENTRY {
248    hWord: SPWORDHANDLE,
249    LangID: WORD,
250    pszDisplayText: *mut WCHAR,
251    pszLexicalForm: *mut WCHAR,
252    aPhoneId: *mut SPPHONEID,
253    pvClientContext: *mut c_void,
254}}
255STRUCT!{struct SPRULEENTRY {
256    hRule: SPRULEHANDLE,
257    hInitialState: SPSTATEHANDLE,
258    Attributes: DWORD,
259    pvClientRuleContext: *mut c_void,
260    pvClientGrammarContext: *mut c_void,
261}}
262ENUM!{enum SPTRANSITIONTYPE {
263    SPTRANSEPSILON = 0,
264    SPTRANSWORD,
265    SPTRANSRULE,
266    SPTRANSTEXTBUF,
267    SPTRANSWILDCARD,
268    SPTRANSDICTATION,
269}}
270STRUCT!{struct SPTRANSITIONENTRY_u_s1 {
271    hRuleInitialState: SPSTATEHANDLE,
272    hRule: SPRULEHANDLE,
273    pvClientRuleContext: *mut c_void,
274}}
275STRUCT!{struct SPTRANSITIONENTRY_u_s2 {
276    hWord: SPWORDHANDLE,
277    pvClientWordContext: *mut c_void,
278}}
279UNION!{union SPTRANSITIONENTRY_u {
280    [usize; 3],
281    s1 s1_mut: SPTRANSITIONENTRY_u_s1,
282    s2 s2_mut: SPTRANSITIONENTRY_u_s2,
283    pvGrammarCookie pvGrammarCookie_mut: *mut c_void,
284}}
285STRUCT!{struct SPTRANSITIONENTRY {
286    ID: SPTRANSITIONID,
287    hNextState: SPSTATEHANDLE,
288    Type: BYTE,
289    RequiredConfidence: c_char,
290    fHasProperty: DWORD,
291    Weight: c_float,
292    u: SPTRANSITIONENTRY_u,
293}}
294STRUCT!{struct SPTRANSITIONPROPERTY {
295    pszName: LPCWSTR,
296    ulId: ULONG,
297    pszValue: LPCWSTR,
298    vValue: VARIANT,
299}}
300STRUCT!{struct SPSTATEINFO {
301    cAllocatedEntries: ULONG,
302    pTransitions: *mut SPTRANSITIONENTRY,
303    cEpsilons: ULONG,
304    cRules: ULONG,
305    cWords: ULONG,
306    cSpecialTransitions: ULONG,
307}}
308STRUCT!{struct SPPATHENTRY {
309    hTransition: SPTRANSITIONID,
310    elem: SPPHRASEELEMENT,
311}}
312RIDL!{#[uuid(0x6a6ffad8, 0x78b6, 0x473d, 0xb8, 0x44, 0x98, 0x15, 0x2e, 0x4f, 0xb1, 0x6b)]
313interface ISpCFGInterpreterSite(ISpCFGInterpreterSiteVtbl): IUnknown(IUnknownVtbl) {
314    fn AddTextReplacement(
315        pReplace: *mut SPPHRASEREPLACEMENT,
316    ) -> HRESULT,
317    fn AddProperty(
318        pProperty: *const SPPHRASEPROPERTY,
319    ) -> HRESULT,
320    fn GetResourceValue(
321        pszResourceName: LPCWSTR,
322        ppCoMemResource: *mut LPWSTR,
323    ) -> HRESULT,
324}}
325RIDL!{#[uuid(0xf3d3f926, 0x11fc, 0x11d3, 0xbb, 0x97, 0x00, 0xc0, 0x4f, 0x8e, 0xe6, 0xc0)]
326interface ISpCFGInterpreter(ISpCFGInterpreterVtbl): IUnknown(IUnknownVtbl) {
327    fn InitGrammar(
328        pszGrammarName: LPCWSTR,
329        pvGrammarData: *mut *const c_void,
330    ) -> HRESULT,
331    fn Interpret(
332        pPhrase: *mut ISpPhraseBuilder,
333        ulFirstElement: *const ULONG,
334        ulCountOfElements: *const ULONG,
335        pSite: *mut ISpCFGInterpreterSite,
336    ) -> HRESULT,
337}}
338ENUM!{enum SPCFGNOTIFY {
339    SPCFGN_ADD,
340    SPCFGN_REMOVE,
341    SPCFGN_INVALIDATE,
342    SPCFGN_ACTIVATE,
343    SPCFGN_DEACTIVATE,
344}}
345ENUM!{enum SPRESULTTYPE {
346    SPRT_CFG = 0,
347    SPRT_SLM = 1,
348    SPRT_PROPRIETARY = 2,
349    SPRT_FALSE_RECOGNITION = 1 << 2,
350}}
351STRUCT!{struct SPPHRASEALT {
352    pPhrase: *mut ISpPhraseBuilder,
353    ulStartElementInParent: ULONG,
354    cElementsInParent: ULONG,
355    cElementsInAlternate: ULONG,
356    pvAltExtra: *mut c_void,
357    cbAltExtra: ULONG,
358}}
359STRUCT!{struct SPRECORESULTINFO {
360    cbSize: ULONG,
361    eResultType: SPRESULTTYPE,
362    fHypothesis: BOOL,
363    fProprietaryAutoPause: BOOL,
364    ullStreamPosStart: ULONGLONG,
365    ullStreamPosEnd: ULONGLONG,
366    hGrammar: SPGRAMMARHANDLE,
367    ulSizeEngineData: ULONG,
368    pvEngineData: *mut c_void,
369    pPhrase: *mut ISpPhraseBuilder,
370    aPhraseAlts: *mut SPPHRASEALT,
371    ulNumAlts: ULONG,
372}}
373ENUM!{enum SPWORDINFOOPT {
374    SPWIO_NONE = 0,
375    SPWIO_WANT_TEXT = 1,
376}}
377ENUM!{enum SPRULEINFOOPT {
378    SPRIO_NONE = 0,
379}}
380STRUCT!{struct SPPARSEINFO {
381    cbSize: ULONG,
382    hRule: SPRULEHANDLE,
383    ullAudioStreamPosition: ULONGLONG,
384    ulAudioSize: ULONG,
385    cTransitions: ULONG,
386    pPath: *mut SPPATHENTRY,
387    SREngineID: GUID,
388    ulSREnginePrivateDataSize: ULONG,
389    pSREnginePrivateData: *const BYTE,
390    fHypothesis: BOOL,
391}}
392RIDL!{#[uuid(0x3b414aec, 0x720c, 0x4883, 0xb9, 0xef, 0x17, 0x8c, 0xd3, 0x94, 0xfb, 0x3a)]
393interface ISpSREngineSite(ISpSREngineSiteVtbl): IUnknown(IUnknownVtbl) {
394    fn Read(
395        pv: *mut c_void,
396        cb: ULONG,
397        pcbRead: *mut ULONG,
398    ) -> HRESULT,
399    fn DataAvailable(
400        pcb: *mut ULONG,
401    ) -> HRESULT,
402    fn SetBufferNotifySize(
403        cbSize: ULONG,
404    ) -> HRESULT,
405    fn ParseFromTransitions(
406        pParseInfo: *const SPPARSEINFO,
407        ppNewPhrase: *mut *mut ISpPhraseBuilder,
408    ) -> HRESULT,
409    fn Recognition(
410        pResultInfo: *const SPRECORESULTINFO,
411    ) -> HRESULT,
412    fn AddEvent(
413        pEvent: *const SPEVENT,
414        hSAPIRecoContext: SPRECOCONTEXTHANDLE,
415    ) -> HRESULT,
416    fn Synchronize(
417        ullProcessedThruPos: ULONGLONG,
418    ) -> HRESULT,
419    fn GetWordInfo(
420        pWordEntry: *mut SPWORDENTRY,
421        Options: SPWORDINFOOPT,
422    ) -> HRESULT,
423    fn SetWordClientContext(
424        hWord: SPWORDHANDLE,
425        pvClientContext: *mut c_void,
426    ) -> HRESULT,
427    fn GetRuleInfo(
428        pRuleEntry: *mut SPRULEENTRY,
429        Options: SPRULEINFOOPT,
430    ) -> HRESULT,
431    fn SetRuleClientContext(
432        hRule: SPRULEHANDLE,
433        pvClientContext: *mut c_void,
434    ) -> HRESULT,
435    fn GetStateInfo(
436        hState: SPSTATEHANDLE,
437        pStateInfo: *mut SPSTATEINFO,
438    ) -> HRESULT,
439    fn GetResource(
440        hRule: SPRULEHANDLE,
441        pszResourceName: LPCWSTR,
442        ppCoMemResource: *mut LPWSTR,
443    ) -> HRESULT,
444    fn GetTransitionProperty(
445        ID: SPTRANSITIONID,
446        ppCoMemProperty: *mut *mut SPTRANSITIONPROPERTY,
447    ) -> HRESULT,
448    fn IsAlternate(
449        hRule: SPRULEHANDLE,
450        hAltRule: SPRULEHANDLE,
451    ) -> HRESULT,
452    fn GetMaxAlternates(
453        hRule: SPRULEHANDLE,
454        pulNumAlts: *mut ULONG,
455    ) -> HRESULT,
456    fn GetContextMaxAlternates(
457        hContext: SPRECOCONTEXTHANDLE,
458        pulNumAlts: *mut ULONG,
459    ) -> HRESULT,
460    fn UpdateRecoPos(
461        ullCurrentRecoPos: ULONGLONG,
462    ) -> HRESULT,
463}}
464ENUM!{enum SPPROPSRC {
465    SPPROPSRC_RECO_INST,
466    SPPROPSRC_RECO_CTX,
467    SPPROPSRC_RECO_GRAMMAR,
468}}
469RIDL!{#[uuid(0x2f472991, 0x854b, 0x4465, 0xb6, 0x13, 0xfb, 0xaf, 0xb3, 0xad, 0x8e, 0xd8)]
470interface ISpSREngine(ISpSREngineVtbl): IUnknown(IUnknownVtbl) {
471    fn SetSite(
472        pSite: *mut ISpSREngineSite,
473    ) -> HRESULT,
474    fn GetInputAudioFormat(
475        pguidSourceFormatId: *const GUID,
476        pSourceWaveFormatEx: *const WAVEFORMATEX,
477        pguidDesiredFormatId: *mut GUID,
478        ppCoMemDesiredWaveFormatEx: *mut WAVEFORMATEX,
479    ) -> HRESULT,
480    fn RecognizeStream(
481        rguidFmtId: REFGUID,
482        pWaveFormatEx: *const WAVEFORMATEX,
483        hRequestSync: HANDLE,
484        hDataAvailable: HANDLE,
485        hExit: HANDLE,
486        fNewAudioStream: BOOL,
487        fRealTimeAudio: BOOL,
488        pAudioObjectToken: *mut ISpObjectToken,
489    ) -> HRESULT,
490    fn SetRecoProfile(
491        pProfile: *mut ISpObjectToken,
492    ) -> HRESULT,
493    fn OnCreateGrammar(
494        pvEngineRecoContext: *mut c_void,
495        hSAPIGrammar: SPGRAMMARHANDLE,
496        ppvEngineGrammarContext: *mut *mut c_void,
497    ) -> HRESULT,
498    fn OnDeleteGrammar(
499        pvEngineGrammar: *mut c_void,
500    ) -> HRESULT,
501    fn LoadProprietaryGrammar(
502        pvEngineGrammar: *mut c_void,
503        rguidParam: REFGUID,
504        pszStringParam: LPCWSTR,
505        pvDataParam: *const c_void,
506        ulDataSize: ULONG,
507        Options: SPLOADOPTIONS,
508    ) -> HRESULT,
509    fn UnloadProprietaryGrammar(
510        pvEngineGrammar: *mut c_void,
511    ) -> HRESULT,
512    fn SetProprietaryRuleState(
513        pvEngineGrammar: *mut c_void,
514        pszName: LPCWSTR,
515        pReserved: *mut c_void,
516        NewState: SPRULESTATE,
517        pcRulesChanged: *mut ULONG,
518    ) -> HRESULT,
519    fn SetProprietaryRuleIdState(
520        pvEngineGrammar: *mut c_void,
521        dwRuleId: DWORD,
522        NewState: SPRULESTATE,
523    ) -> HRESULT,
524    fn LoadSLM(
525        pvEngineGrammar: *mut c_void,
526        pszTopicName: LPCWSTR,
527    ) -> HRESULT,
528    fn UnloadSLM(
529        pvEngineGrammar: *mut c_void,
530    ) -> HRESULT,
531    fn SetSLMState(
532        pvEngineGrammar: *mut c_void,
533        NewState: SPRULESTATE,
534    ) -> HRESULT,
535    fn SetWordSequenceData(
536        pvEngineGrammar: *mut c_void,
537        pText: *const WCHAR,
538        cchText: ULONG,
539        pInfo: *const SPTEXTSELECTIONINFO,
540    ) -> HRESULT,
541    fn SetTextSelection(
542        pvEngineGrammar: *mut c_void,
543        pInfo: *const SPTEXTSELECTIONINFO,
544    ) -> HRESULT,
545    fn IsPronounceable(
546        pvEngineGrammar: *mut c_void,
547        pszWord: LPCWSTR,
548        pWordPronounceable: *mut SPWORDPRONOUNCEABLE,
549    ) -> HRESULT,
550    fn OnCreateRecoContext(
551        hSAPIRecoContext: SPRECOCONTEXTHANDLE,
552        ppvEngineContext: *mut *mut c_void,
553    ) -> HRESULT,
554    fn OnDeleteRecoContext(
555        pvEngineContext: *mut c_void,
556    ) -> HRESULT,
557    fn OnPrivateCall(
558        pvEngineContext: *mut c_void,
559        pCallFrame: PVOID,
560        ulCallFrameSize: ULONG,
561    ) -> HRESULT,
562    fn SetAdaptationData(
563        pvEngineContext: *mut c_void,
564        pAdaptationData: *const WCHAR,
565        cch: ULONG,
566    ) -> HRESULT,
567    fn SetPropertyNum(
568        eSrc: SPPROPSRC,
569        pvSrcObj: *mut c_void,
570        pName: *const WCHAR,
571        lValue: LONG,
572    ) -> HRESULT,
573    fn GetPropertyNum(
574        eSrc: SPPROPSRC,
575        pvSrcObj: *mut c_void,
576        pName: *const WCHAR,
577        lValue: *mut LONG,
578    ) -> HRESULT,
579    fn SetPropertyString(
580        eSrc: SPPROPSRC,
581        pvSrcObj: *mut c_void,
582        pName: LPCWSTR,
583        pValue: LPCWSTR,
584    ) -> HRESULT,
585    fn GetPropertyString(
586        eSrc: SPPROPSRC,
587        pvSrcObj: *mut c_void,
588        pName: LPCWSTR,
589        ppCoMemValue: *mut LPWSTR,
590    ) -> HRESULT,
591    fn SetGrammarState(
592        pvEngineGrammar: *mut c_void,
593        eGrammarState: SPGRAMMARSTATE,
594    ) -> HRESULT,
595    fn WordNotify(
596        Action: SPCFGNOTIFY,
597        cWords: ULONG,
598        pWords: *const SPWORDENTRY,
599    ) -> HRESULT,
600    fn RuleNotify(
601        Action: SPCFGNOTIFY,
602        cRules: ULONG,
603        pRules: *const SPRULEENTRY,
604    ) -> HRESULT,
605    fn PrivateCallEx(
606        pvEngineContext: *mut c_void,
607        pInCallFrame: *const c_void,
608        ulInCallFrameSize: ULONG,
609        ppvCoMemResponse: *mut *mut c_void,
610        pulResponseSize: *mut ULONG,
611    ) -> HRESULT,
612    fn SetContextState(
613        pvEngineContext: *mut c_void,
614        eContextState: SPCONTEXTSTATE,
615    ) -> HRESULT,
616}}
617STRUCT!{struct SPPHRASEALTREQUEST {
618    ulStartElement: ULONG,
619    cElements: ULONG,
620    ulRequestAltCount: ULONG,
621    pvResultExtra: *mut c_void,
622    cbResultExtra: ULONG,
623    pPhrase: *mut ISpPhrase,
624    pRecoContext: *mut ISpRecoContext,
625}}
626RIDL!{#[uuid(0x8e7c791e, 0x4467, 0x11d3, 0x97, 0x23, 0x00, 0xc0, 0x4f, 0x72, 0xdb, 0x08)]
627interface _ISpPrivateEngineCall(_ISpPrivateEngineCallVtbl): IUnknown(IUnknownVtbl) {
628    fn CallEngine(
629        pCallFrame: *mut c_void,
630        ulCallFrameSize: ULONG,
631    ) -> HRESULT,
632    fn CallEngineEx(
633        pInFrame: *const c_void,
634        ulInFrameSize: ULONG,
635        ppCoMemOutFrame: *mut *mut c_void,
636        pulOutFrameSize: *mut ULONG,
637    ) -> HRESULT,
638}}
639extern {
640    pub static LIBID_SpeechDDKLib: IID;
641    pub static CLSID_SpDataKey: CLSID;
642}
643RIDL!{#[uuid(0xd9f6ee60, 0x58c9, 0x458b, 0x88, 0xe1, 0x2f, 0x90, 0x8f, 0xd7, 0xf8, 0x7c)]
644class SpDataKey;}
645extern {
646    pub static CLSID_SpObjectTokenEnum: CLSID;
647    pub static CLSID_SpPhraseBuilder: CLSID;
648    pub static CLSID_SpITNProcessor: CLSID;
649    pub static CLSID_SpGrammarCompiler: CLSID;
650    pub static CLSID_SpGramCompBackend: CLSID;
651}