繁体   English   中英

regsvr32 导致 CDatabase destrucor 在使用 SQL Native Client (v2005) 时挂起

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

我在 Visual Studio 2005 中有一个 C++ COM dll,它使用 SQL 服务器 (v2000) 驱动程序连接到数据库 (SQL Server 2005)。 我们的数据库团队最近委托我们将 SQL 服务器驱动程序从 SQL 服务器 (v2000) 升级到 SQL 本机客户端 (v2005) 或 SQL 服务器本机客户端 10.0 (v2007)。

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

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

AFX_SQL_SYNC(::SQLFreeConnect(m_hdbc));

正是在这个调用中,执行不返回。 调试器返回到 (Running) state 并且没有任何返回。 当我尝试执行 Debug -> Break All 时,我收到一条消息,指出没有正在运行的线程并且进程可能已死锁。

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

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

谢谢,

下面链接中的人似乎已经通过在他的主应用程序中动态加载 ODBC dll 来解决它,而不仅仅是在 DLL 中。这是否适用于您的情况?

SQLFreeHandle 死锁问题?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM