SAPI5をBorland C++ Compilerで使う

bccでSAPI5を使うにはbccSDKを使うのが簡単です。注意点はspdebug.hで発生する多重定義エラーの処理とSetNotifyWindowMessageなどいくつかの場所で巧く動作しない点です。

多重定義エラーはヘッダーの一番上の
#pragma onceをコメントアウトして
#ifndef SPDebug_h
#define SPDebug_h
//...
#endifと置き換えます。

Notifyでエラーが出る場合はWaitUntilDoneとタイマーを使って対処します。
BCCではSAPI5は向いてないのかもしれません。

2010.7.19
試行錯誤すること2年9ヶ月、bcc でも SAPI5 が使えることがわかりました。(´・ω;`)
SetIntarest や SetNotifyWindowMessage には問題がありませんでした。
SPFEI というマクロに問題がありました。
なぜ発見できたかというと SetInterest で例外を捕らえることができるのがわかったからです。
以下が BCC で例外が発生するコードです。

//これならいける! ULONGLONG ev = SPFEI_ALL_EVENTS
ULONGLONG ev = SPFEI(SPEI_END_INPUT_STREAM) | SPFEI(SPEI_WORD_BOUNDARY);
try {
_com_util::CheckError(m_cpVoice->SetInterest(ev, ev));
}
catch (_com_error &err) {
// ここで「パラメータが間違っています。」と例外がでるので
// sapi.h に定義されている SPFEI を調べると下にあるコードが見つかります。
MB(err.ErrorMessage());
}

 

enum SPEVENTENUM
{ SPEI_UNDEFINED = 0,
SPEI_START_INPUT_STREAM = 1,
SPEI_END_INPUT_STREAM = 2,
SPEI_VOICE_CHANGE = 3,
SPEI_TTS_BOOKMARK = 4,
SPEI_WORD_BOUNDARY = 5,
SPEI_PHONEME = 6,
SPEI_SENTENCE_BOUNDARY = 7,
SPEI_VISEME = 8,
SPEI_TTS_AUDIO_LEVEL = 9,
....
SPEI_RESERVED1 = 30,
SPEI_RESERVED2 = 33,
SPEI_RESERVED3 = 63
} SPEVENTENUM;

#define SPFEI_FLAGCHECK ( (1ui64 << SPEI_RESERVED1) | (1ui64 << SPEI_RESERVED2) )
#define SPFEI_ALL_TTS_EVENTS (0x000000000000FFFEui64 | SPFEI_FLAGCHECK)
#define SPFEI_ALL_SR_EVENTS (0x001FFFFC00000000ui64 | SPFEI_FLAGCHECK)
#define SPFEI_ALL_EVENTS 0xEFFFFFFFFFFFFFFFui64
#define SPFEI(SPEI_ord) ((1ui64 << SPEI_ord) | SPFEI_FLAGCHECK)

 
どこに問題があるかわかりますか?
問題は (1ui64 << SPEI_RESERVED2) などにありました。
VC++ では大丈夫ですが、BCC ではこの記述だと32ビットを超えた値が無効になってしまうようなのです。
ちなみにコンパイラは警告を出しませんでした。
変わりに、このように対処したらうまくいきました。
ULONGLONG ev = 0x0000000200000000ui64 | SPFEI(SPEI_END_INPUT_STREAM) | SPFEI(SPEI_WORD_BOUNDARY);

現在は VC++ でコンパイルしているので、もう関係ないのですが。。。


コメントの投稿

非公開コメント

リンク
(*´∀`)ノ (´・ω・`)

最近の記事
最近のコメント
ブログ内検索
RSSフィード
カテゴリー
月別アーカイブ
メールフォーム

Name:
Mail:
Title:
Message:

FC2カウンター