c# dll mfc c++-cli access-violation

Infracción de acceso en dll de MFC(incluido en C++/CLI) iniciado desde el programa C#



c++-cli access-violation (2)

cuando llamo m_log = new Logging (loggingFilePath)

¿Qué está pasando detrás de escena? Descubra dónde exactamente se bloquea. Habilite la depuración no administrada si está usando C #. Supongo que el problema está en el constructor de Logging .

¡He escrito un contenedor administrado de C ++ / CLI para mfc dll (C ++) y tengo algunas violaciones de acceso después de la segunda llamada de dll!

Envoltura

// in .h typedef CKeyManagerServerApp* (*KeyManagerInstance)(CCommonUtils *); ManagedKeyInterface::ManagedKeyInterface() { HINSTANCE m_keyManagerLib = LoadLibrary("pathToDll"); KeyManagerInstance _createInstance = (KeyManagerInstance)GetProcAddress(m_keyManagerLib, "GetInstance"); // get native reader interface from managed reader interface CCommonUtils *nativeReaderInterface = static_cast<CCommonUtils*>(readerInterface->nativeReaderInterface.ToPointer()); CKeyManagerServerApp *m_keyManagerApp = (_createInstance)(nativeReaderInterface ); } ManagedKeyInterface::~ManagedKeyInterface() { try { DestroyKeyManagerInstance _destroyInstance = (DestroyKeyManagerInstance)GetProcAddress(m_keyManagerLib, "DestroyInstance"); (_destroyInstance)(m_keyManagerApp); FreeLibrary(m_keyManagerLib); } catch(System::Exception ^e) { FreeLibrary(m_keyManagerLib); } }

NATIVE MFC CLASS

extern "C" _declspec(dllexport) CKeyManagerServerApp* GetInstance(CCommonUtils *readerInterface) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); return new CKeyManagerServerApp(readerInterface); } extern "C" _declspec(dllexport) void DestroyInstance(CKeyManagerServerApp *ptr) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); delete ptr; } // constructor CKeyManagerServerApp::CKeyManagerServerApp(CCommonUtils *readerInterface) { m_log = new Logging(loggingFilePath); // <--- ERROR at second call // reader interface object for communication m_readerComm = new ReaderCommunication(readerInterface, m_log); m_smartmaskcmds = new CSmartMaskCmds(m_readerComm, m_log); readerInterface = NULL; } // destructor CKeyManagerServerApp::~CKeyManagerServerApp() { // destruct objects delete m_smartmaskcmds; delete m_readerComm; delete m_log; }

en ReaderCommunication y CSmartMaskCmds constr. el objeto solo será asignado!

En el primer tiempo de ejecución del programa C # (cargado el contenedor con la referencia de agregar) todo funciona bien, pero cuando lo inicio de nuevo obtengo:

Excepción de primera oportunidad en 0x76f85b57 en TestKeyManagerApp.exe: 0xC0000005: ubicación de lectura de violación de acceso 0xdddddddd. Primera excepción de oportunidad en 0x75169617 en TestKeyManagerApp.exe: excepción de Microsoft C ++: CMemoryException en la ubicación de memoria 0x0024e820.

cuando llamo m_log = new Logging (loggingFilePath)

¡Parece que el destructor no funciona bien !?

¿¿¡¡Algunas ideas!!??

¡Gracias!


Cuando vea el valor 0xdddddddd , significa que se eliminó algún puntero (VC establecerá ese valor en las compilaciones de depuración para ayudarlo a reconocer estos casos). No nos dice qué es loggingFilePath y cómo se implementa Logging , pero supongo que loggingFilePath se elimina en algún momento, y Logging intenta acceder a su valor o a una función virtual en el constructor (o en la lista de inicialización).

Esto también podría explicar el bloqueo en el destructor: está eliminando m_log , que probablemente contiene un puntero ilegal que obtuvo de loggingFilePath . Cuando intenta usarlo de nuevo, obtiene el mismo bloqueo.