gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:01 26 4
gpt4 key购买 nike

我在 Visual Studio 2005 中有一个 C++ COM dll,它使用 SQL Server (v2000) 驱动程序连接到数据库 (SQL Server 2005)。我们的数据库团队最近委托(delegate)我们将 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 就此进行合作,但我们的时间不多了。任何帮助或想法将不胜感激!

谢谢,

最佳答案

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

SQLFreeHandle Deadlock Issue?

关于c++ - regsvr32 导致 CDatabase destrucor 在使用 SQL Native Client (v2005) 时挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10031000/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com