Десериализация перестает работать, если я загружаю MFC DLL из обычной DLL - PullRequest
2 голосов
/ 24 января 2012

Десериализация перестает работать, если я загружаю MFC DLL из обычной DLL.

Я задавал этот вопрос раньше, но в то время я думал, что он был сложным, поэтому я не получил никакого ответа, решающего проблему для меня. См. C # .NET User Control внутри собственного приложения. Проблемы цепочки ресурсов

Теперь я сделал тестовое приложение, показывающее ту же проблему. Вы можете найти файлы с zip-кодом по адресу https://skydrive.live.com/?#cid=0977B1167FE01BB3&id=977B1167FE01BB3%21105&sc=documents.

Если я загружаю библиотеку расширения MFC из обычной библиотеки DLL, десериализация перестает работать, если я вызываю библиотеку расширения MFC непосредственно из приложения.

enter image description here

Когда я пытаюсь десериализовать, я получаю следующее CArchiveException «безымянный файл содержит неожиданный объект».

Кроме того, выходные данные в Visual Studio 2008 дают следующую информацию при запуске отладочной версии SerializeTest:

«Предупреждение: невозможно загрузить CSerializableClass из архива. Класс не определен. CArchive исключение: badClass. Исключение первого шанса в 0x7c812afb в SerializeTestD.exe: Microsoft C ++ исключение: CArchiveException в ячейке памяти 0x0012edf8. ”

Следующий тестовый код выполняется в 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-библиотека смешанного режима - это обычная DLL-библиотека, обращающаяся к сериализации в DLL-библиотеке расширений MFC.

1 Ответ

1 голос
/ 25 января 2012

На вопрос ответили в MSDN. Смотри http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/d44e910c-a72e-43c0-b67f-8bb08b84aee6/?prof=required.

MFC DLL была удалена из цепочки ресурсов приложений и добавлена ​​в обычную цепочку ресурсов DLL. Он должен существовать в обоих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...