ATL CCommand在销毁时关闭

ATL CCommand Close on destruction

本文关键字:CCommand ATL      更新时间:2023-10-16

我使用ATL通过OLEDB与SQL数据库通信。

我的问题是,如果我以前调用过Open,我是否必须显式调用CCommand::Close,或者CCommand析构函数是否会清理。

我有一种感觉,我必须打电话给Close,但如果我不必打,那就太好了!

谢谢。

请参阅我对Daniel回答的评论。Destructor会把它清理干净,你不必担心。MSDN代码片段将在CoUninitialize之后调用析构函数,这是他们执行显式ReleaseCommand以便在关闭COM之前释放接口的唯一原因。

他们可以这样做:

CoInitialize(...);
{
  CCustomer rs; 
  // ...
  // rs.ReleaseCommand() <<-- Not needed
  // rs.Close() <<-- Not needed
}
// NOTE: ~CCustomer already worked, it is safe to shut COM down
CoUninitialize();

为什么?ATL的atldbcli.h:

~CAccessorRowset()
{
    Close();
}
// ...
~CCommandBase()
{
    ReleaseCommand();
}
// ...
class CCommand :
    public CAccessorRowset<TAccessor, TRowset>,
    public CCommandBase,
    public TMultiple

所以CCommand的析构函数完成了这一切。

您需要调用MSDN中描述的CloseReleaseCommand