I have written an managed C++/CLI wrapper for mfc dll (C++) and have some access violations after second call of 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;
}
in ReaderCommunication and CSmartMaskCmds constr. the object will only assigned!
At first runtime of the C# program (loaded the wrapper with add reference) everything works fine, but when I start it again I get:
First-chance exception at 0x76f85b57 in TestKeyManagerApp.exe: 0xC0000005: Access violation reading location 0xdddddddd. First-chance exception at 0x75169617 in TestKeyManagerApp.exe: Microsoft C++ exception: CMemoryException at memory location 0x0024e820..
when I call m_log = new Logging(loggingFilePath)
It seems the destructor does not work right!?
Any ideas!!??
Thank you!