ISpRecoGrammar::LoadCmdFromMemory (SAPI 5.3)

Speech API 5.3
Microsoft Speech API 5.3


ISpRecoGrammar::LoadCmdFromMemory loads a compiled CFG binary from memory.

HRESULT LoadCmdFromMemory(
   const SPBINARYGRAMMAR   *pBinaryData,
   SPLOADOPTIONS            Options


[in] The serialized header buffer of type SPBINARYGRAMMAR.
[in] Flag of type SPLOADOPTIONS indicating whether the file should be loaded statically or dynamically.


When an application calls ::LoadCmdFromMemory, the currently loaded CFG or proprietary grammar will be unloaded.

Return values

S_OKFunction completed successfully.
E_INVALIDARGEither pBinaryData or one of its members is invalid or bad. It may also indicate pBinaryData->FormatId is not SPGDF_ContextFree. Alternatively, Options is neither SPLO_STATIC nor SPLO_DYNAMIC.
FAILED(hr)Appropriate error message.


The following code snippet illustrates how to use ISpRecoGrammar::LoadCmdFromMemory to serialize the CFG from one SpRecoGrammar object and deserialize it into another SpRecoGrammar object.

// Declare local identifiers:
HRESULT                      hr = S_OK;
CComPtr<ISpRecoGrammar>      cpRecoGrammar;
CComPtr<ISpRecoGrammar>      cpReloadedGrammar;
CComPtr<ISpRecoContext>      cpRecoContext;
CComPtr<IStream>             cpHStream;
HGLOBAL                      hGrammar;

// Build and use a SpRecoGrammar object...

// Create a Win32 global stream.
hr = ::CreateStreamOnHGlobal(NULL, true, &cpHStream;);

if (SUCCEEDED(hr))
   // Save the current grammar to the global stream.
   hr = cpRecoGrammar->SaveCmd(cpHStream, NULL);

if (SUCCEEDED(hr))
   // Create the second grammar to deserialize into.
   hr = cpRecoContext->CreateGrammar(0, &cpReloadedGrammar;);

if (SUCCEEDED(hr))
   // Get a handle to the stream with the serialized grammar.
   ::GetHGlobalFromStream(cpHStream, &hGrammar;);

// Deserialize the CFG into a new grammar object.
hr = cpReloadedGrammar->LoadCmdFromMemory((SPBINARYGRAMMAR *)::GlobalLock(hGrammar), SPLO_DYNAMIC);

if (SUCCEEDED(hr))
   // Do stuff here.