Share via


ISpRecoContext::DeserializeResult (Windows Embedded CE 6.0)

1/6/2010

This method creates a new result from a serialized result.

Syntax

HRESULT DeserializeResult(
  const SPSERIALIZEDRESULT* pSerializedResult,
  ISpRecoResult** ppResult
);

Parameters

  • pSerializedResult
    [in] Pointer to an SPSERIALIZEDRESULT structure containing a serialized result.
  • ppResult
    [out] Address of a pointer to an object implementing ISpRecoResult that represents the unserialized result. The application must call IUnknown::Release when finished using the object.

Return Value

The following table shows the possible return values.

Value Description

S_OK

Function completed successfully.

E_INVALIDARG

pSerializedResult is invalid or bad.

E_POINTER

ppResult is invalid or bad.

E_OUTOFMEMORY

Exceeded available memory.

FAILED(hr)

Appropriate error message.

Remarks

After deserializing the ISpRecoResult object (or recognition), the application can retrieve alternates for the result, retrieve the retained audio, or examine the recognition. The SR engine originally used to generate the result object must be associated with the speech recognition context called at its ISpRecoContext::DeserializeResult method (SR engine ID defined in the SPPHRASE structure). The SR engine requirement ensures that the SR engine is capable of recognizing the original phrase, and that it understands any SR engine private result data, defined in SPPHRASE.ulSREnginePrivateDataSize.

Example

The following code snippet illustrates the use this method a previously serialized result object.

HRESULT hr = S_OK;
// ... obtain a recognition result object from the recognizer...
SPSERIALIZEDRESULT* pSerializedResult = NULL;
ULONG cbWritten = 0;
ULONG ulSerializedSize = 0;
LARGE_INTEGER liseek;
LARGE_INTEGER li;
CComPtr<IStream> cpStreamWithResult;
hr = CreateStreamOnHGlobal(NULL, true, &cpStreamWithResult);
// Check hr
// Serialize result to memory
hr = cpRecoResult->Serialize(&pSerializedResult);
// Check hr
//serialized to a stream pointer
hr = cpStreamWithResult->Write(pSerializedResult, 
             pSerializedResult->ulSerializedSize,
                                      &cbWritten);
// Check hr
// free the serialized result
if (pSerializedResult) ::CoTaskMemFree(pSerializedResult);
// commit the stream changes
hr = cpStreamWithResult->Commit(STGC_DEFAULT);
// Check hr
// ... persist stream to disk, network share, and so on...
// ... shutdown application .... 
// ... restart application and get the persisted stream
// reset the stream seek pointer to the start before deserialization
li.QuadPart = 0;
hr = cpStreamWithResult->Seek(li, STREAM_SEEK_SET, NULL);
// Check hr
// find the size of the stream
hr = cpStreamWithResult->Read(&ulSerializedSize, sizeof(ULONG), NULL);
// Check hr
// reset the seek pointer
liseek.QuadPart = 0 - sizeof(ULONG);
 hr = cpStreamWithResult->Seek(liseek, STREAM_SEEK_CUR, NULL);
// Check hr
// allocate the memory for the result
pSerializedResult = (SPSERIALIZEDRESULT*)::CoTaskMemAlloc(ulSerializedSize);
// Check pSerializedResult in case "out of memory"
// copy the stream into a serialized result object
hr = cpStreamWithResult->Read(pSerializedResult, ulSerializedSize, NULL);
// Check hr
// Deserialize result from memory
hr = cpRecoContext->DeserializeResult(pSerializedResult, &cpRecoResultNew);
// Check hr
// free the pSerializedResult memory
if (pSerializedResult) {
  CoTaskMemFree(pSerializedResult);
}
// As long as the same engine was used to generate
// the original result object, as is now being used,
// applications can now get alternates for the cpRecoResultNew's phrase

Requirements

Header sapi.h, sapi.idl
Library sapilib.lib
Windows Embedded CE Windows CE .NET 4.1 and later

See Also

Reference

ISpRecoContext
SAPI Interfaces