現在TAPIを使用したプログラムを作成中ですが、その際に問題になっていること
がありまして、発言させてもらいます。
環境 Windows XP VC++6.0 SP5.0
MSDNライブラリ等を参考にしTAPIをしようしたプログラムを作成しております。
その際に、lineOpenした後にlineMakeCall関数を呼び、その返値が返ったのを
確認しコールバック関数によってLINE_REPLYメッセージを待っているのですが
、この時にLINEERR_RESOURCEUNAVAILが返されてしまいます。
しかし、lineMakeCall関数でブレークポイントを置き若干間を与えると、その様な
ことがなくなります。
このような現象が起こるのは何故だか検討がつきませんので、どなたかご教授
していただけないでしょうか?
宜しくお願いします。
#TAPIなんて全然使ったことないのだが
スレッドがいっぱい走ってるアプリをデバッグすると、よく
そのような不可解な現象が起きます。スレッドが実行・終了
するタイミング(順番)がずれるらしいです。
K.Tさんの場合、lineOpen関数の後にlineMakeCall関数をCallする
タイミングが早すぎたので最初のエラーが出たのでしょう。
で、lineMakeCall内にブレークポイントをかけると、lineOpen関数によって
起動された何らかのスレッドが終了したタイミング(この時はデバイスの
オープンが成功している)でlineMakeCall内のブレークが発動されるの
ではないでしょうか。
ボコノン教徒さん、レスありがとうございます。
私もそのように感じ、Sleep文やら、空のループやらを回して
対処できるかと思ったのですが駄目でした。
なんだか、TAPIっていろいろと難しいです。
他に解決策ありましたら教えてください。
私もTAPIは使ったことがありませんが、スレッド間で同期をとり
たいのであれば、クリティカルセクションやイベントを利用すれ
ばよいと思います。
以下のような感じで同期をとっているのですが・・・。
WaitForReplyではコールバック関数のLINE_REPLY待ちの処理を行ない
そのLINE_REPLYの詳しい内容が返値として返されます。
この返値にLINEERR_RESOURCEUNAVAILが返され困っています。
do
{
nReturn = WaitForReply( ::lineMakeCall( m_hLine,
_hCall,
lpszAddress,
0,
lpCallParams
),NULL);
if( nReturn == WAITERR_WAITABORTED )
{
TRACE( While Dialing, WaitForReply aborted.\n );
goto errExit;
}
if( HandleLineErr( nReturn ))
{
continue;
}
else
{
TRACE( lineMakeCall unhandled error\n );
goto errExit;
}
} while( nReturn != SUCCESS );
あまり、参考文献もないし・・・・。
どなたか、教えてください。
度々もうしわけありません。
内蔵モデムやカードモデムなどには、それぞれCOM番号が割り振られて
いますが、そのCOM番号を使用しCOMポートハンドルを取得し、そし
て実際にATコマンドをWriteFileでモデムに対して送ることで
電話をかけたり、その後データ通信を行ったりしようとした場合のことで
すが、内蔵モデムやカードモデムなどのCOM番号を知ったからといって
COMポートハンドルが取得できない場合などはありますか?
実際に、どのアプリでもモデムは使用していないのにCreateFile
でモデムに割り振られたCOMポートハンドルが取得できない場合がある
のですが・・・・。