Member 14855755 Ответов: 1

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, так как он, кажется, работает взаимозаменяемо в другом месте моего кода.

1 Ответов

Рейтинг:
2

Michael Haephrati

Вам нужно позвонить

OpenDocumentFile
а возвращаемое значение-это тот дескриптор, который вы ищете.


CMFCApplication3App *myApp;
Document *myDoc = myApp->OpenDocumentFile(_T("myfilename.txt"));


Затем mydoc должен удерживать дескриптор файла.