SQL Server (v2000) ドライバーを使用してデータベース (SQL Server 2005) に接続する Visual Studio 2005 の C++ COM dll があります。最近、DB チームから、SQL Server ドライバーを SQL Server (v2000) から SQL Native Client (v2005) または SQL Server Native Client 10.0 (v2007) にアップグレードするように依頼されました。
アプリケーションは問題なくビルドされます。次に、DLL で regsvr32 コマンドを実行して COM に登録しようとすると、アプリケーションがハングします。コードをデバッグすると、メイン APP (CWinApp から継承) の InitInstance で、アプリケーションがストアド プロシージャを使用して起動メッセージをデータベースに記録することがわかりました。
そのログ メッセージをデバッグすると、ストアド プロシージャを実行する CDatabase オブジェクトが作成されていることがわかります。ストアド プロシージャは正しく実行されます。メッセージはデータベースに記録され、実行は C++ コードに戻されます。次に、CDatabase オブジェクトが (CDatabase::Close() を呼び出して) 閉じられると、アプリケーションがハングします。CDatabase コードをデバッグしたところ、CDatabase::Close() で呼び出しが行われていることがわかりました。
AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));
実行が返されないのはこの呼び出しです。デバッガーは (実行中) 状態に戻り、何も戻りません。Debug -> Break All を実行しようとすると、実行中のスレッドがなく、プロセスがデッドロックしている可能性があるというメッセージが表示されます。
これは、REGSVR32 への呼び出し中にのみ発生します。また、regsvr32 部分に Sql Server ドライバーを選択した場合、それを Sql Native Client または Sql Server Native Client v10.0 に変更すると、アプリケーションは問題なく動作します。
これについても Microsoft と協力していますが、時間切れです。どんな助けや考えも大歓迎です!
ありがとう、