Нарушение прав доступа в dll MFC (в C ++ / CLI) запущено из программы на C # - PullRequest
1 голос
/ 14 июля 2011

Я написал управляемую оболочку C ++ / CLI для mfc dll (C ++) и имею некоторые нарушения прав доступа после второго вызова dll!

Wrapper

// 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;   
}

в ReaderCommunication и CSmartMaskCmds constr.объект будет только назначен!

При первом запуске программы на C # (загрузил обертку со ссылкой add) все работает нормально, но при повторном запуске я получаю:

Исключение первого шансав 0x76f85b57 в TestKeyManagerApp.exe: 0xC0000005: расположение чтения нарушения доступа 0xdddddddd.Исключение первого шанса в 0x75169617 в TestKeyManagerApp.exe: Microsoft C ++ исключение: CMemoryException в ячейке памяти 0x0024e820 ..

при вызове m_log = new Logging (loggingFilePath)

Кажется, деструктор неработать правильно!?

Есть идеи !! ??

Спасибо!

Ответы [ 2 ]

2 голосов
/ 18 июля 2011

Когда вы видите значение 0xdddddddd, это означает, что некоторый указатель был удален (VC установит это значение в отладочных сборках, чтобы помочь вам распознать эти случаи).Вы не говорите нам, что такое loggingFilePath и как реализовано Logging, но я предполагаю, что loggingFilePath удаляется в какой-то момент, и Logging пытается получить доступ к его значению или виртуальной функции в конструкторе (илисписок инициализации).

Это также может объяснить сбой в деструкторе - вы удаляете m_log, который, вероятно, содержит недопустимый указатель, полученный из loggingFilePath.Когда вы попытаетесь использовать его снова, вы получите тот же сбой.

0 голосов
/ 16 июля 2011

когда я вызываю m_log = new Logging (loggingFilePath)

Что происходит за кулисами?Узнайте, где именно он падает.Включите неуправляемую отладку, если вы используете C #.Я думаю, проблема в конструкторе Logging.

...