いちばん失敗した人決定戦

例外についてです

// Windows Header Files:
#include <windows.h>

// C RunTime Header Files
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <tchar.h>
#include <atlbase.h>
#include <sphelper.h>
#include<stdio.h>

int main(){
USES_CONVERSION;
HRESULT hr = S_OK;
CComPtr<ISpRecognizer> cpRecoEngine;
hr = cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);

CComPtr<ISpStream> cpInputStream;
CComPtr<ISpRecognizer> cpRecognizer;
CComPtr<ISpRecoContext> cpRecoContext;
CComPtr<ISpRecoGrammar> cpRecoGrammar;
printf("test1\n");
// Create basic SAPI stream object
// NOTE: The helper SpBindToFile can be used to perform the following operations
hr = cpInputStream.CoCreateInstance(CLSID_SpStream);
// Check hr
CSpStreamFormat sInputFormat;
// generate WaveFormatEx structure, assuming the wav format is 22kHz, 16-bit, Stereo
hr = sInputFormat.AssignFormat(SPSF_22kHz16BitStereo);
// Check hr
printf("test2\n");
// setup stream object with wav file MY_WAVE_AUDIO_FILENAME
// for read-only access, since it will only be access by the SR engine
WCHARpszSrc[] = {L"test.wav"};
hr = cpInputStream->BindToFile(pszSrc,
SPFM_OPEN_READONLY,
&sInputFormat.FormatId(),
sInputFormat.WaveFormatExPtr(),
SPFEI_ALL_EVENTS);

// Check hr
printf("test3\n");



このように音声を認識するプログラムを作っているのですが、どうしてもprintf("test2")までの出力で例外が起こってしまいます(p!=0という例外でした)。hr = cpInputStream~で例外が起こっていると思うのですが,GUIで同じ記述をしたときはうまくいきました。アドバイスをお願いします。

A 回答 (2件)

 こんにちは。



 そのエラーは、CComPtr<ISpStream>のoperator->()で内部のポインタがNULLの時に発生するものです。

 ::CoInitialize(NULL);

 を呼び出していないので、

 hr = cpRecoEngine.CoCreateInstance(CLSID_SpInprocRecognizer);

 の部分で、COMインターフェースの作成に失敗しています。
 関数の一番上で、

 ::CoInitialize(NULL);

 を呼び出し、

 関数の一番下で、

 ::CoUninitialize();

 を呼び出して下さい。此れで成功する筈です。
 CComPtr<T>はかえってややこしくなる場合があるので、あまり使用しない方が良いかもしれません。

 GUI(win32アプリケーションのプロジェクト)の方で上手くいった理由は、前もってCoInitialize()の呼び出しを行ってくれているから(多分)だと思います。
    • good
    • 0

>printf("test2")までの出力で例外が起こってしまいます(p!=0という例外でした)。


の「p」は何処から出てきた内容でしょうか?
それと、肝心の各APIの戻り値「hr」の正当性についてのチェックがありませんが、GUIでは「本当に正しく」動作していたのでしょうか?
単純に考えでも、「GUI(Win32アプリ)」と「コンソール」ではメモリ管理など様々な違いがあるので何処でおかしくなっていても不思議ではありませんよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!