2012-01-24 28 views
2

如果我從常規DLL加載MFC DLL,反序列化停止工作。反序列化停止工作,如果我從常規DLL加載MFC DLL

我之前一直在問這個問題,但那時我覺得它很複雜,所以我沒有得到任何答案來解決我的問題。 見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。

enter image description here

當我嘗試反序列化,我得到以下CArchiveException「一位不願透露姓名的文件包含一個意外的對象。」

另外在Visual Studio 2008的輸出提供了當我運行SerializeTest的調試版本的以下信息:

「警告:無法從存檔加載CSerializableClass。類未定義。 CArchive異常:badClass。在SerializeTestD.exe 0x7c812afb 第一次機會異常:微軟C++異常:CArchiveException內存位置0x0012edf8」

下面的測試代碼在CMFCDLL :: DOIT運行

無效CMFCDLL :: DOIT(無效)

{

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是一個正規的DLL訪問MFC擴展DLL中的序列化。

回答