| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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 | ||||
Понятно, что одна из двух функций возвращает NULL, но проблема в том, что посмотреть в отладчике, где именно возникает ошибка, я не могу, т.к. на моем компе никаких ошибок не возникает.
У заказчика тоже стоит версия 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 может отказать и т.д. Соответственно, если эти функции в твоем коде переопределены, посмотреть нужно и твою реализацию. Надеюсь, ход мыслей ясен. |