Исключение при создании объекта команды ADO в конце приложения

Сейчас я перемещаю большое программное обеспечение с OWL на MFC, большая часть миссии выполнена, но я сталкиваюсь с множеством проблем, подобных этой, когда приложение закрывается, возникает это исключение введите здесь описание изображения Когда я нажал кнопку "Разорвать", отладчик привел меня к этому введите здесь описание изображения это был стек вызовов

    msdart.dll!_UMSEnterCSWraper()  Unknown
    msado15.dll!ATL::AtlModuleGetClassObject(struct ATL::_ATL_MODULE *,struct _GUID const &,struct _GUID const &,void * *)  Unknown
    msado15.dll!ATL::CComModule::GetClassObject(struct _GUID const &,struct _GUID const &,void * *) Unknown
    msado15.dll!_DllGetClassObject@12() Unknown
    ole32.dll!CClassCache::CDllPathEntry::DllGetClassObject(const _GUID & rclsid, const _GUID & riid, IUnknown * * ppUnk, int fMakeValid) Line 3317 C++
    ole32.dll!CClassCache::CDllFnPtrMoniker::BindToObject(const _GUID & riid, void * * ppvResult)   C++
    ole32.dll!CClassCache::SearchForLoadedClass(const ACTIVATION_PROPERTIES & ap, CClassCache::CDllClassEntry * * ppDCE)    C++
    ole32.dll!ICoCreateInstanceEx(const _GUID & Clsid, IUnknown * punkOuter, unsigned long dwClsCtx, _COSERVERINFO * pServerInfo, unsigned long dwCount, unsigned long dwActvFlags, tagMULTI_QI * pResults, ActivationPropertiesIn * pActIn) Line 1163  C++
    ole32.dll!CComActivator::DoCreateInstance(const _GUID & Clsid, IUnknown * punkOuter, unsigned long dwClsCtx, _COSERVERINFO * pServerInfo, unsigned long dwCount, tagMULTI_QI * pResults, ActivationPropertiesIn * pActIn) Line 332  C++
    ole32.dll!CoCreateInstanceEx(const _GUID & Clsid, IUnknown * punkOuter, unsigned long dwClsCtx, _COSERVERINFO * pServerInfo, unsigned long dwCount, tagMULTI_QI * pResults) Line 157    C++
    ole32.dll!CoCreateInstance(const _GUID & rclsid, IUnknown * pUnkOuter, unsigned long dwContext, const _GUID & riid, void * * ppv) Line 110  C++
>   DBCore.dll!_com_ptr_t<_com_IIID<ADODB::_Command,&_GUID_b08400bd_f9d1_4d02_b856_71d5dba123e9> >::CreateInstance(const _GUID & rclsid, IUnknown * pOuter, unsigned long dwClsContext) Line 586    C++
    DBCore.dll!TADOCommand::Init(TADOConnection * connection) Line 32   C++
    DBCore.dll!TADOCommand::TADOCommand(TADOConnection * connection) Line 8 C++
    AmnDbase.dll!TQuery::Init() Line 335    C++
    AmnDbase.dll!TQuery::TQuery(const TDatabase * db, TTable * Tbl) Line 304    C++
    AmnDbase.dll!TDirectQuery::TDirectQuery(const TDatabase * db) Line 932  C++
    AmnDbase.dll!CommitUnsavedTransactions(TDatabase * db) Line 674 C++
    AmnDbase.dll!TDatabase::Disconnect() Line 427   C++
    AmnDbase.dll!TDatabase::CloseDb() Line 455  C++
    AmnDbase.dll!TDatabase::Close() Line 417    C++
    AmnLib2.dll!TStoreFile::Close() Line 3275   C++
    AmnLib2.dll!TStoreFile::~TStoreFile() Line 1040 C++
    AmnLib2.dll!`GetStoreFile'::`2'::`dynamic atexit destructor for 'StoreFile''()  C++
    AmnLib2.dll!_CRT_INIT(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 415    C
    AmnLib2.dll!__DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 526  C
    AmnLib2.dll!_DllMainCRTStartup(void * hDllHandle, unsigned long dwReason, void * lpreserved) Line 476   C

это код, который вызвал CreateInstance

/// Init the command instance.
void TADOCommand::Init( TADOConnection* connection)
{
    m_CmdText = "";
    m_nRecordsAffected = 0;
    m_Command = NULL;
    m_ResultSet = NULL;
    m_CmdConnection = NULL;
    m_CmdRecordset = NULL;

    if( connection->IsNull())
        return;
    m_Command.CreateInstance( __uuidof( Command));
    SetConnection( connection);
    SetCommandTimeOut( connection->GetCommandTimeout());
}   

Я хочу, чтобы код продолжал работать без каких-либо изменений кода, особенно на уровне базы данных. Это связано с вызовом couninitialize из MFC?? как я могу обнаружить это или решить эту проблему?

и m_Command был определен как

_CommandPtr m_Command;

и это com-интерфейс, сначала он устанавливается на null, затем вызывает CreateInstance, он работает нормально каждый раз, если только в последний раз он не завершается с этим исключением


person ahmedsafan86    schedule 10.11.2013    source источник
comment
Вы разыменовываете указатель NULL. Какой тип m_Command и что делает m_Command = NULL;?   -  person IInspectable    schedule 10.11.2013
comment
Я обновил вопрос, чтобы получить более подробную информацию о m_Command, и это интерфейс com, а не собственный указатель.   -  person ahmedsafan86    schedule 11.11.2013


Ответы (1)


Насколько я вижу в стеке вызовов, швы кода должны выполняться, когда ваша DLL выгружается или загружается.

Когда это «загрузка кода», возникает вопрос: почему снова загружается LDL.

Но использование COM в DllMain вообще бесполезно. См. здесь COM никогда не должен использоваться внутри кода DllMain.

Я предполагаю, что ваша DLL выгружается после того, как MFC уже называется CoUninitialize. Или ваша DLL перезагружается каким-то кодом, который не должен выполняться при закрытии вашего приложения.

person xMRi    schedule 11.11.2013
comment
Это происходит, как я уже упоминал, когда приложение прерывается, как вы видите динамический деструктор atexit. У меня есть метод, содержащий статический объект, который автоматически уничтожается, и его деструктор закроет соединение с базой данных, а перед этим сохранит последние изменения в базе данных, в в этот момент он пытается создать команду ADO, но это не удается, но я добавил новые строки кода для инициализации com в конструкторе и деинициализации com в деструкторе, но исключение все еще возникает! - person ahmedsafan86; 11.11.2013