如果我从常规 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

使用带有共享 mfc dll 的常规 dll

.NET 客户端 - MFC 常规 DLL 和用户定义的消息

MFC dll

MFC dll

与使用 MFC 的常规 DLL 链接时,MFC 应用程序断言失败