从 C# 程序开始的 MFC dll 中的访问冲突(用 C++/CLI 包装) [英] Access violation in MFC dll (wrapped in C++/CLI) started from C# program
问题描述
我为 mfc dll (C++) 编写了一个托管的 C++/CLI 包装器,并且在第二次调用 dll 后出现了一些访问冲突!
I have written an managed C++/CLI wrapper for mfc dll (C++) and have some access violations after second call of dll!
包装
// 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);
}
}
原生 MFC 类
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 构造器中.对象只会被赋值!
in ReaderCommunication and CSmartMaskCmds constr. the object will only assigned!
在 C# 程序的第一次运行时(加载带有添加引用的包装器)一切正常,但是当我再次启动它时,我得到:
At first runtime of the C# program (loaded the wrapper with add reference) everything works fine, but when I start it again I get:
TestKeyManagerApp.exe 中 0x76f85b57 处的第一次机会异常:0xC0000005:访问冲突读取位置 0xdddddddd.TestKeyManagerApp.exe 中 0x75169617 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0024e820 处的 CMemoryException..
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..
当我调用 m_log = new Logging(loggingFilePath)
when I call m_log = new Logging(loggingFilePath)
似乎析构函数不起作用!?
It seems the destructor does not work right!?
有什么想法吗!!??
谢谢!
推荐答案
当你看到值 0xdddddddd
时,表示 某些指针被删除(VC 将在调试版本中设置该值以帮助您识别这些情况).你没有告诉我们 loggingFilePath
是什么以及 Logging
是如何实现的,但我的猜测是 loggingFilePath
在某个时候被删除了,而 Logging
尝试在构造函数(或初始化列表)中访问其值或虚函数.
When you see the value 0xdddddddd
, it means that some pointer was deleted (VC will set that value on debug builds to help you recognize these cases). You don't tell us what's loggingFilePath
and how Logging
is implemented, but my guess is that loggingFilePath
is deleted at some point, and Logging
tries to access its value or a virtual function in the constructor (or initialization list).
这也可以解释析构函数中的崩溃 - 您正在删除 m_log
,它可能持有从 loggingFilePath
获得的非法指针.当您再次尝试使用它时,您会遇到同样的崩溃.
This could also explain the crash in the destructor - you're deleting m_log
, which probably holds an illegal pointer it got from loggingFilePath
. When you try to use it again, you get the same crash.
这篇关于从 C# 程序开始的 MFC dll 中的访问冲突(用 C++/CLI 包装)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!