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.