2012-04-05 10 views
2

私はタイムアウト間隔のための特定の種類のデータのデータベースをチェックする必要があるスレッドを作成したアプリケーションがあります。スレッドは、データベース接続の作成、問合せおよび接続のクローズを完全に担当します。スレッド実行中にCoInitializeコールを1回だけ作成し、その後の使用のためにAdo接続とAdoクエリを再利用しました。複数のコールを初期化してアプリケーションをクラッシュさせることはできますか?

今私の質問は、データベースデータチェックのループにCoUnitializeステートメントを置いていた(おそらく誤っていた)ことです。つまり、CoUnitializeの呼び出しは毎回実行されました。アプリケーションがクラッシュしなかった理由は何ですか?リリースするデータがないため、CoUnitializeは失敗しているはずです。私はこれに疑問がある。事前に

おかげ

+0

APIを誤って使用した場合のAPIの動作について、かなり難しいです。 'CoUninitialize'は失敗を報告するメカニズムがないので、実際には失敗することはありません。なぜあなたのアプリはクラッシュしなかったのですか?おそらく 'CoUninitialize'はこの誤用に対して堅牢です。何に関係なく、あなたのアプリを修正して移動してください。 –

+0

同じ質問がありました。私は、アプリケーションをフリーズしてCoInitializeするための2回目の呼び出しがあるときに、私のアプリケーションの1つです。 –

+0

私は実際にやった。今私は私のスレッドが終了したときにのみcounitialize呼び出しを持っています。これにより、(Coinit - coUninit)のペアが1つだけ確保されます。 – CyprUS

答えて

4

CoUninitializeは何も取らないし、何も返さないWINAPI関数です。これらのWINAPI関数は決して例外(AFAIK)をスローしないので、アプリケーションを呼び出すことによってアプリケーションがクラッシュすることはありません。 CoUnitializeは、何度も呼び出されるとただ静かに失敗します。

初期化されたCOMが必要なコードが呼び出されたときに、アプリケーションがクラッシュする可能性があります。あなたのアプリケーションがクラッシュしないということは、コードにはCoInitialize、またはCoInitializeという別の場所が呼び出される必要がないことが2つあります。おそらくADOライブラリにあります。

関連する問題