2012-01-19 41 views
0

我正在使用ATL通過OLEDB與SQL數據庫進行通信。ATL CCommand關閉銷燬

我的問題是,如果我以前撥打OpenCCommand析構函數將清理,我是否必須明確地調用CCommand::Close

我有一種感覺,我必須打電話給Close,但如果我不必這樣做,那將會很好!

謝謝。

回答

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的析構函數做這一切。

+0

感謝您的回答。這同樣適用於「關閉」嗎? – Nick

+0

是的,這同樣適用於'關閉'。它也是由析構函數自動調用的。更新了上面的答案以表明這一點。 –

+0

你能爲此提供一個資源嗎?如果是的話,我會接受你的答案! – Nick

0

您需要撥打CloseReleaseCommand,如MSDN中所述。

+0

謝謝@Daniel。我讀過,但只是想知道CCommand的析構函數是否會進行清理,特別是在引發異常的情況下。文件沒有說什麼,所以我猜不是。 – Nick

+1

是的,但請注意'〜ССommand'在後臺執行'ReleaseCommand'。析構函數清理它,如果您要重用命令實例,則只需要顯式調用。 MSDN的例子不太好,他們明確地這樣做,因爲他們必須通過他們的'CoUninitialize'完成... –