ATL CCommand Закрыть на уничтожение - PullRequest
0 голосов
/ 19 января 2012

Я использую ATL для связи с базой данных SQL через OLEDB.

Мой вопрос заключается в том, должен ли я явно вызывать CCommand::Close, если я ранее вызывал Open, или деструктор CCommand очистит.

У меня такое чувство, что я должен позвонить Close, но было бы неплохо, если бы мне не пришлось!

Спасибо.

Ответы [ 2 ]

1 голос
/ 20 января 2012

Смотрите мой комментарий к ответу Даниила. Деструктор убирает это, и вам не о чем беспокоиться. Во фрагменте кода 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 делает все это.

0 голосов
/ 19 января 2012

Вам необходимо позвонить как Close, так и ReleaseCommand, как описано в MSDN .

...