如果我从常规 DLL 加载 MFC DLL,反序列化将停止工作
Posted
技术标签:
【中文标题】如果我从常规 DLL 加载 MFC DLL,反序列化将停止工作【英文标题】:Deserialization stops working if I load MFC DLL from regular DLL 【发布时间】:2012-01-24 10:37:17 【问题描述】:。
我以前一直在问这个问题,但当时我认为它很复杂,所以我没有得到任何答案来解决我的问题。 见C# .NET User Control inside native app. Resource chain problems
现在我制作了一个显示相同问题的测试应用程序。 您可以在https://skydrive.live.com/?#cid=0977B1167FE01BB3&id=977B1167FE01BB3%21105&sc=documents 找到压缩代码文件。
如果我从常规 DLL 加载 MFC 扩展 DLL,如果我直接从应用程序调用 MFC 扩展 DLL,反序列化将停止工作。
当我尝试反序列化时,我得到以下 CArchiveException “一个未命名的文件包含一个意外的对象。”
此外,当我运行 SerializeTest 的调试版本时,Visual Studio 2008 中的输出会提供以下信息:
“警告:无法从存档加载 CSerializableClass。类未定义。 CArchive 异常:badClass。 SerializeTestD.exe 中 0x7c812afb 处的第一次机会异常:Microsoft C++ 异常:内存位置 0x0012edf8 处的 CArchiveException。”
以下测试代码在CMFCDLL::DoIt中运行
void CMFCDLL::DoIt(void)
BYTE * pBuf = (BYTE *)new char [1024];
CSerializableClass *pSerializableClass = new CSerializableClass;
CMemFile mf;
mf.Attach(pBuf, 1024);
CArchive ar(&mf, CArchive::store);
ar << pSerializableClass;
ar.Close();
mf.Detach();
delete pSerializableClass;
CSerializableClass *pSerializableClass = NULL;
CMemFile mf;
mf.Attach(pBuf, 1024);
CArchive ar(&mf, CArchive::load);
try
ar >> pSerializableClass;
ar.Close();
mf.Detach();
ASSERT(pSerializableClass && pSerializableClass->GetText() == _T("This is a serialize test"));
delete pSerializableClass;
catch(CArchiveException *p)
char str[500];
p->GetErrorMessage(str,500);
AfxMessageBox(str);
p->Delete();
ar.Abort();
mf.Detach();
delete pBuf;
失败的代码是“ar >> pSerializableClass”。 任何想法为什么我会遇到这个问题?
为什么我必须使用常规 DLL? 我正在编写一个 .NET 包装器,混合模式 DLL 是访问 MFC 扩展 DLL 中的序列化的常规 DLL。
【问题讨论】:
【参考方案1】:该问题已在 MSDN 上得到解答。 见http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/d44e910c-a72e-43c0-b67f-8bb08b84aee6/?prof=required。
MFC DLL 已从应用程序资源链中删除并添加到常规 DLL 资源链中。它必须存在于两者中。
【讨论】:
以上是关于如果我从常规 DLL 加载 MFC DLL,反序列化将停止工作的主要内容,如果未能解决你的问题,请参考以下文章
创建共享 MFC 对话框:常规 DLL 或 MFC 扩展 DLL