2

我在 Visual Studio 2005 中有一个 C++ COM dll,它使用 SQL Server (v2000) 驱动程序连接到数据库 (SQL Server 2005)。我们的 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,则应用程序工作正常。

我也在与微软合作,但我们的时间不多了。任何帮助或想法将不胜感激!

谢谢,

4

1 回答 1

0

下面链接中的人似乎通过在他的主应用程序中动态加载 ODBC dll 而不仅仅是在 DLL 中解决了这个问题。这可以以某种方式适用于您的情况吗?

SQLFreeHandle 死锁问题?

于 2012-04-05T15:32:48.647 回答