Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > Сообщение "Не удалось создать новый документ"


Автор: spikerok 21.7.2010, 14:45
Есть проект на Visual C++ 5.0. На моем компе все работает нормально, а у заказчика при выполнении метода CWinApp::OpenDocumentFile(...) вылетает сообщение "Не удалось создать новый документ".  
Посмотрел по отладчику, сообщение может вызываться в этом куске кода:

CDocument* CMultiDocTemplate::OpenDocumentFile(LPCTSTR lpszPathName,
    BOOL bMakeVisible)
{
    CDocument* pDocument = CreateNewDocument();
    if (pDocument == NULL)
    {
        TRACE0("CDocTemplate::CreateNewDocument returned NULL.\n");
        AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
        return NULL;
    }
    ASSERT_VALID(pDocument);

    BOOL bAutoDelete = pDocument->m_bAutoDelete;
    pDocument->m_bAutoDelete = FALSE;   // don't destroy if something goes wrong
    CFrameWnd* pFrame = CreateNewFrame(pDocument, NULL);
    pDocument->m_bAutoDelete = bAutoDelete;
    if (pFrame == NULL)
    {
        AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
        delete pDocument;       // explicit delete on error
        return NULL;
    }
    ASSERT_VALID(pFrame);
       ....
}
Сообщение показывается в строке AfxMessageBox(AFX_IDP_FAILED_TO_CREATE_DOC);
Если кто сталкивался с подобным, подскажите, как быть, плз.

Автор: Earnest 21.7.2010, 20:37
Дальше надо смотреть CreateNewDocument и CreateNewFrame - кто-то из них не создает то, что надо. Разбирайся дальше.
Кстати,  Visual C++ 5.0 - это такая древность, что аж жуть берет. Зачем ты пользуешься этим антиквариатом?
Проблема может быть, например, из-за несоответствия библиотек, т.к. у заказчика наверняка в системе более свежие установлены. Но заменять при установке более свежие библиотеки на свои древние - совсем нехорошо.

Автор: spikerok 22.7.2010, 15:09
Цитата

Дальше надо смотреть CreateNewDocument и CreateNewFrame - кто-то из них не создает то, что надо.

Понятно, что одна из двух функций возвращает NULL, но проблема в том, что посмотреть в отладчике, где именно возникает ошибка, я не могу, т.к. на моем компе никаких ошибок не возникает.
Цитата

Visual C++ 5.0 - это такая древность, что аж жуть берет

У заказчика тоже стоит версия 5.0, а вот насчет того, что библиотеки одинаковые, не уверен.  Сам бы я конечно не стал страдать хренью и работать в этой среде, но приходится на работе поддерживать старый проект. 

Автор: Earnest 22.7.2010, 17:31
Хорошо, тогда думаем. Из MFC-кода следует, что CreateNewDocument может не создать документ по 3 причинам: 
1) не установлен m_pDocClass 
2) этот док-класс не DYNCREATE (т.е. нулевой m_pfnCreateObject)
3) DYNCREATE, но создает не документ, а фиг знает что.
3-е вряд ли, т.к. в коде нет DYNAMIC_CAST, и несоответствие типа вылезло бы позже. В первые 2 пункта можно проверить где-нибудь до вызова в твоем коде - вывести отладочную информацию с помощью OutputDebugString (она и в релизе работает, а посмотреть можно утилиткой DebugView от Руссиновича).

Аналогично, смотрим CreateNewFrame - на предмет отказа - тоже класс проверям, затем смотрим, почему бы LoadFrame может отказать и т.д.
Соответственно, если эти функции в твоем коде переопределены, посмотреть нужно и твою реализацию.

Надеюсь, ход мыслей ясен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)