3

タイムアウト間隔で特定のタイプのデータについてデータベースをチェックする必要があるスレッドを作成したアプリケーションがあります。スレッドは、データベース接続の作成、クエリ、および接続のクローズを完全に担当します。CoInitialize 呼び出しをスレッド実行で 1 回だけ行い、その後の使用のために Ado 接続と Ado クエリを再利用しました。

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

前もって感謝します

4

1 に答える 1

5

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

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

于 2012-04-05T12:54:31.327 に答える