Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Архив форумов ЦИТФорума
Море(!) вопросов - Море(!) ответов
 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Как правильно задавать вопросы

В чем ошибка (MFC)

 
Перейти:  
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование
Предыдущая тема :: Следующая тема  
Автор Сообщение
Trionyx
Гость





СообщениеДобавлено: Вс Июн 06 2004 12:47    Заголовок сообщения: В чем ошибка (MFC) Ответить с цитатой

Возникла проблема с чтением файла с помощью CreateFile()
Суть в следующем: Создал проект в VC++ (MFC) SDI.
Переопределил функцию OnFileOpen()

Код:
void CMainFrame::OnFileOpen()
{
   CString PathName;
   CMainFrame* pFrame = static_cast<CMainFrame*>(AfxGetMainWnd());
   CLegDoc *pDoc = (CLegDoc*) pFrame->GetActiveDocument();   
   HANDLE   hFile, hFileMapping;
   DWORD dwMaximumSizeHigh = NULL, dwMaximumSizeLow = NULL;
   LPDWORD lpFileSizeHigh = NULL;

   CFileDialog fileDlgOpen (TRUE, "", "*.txt",
      OFN_FILEMUSTEXIST| OFN_HIDEREADONLY, "Data Files (*.txt)|", this);

   if (fileDlgOpen.DoModal()==IDOK)
   {
      PathName = fileDlgOpen.GetPathName();
      wsprintf(buffer,"%s",fileDlgOpen.GetPathName());
      CFile file(PathName, CFile::modeRead);      
      file.SeekToBegin();      //ставим на начало, чтобы не было дополнительных строк
hFile =   CreateFile( PathName, GENERIC_READ, FILE_SHARE_READ,
            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
      dwMaximumSizeHigh = GetFileSize(hFile,NULL);
      hFileMapping = CreateFileMapping( hFile, NULL, PAGE_READONLY,
         0, dwMaximumSizeHigh, NULL);
      LPVOID lpvFile = MapViewOfFile(
                hFileMapping, // Дескриптор объекта "Проецируемый файл"
                FILE_MAP_READ, // Режим доступа
                0, // Старшие 32 разряда смещения от начала файла,
                0, // младшие 32 разряда смещения от начала файла
                0  // и количество отображаемых байт. 0 - весь файл.
                );
      str.Format("%s",(char *)lpvFile);      
      CloseHandle(hFileMapping);
      CloseHandle(hFile);   
      file.Close();
   }

Функция CreateFile при этом дает INVALID_HANDLE_VALUE;

Однако если тотже код вставить в ф - цию Serialize() все работает нормально
Пример
Код:
void CLegDoc::Serialize(CArchive& ar)
{
   HANDLE   hFile, hFileMapping;
   DWORD dwMaximumSizeHigh = NULL, dwMaximumSizeLow = NULL;
   LPDWORD lpFileSizeHigh = NULL;
   PCSTR pszName = ar.m_strFileName;
   CString str;

   if (ar.IsStoring())
   {
   }
   else
   {
      hFile =   CreateFile( ar.m_strFileName, GENERIC_READ, FILE_SHARE_READ,
            NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,NULL);
      dwMaximumSizeHigh = GetFileSize(hFile,NULL);
      hFileMapping = CreateFileMapping( hFile, NULL, PAGE_READONLY,
         0, dwMaximumSizeHigh, NULL);
      LPVOID lpvFile = MapViewOfFile(
                hFileMapping, // Дескриптор объекта "Проецируемый файл"
                FILE_MAP_READ, // Режим доступа
                0, // Старшие 32 разряда смещения от начала файла,
                0, // младшие 32 разряда смещения от начала файла
                0  // и количество отображаемых байт. 0 - весь файл.
                );
      str.Format("%s",(char *)lpvFile);      
      CloseHandle(hFileMapping);
      CloseHandle(hFile);
   }
}

Прошу помочь разобраться Confused
Вернуться к началу
_const_
Гость





СообщениеДобавлено: Пн Июн 07 2004 16:11    Заголовок сообщения: Ответить с цитатой

Цитирую MSDN:
The constructor with two arguments creates a CFile object and opens the corresponding operating-system file with the given path. This constructor combines the functions of the first constructor and the Open member function.

Вот и все. Этот конструктор CFile открывает файл, поэтому CreateFile и выдает INVALID_HANDLE_VALUE. Если вызвать ГетЛастЭррор, то получишь что-то типа "ошибка доступа". Чтобы подобного не происходило, используй
CFile file;
вместо
CFile file(path, attr);
Вернуться к началу
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Архив форумов ЦИТФорума -> Программирование Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Powered by phpBB © 2001, 2002 phpBB Group
Русская поддержка phpBB

 

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 6608306, ICQ 232284597
Пресс-релизы — pr@citforum.ru
Послать комментарий
Информация для авторов
This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2006 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...