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


Answers

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 .

Question

¡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!