regsvr32 会导致 CDatabase destrucor 在使用 SQL Native Client (v200

regsvr32 causes CDatabase destrucor to hang when using SQL Native Client (v2005)

本文关键字:SQL Native Client v200 CDatabase destrucor regsvr32      更新时间:2023-10-16
我在Visual Studio 2005

中有一个C++COM dll,它使用SQL Server(v2000)驱动程序连接到数据库(SQL Server 2005)。我们最近接到数据库团队的任务,将 SQL Server 驱动程序从 SQL Server (v2000) 升级到 SQL Native Client (v2005) 或 SQL Server Native Client 10.0 (v2007)。

应用程序构建得很好。然后,当我去在 DLL 上执行 regsvr32 命令以将其注册为 COM 时,应用程序挂起。当我调试代码时,我发现在主应用程序(继承自 CWinApp)的 InitInstance 中,应用程序使用存储过程将启动消息记录到数据库中。

调试该日志记录消息会显示已创建执行存储过程的 CDatabase 对象。存储过程正确执行;消息被记录到数据库中,执行返回到C++代码。然后,当 CDatabase 对象关闭时(通过调用 CDatabase::Close()),应用程序挂起。我调试了 CDatabase 代码,发现在 CDatabase::Close() 中调用了

AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));

在此调用中,执行不会返回。调试器返回到"(正在运行)"状态,但不会返回任何内容。当我尝试执行调试 -> 全部中断时,我收到一条消息,指出没有正在运行的线程并且进程可能已死锁。

这仅在调用REGSVR32期间发生。如果我为 regsvr32 部分选择 Sql Server 驱动程序,然后将其更改为 Sql Native Client 或 Sql Server Native Client v10.0,则应用程序运行良好。

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

谢谢

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

SQLFreeHandle 死锁问题?