MFC - как найти файл cfile, открытый cwinapp::opendocumentfile
Когда я открываю существующий файл с помощью диалогового окна stock в MDI, я вижу
lpszFileName
вычисляется в следующей функции . После этого я не знаю, где искать, чтобы установить указатель на файл CFile.Document* CMFCApplication3App::OpenDocumentFile(LPCTSTR lpszFileName) { // TODO: Add your specialized code here and/or call the base class return CWinApp::OpenDocumentFile(lpszFileName); }
Когда я прохожу через код, я никогда его не ввожу.
CDocument::OnOpenDocument
. Когда я пытаюсь извлечь данные из файла с помощью CDocument::Serialize
в конечном итоге он терпит неудачу с окном ошибки, говорящим "не удалось открыть документ". Я не понимаю, почему этот процесс никогда не входит CDocument::OnOpenDocument
.Что я уже пробовал:
Сериализованный след от
CDocument
в класс, где хранятся мои данные CArray
заключается в следующем:void TaxonTreeDoc::Serialize(CArchive& ar) { Taxa.Serialize(ar); } void CTaxon::Serialize(CArchive& archive) { CObject::Serialize(archive); if (archive.IsStoring()) archive << Rank << TName << TParent << IntegumentFileName << ExtCharFileName; else archive >> Rank >> TName << TParent << IntegumentFileName << ExtCharFileName; int i = 1;//test code for break point } typedef CArray<ctaxon, ctaxon&> TaxonArray; //dynamic array of taxa // CArray serialization helper specialized for the CTaxon class template<> inline void AFXAPI SerializeElements<ctaxon>(CArchive& ar, CTaxon *taxa, INT_PTR nCount) { for (int i = 0; i < nCount; i++, taxa++) { // Serialize each taxon object taxa[i].Serialize(ar); //taxa->Serialize(ar); } }
Обратите внимание, я закомментированы "
taxa->Serialize(ar);
- и заменил его на указатель "и". "taxa[i].Serialize(ar);
Однако ... CFile
был, кроме того, неудачным до этого изменения.
Richard MacCutchan
Куда ты звонишь OpenDocumentFile
откуда?
Member 14855755
Это одна из виртуальных функций в CMFCApplication3App, которая является моим классом, производным от CWinApp. Я добавил его для того, чтобы проследить путь открытия CDocument из CDocumentTemplate. Именно там я нашел имя файла, выбранное в стандартном диалоговом окне открыть файл. Я предполагал, что где-то дальше при создании CDocument будет вызван CDocument::OnOpenDocument, но этого никогда не происходит.
Richard MacCutchan
Я не понимаю. Если вы создали функцию, то вы должны вызвать ее откуда-то с именем файла в качестве параметра. Я на самом деле не уверен, к какой части информации вы не можете получить доступ.
Member 14855755
Эти виртуальные функции являются стандартными частями MFC MDI. Я просто унаследовал их в своих классах. Они вызваны цепью процесса MDI.
Richard MacCutchan
Но вы сказали выше, что это не называется. Я подозреваю, что в этом случае чего-то не хватает.
Member 14855755
Я не создавал эту функцию, я ее преодолел. Поскольку это виртуальная функция в базовом классе (CDocument), она должна быть вызвана без каких-либо действий с моей стороны. Мне нужен совет от кого-то, кто знает внутреннюю работу MFC MDI. Спасибо за попытку.
Richard MacCutchan
Видеть Класс CWinApp | Microsoft Docs[^], что объясняет, когда эта функция может быть вызвана.
Member 14855755
У меня нет проблем с CWinApp:OpenDocumentFile. Именно функция CDocument::OnOpenDocument поставила меня в тупик.
Richard MacCutchan
Да, но если вы прочтете документацию, то поймете, почему и когда она вызывается.
Member 14855755
Может быть, у вас есть ссылка на эту часть документации? Документация CDocument ничего не говорит о том, когда вызывается OnOpenDocument.
Richard MacCutchan
Я дал тебе ссылку вчера. И оттуда вы можете найти всю документацию MFC.
Member 14855755
Вы продолжаете твердить о CWinApp::OpenDocumentFile. Это явно не та функция, о которой я ищу информацию.
Richard MacCutchan
Первое предложение на странице документации для CDocument::OnOpenDocument
:
"Вызывается фреймворком как часть команды открытия файла." Остальные части более подробно объясняют, что происходит, и включают в себя пример.
Member 14855755
Вскрикивает. Я только что заметил, что мои операторы >> ошибаются в сериализованном чтении CTaxon. Именно поэтому данные будут записываться, но не считываться. Я до сих пор не понимаю, когда CDocument::OnOpenDocument(LPCTSTR) не вызывается. И еще одна ошибка в коде, которая объясняет, почему моя функция не вызывается. Я думал, что CString будет приводить к LPCTSTR, так как он, кажется, работает взаимозаменяемо в другом месте моего кода.