我正在使用ATL通过OLEDB与SQL数据库进行通信。
我的问题是,如果我之前已调用CCommand::Close
或Open
析构函数是否清理,是否必须明确调用CCommand
。
我有一种感觉,我必须打电话给Close
,但如果我不必这样做会很好!
感谢。
答案 0 :(得分:1)
请参阅我对丹尼尔回答的评论。析构函数清理它,你不必担心。 MSDN代码段将在CoUninitialize
之后调用析构函数,这是他们在关闭COM之前为了释放接口而执行显式ReleaseCommand
的唯一原因。
他们可以这样做:
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
的析构函数可以完成所有操作。
答案 1 :(得分:0)
您需要按照MSDN中的说明同时拨打Close
和ReleaseCommand
。