Сообщение об ошибке после CFileDialog::DoModal()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.07.16 08:38
Оценка:
Есть диалог открытия файлов fileDialog. Код его использования:

INT_RES  dlgRes;
CFileDialog  fileDialog(TRUE);
if (dlgRes==IDOK)
{
    //...
}


После того, как было выбрано имя файла (то есть когда dlgRes стал равен IDOK) действия между фигурными скобками выполняются. Однако через несколько минут в отладчике появляется окно с ошибкой:

Необработанное исключение в "0x7582c99e" в "MyProgram.exe":
0xc0000005: Нарушение прав доступа при чтении "0xfeeefeee"


Если в этом окне нажать на кнопку "Прервать", то появится другое окно с ошибкой:

Не загружена символьная информация ни для одного фрейма стека вызовов. Невозможно показать исходный код.


Если же была нажата кнопка "Продолжить", то появится следующее окно с ошибкой:

ОС Windows инициировала точку остановка в MyProgram.exe
Это может быть вызвано повреждением кучи и указывает на ошибку в MyProgram.exe или в одной из загруженных им DLL.
Возможной причиной так же может быть нажатие пользователем клавиши F12, когда фокус принадлежит MyProgram.exe
Выведенное на экран окно содержит дополнительные данные для ошибки


В последнем случае, после нажатия кнопки "Продолжить" управление передаётся основному окну моей программы.

Самое интересное, что те же сообщения об ошибке появляются, если у меня код внутри фигурных скобок пустой, то есть:

if (dlgRes==IDOK)
{
}

В чём причина этой ошибки? Как сделать так, чтобы её не было?

У меня стоит Visual C++ 2008.
1613 г. = 2024 г.
Re: Сообщение об ошибке после CFileDialog::DoModal()
От: Evgeniy Skvortsov Россия  
Дата: 15.07.16 11:09
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть диалог открытия файлов fileDialog. Код его использования:


RF>
RF>INT_RES  dlgRes;
RF>CFileDialog  fileDialog(TRUE);
RF>if (dlgRes==IDOK)
RF>{
RF>    //...
RF>}
RF>


Данный код не может вызывать ошибку. Косяк где-то в другом месте. Или покажи полный код функции в которой это происходит.
Re: Сообщение об ошибке после CFileDialog::DoModal()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 15.07.16 11:20
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Есть диалог открытия файлов fileDialog. Код его использования:


RF>
RF>INT_RES  dlgRes;
RF>CFileDialog  fileDialog(TRUE);
RF>if (dlgRes==IDOK)
RF>{
RF>    //...
RF>}
RF>


Забыл одну строку добавить:

INT_RES  dlgRes;
CFileDialog  fileDialog(TRUE);
dlgRes = fileDialog.DoModal();
if (dlgRes==IDOK)
{
    //...
}


1613 г. = 2024 г.
Re: Сообщение об ошибке после CFileDialog::DoModal()
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 15.07.16 16:19
Оценка: +2
Здравствуйте, RussianFellow, Вы писали:

RF>Есть диалог открытия файлов fileDialog. Код его использования:


RF>
RF>INT_RES  dlgRes;
RF>CFileDialog  fileDialog(TRUE);
RF>if (dlgRes==IDOK)
RF>{
RF>    //...
RF>}
RF>


RF>После того, как было выбрано имя файла (то есть когда dlgRes стал равен IDOK) действия между фигурными скобками выполняются. Однако через несколько минут в отладчике появляется окно с ошибкой:


RF>

RF>Необработанное исключение в "0x7582c99e" в "MyProgram.exe":
RF>0xc0000005: Нарушение прав доступа при чтении "0xfeeefeee"


Так-с… Когда-то немеряно давно я на что-то очень похожее нарывался, тоже были странные падения на совершенно нормальном с виду коде при работе то ли с CFileDialog, то ли с GetOpenFileName. Смутные обрывки воспоминаний неуверенно бормочут что-то про некорректную версию структуры OPENFILENAME, которая в зависимости от значения _WIN32_WINNT на этапе компиляции включает или не включает в себя некоторые поля. Проверьте, 1) во что у вас выставлен этот макрос, 2) под какую целевую систему компиляется программа, 3) на какой системе она запускается.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re: Сообщение об ошибке после CFileDialog::DoModal()
От: peterbes Россия  
Дата: 16.07.16 11:24
Оценка:
Здравствуйте, RussianFellow, Вы писали:

Почитай свой код внимательно, такие месаги результат грубейших ошибок

0xc0000005: Нарушение прав доступа при чтении "0xfeeefeee"

На 100% это ты порушил стек и вся твоя программа вошла неуправляемый процесс, а выявился косяк случайным образом, такие сообщения могут появиться от чего угодно, хоть от движения мышки.
Re[2]: Сообщение об ошибке после CFileDialog::DoModal()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 18.07.16 06:56
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Так-с… Когда-то немеряно давно я на что-то очень похожее нарывался, тоже были странные падения на совершенно нормальном с виду коде при работе то ли с CFileDialog, то ли с GetOpenFileName. Смутные обрывки воспоминаний неуверенно бормочут что-то про некорректную версию структуры OPENFILENAME, которая в зависимости от значения _WIN32_WINNT на этапе компиляции включает или не включает в себя некоторые поля. Проверьте, 1) во что у вас выставлен этот макрос, 2) под какую целевую систему компиляется программа, 3) на какой системе она запускается.


Посмотрел файл targetver.h . Вот что в нём написано:

#pragma once

#ifndef WINVER
#define 0x0600 // минимальная платформа -- Windows Vista
#endif

#ifndef _WIN32_WINNT
#define _WIN32_WINNT 0x0600 // минимальная платформа -- Windows Vista
#endif

#ifndef _WIN32_WINDOWS
#define _WIN32_WINDOWS 0x0410 // минимальная платформа -- Windows 98
#endif

#ifndef _WIN32_IE
#define _WIN32_IE 0x0700 // минимальная платформа -- Internet Explorer 7.0
#endif


Что следует изменить в этом файле?
У меня на компьютере стоит Windows 7 . Как сделать так, чтобы эта программа запускалась и с предыдущих версий Windows, в частности--с версии Windows XP ?
1613 г. = 2024 г.
Re[2]: Сообщение об ошибке после CFileDialog::DoModal()
От: Nikolaz Германия www.nikeware.com
Дата: 18.07.16 08:13
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>Так-с… Смутные обрывки воспоминаний неуверенно бормочут что-то про некорректную версию структуры OPENFILENAME,

The problem occurs because the OPENFILENAME structure is hard-wired to
the wrong size. When the destructor is called to delete the structure,
it ends up deleting more memory than was actually in use. In other
words, the struct member called 'lStructSize' is hard-wired to a value
that is larger than the true memory size of the structure. To correct
derive and use a newer (larger) OPENFILENAME structure as follows:

struct OPENFILENAMEEX : public OPENFILENAME {
  void *        pvReserved;
  DWORD         dwReserved;
  DWORD         FlagsEx;
};
Re[3]: Сообщение об ошибке после CFileDialog::DoModal()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 19.07.16 05:55
Оценка:
Здравствуйте, Nikolaz, Вы писали:

Как я понял, надо заменить структуру OPENFILENAME на структуру OPENFILENAMEEX. Но как это сделать, если у меня MFC-шное приложение, а не WinAPi-шное?
1613 г. = 2024 г.
Re[4]: Сообщение об ошибке после CFileDialog::DoModal()
От: CaptainFlint Россия http://flint-inc.ru/
Дата: 19.07.16 09:30
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Как я понял, надо заменить структуру OPENFILENAME на структуру OPENFILENAMEEX. Но как это сделать, если у меня MFC-шное приложение, а не WinAPi-шное?


В общем, я немного покопался в своих проектах и нашёл то, о чём бормотали воспоминания. К сожалению, оказалось, что это была Студия 6.0 и MFC 4.2, так что к текущей ситуации моё решение не подойдёт. Насколько я понял по своему коду, в MFC DLL была вкомпилена "короткая" версия структуры, а когда я собирал приложение под _WIN32_WINNT 0x500, в коде программы компилялась "длинная" структура, отсюда и падение; а решил я его, вручную подхачив студийный файл AFXDLGS.H.

Так что готового решения, увы, не предложу. Я бы пошёл таким путём.
1. Точно определить, какая версия структуры компиляется в программе (sizeof(OPENFILENAME), sizeof(CFileDialog::m_ofn)).
2. Проверить, что это, действительно, длинная структура. Возможно, инклудники инклудятся в таком порядке, что структура определяется ещё до того, как в силу вступает _WIN32_WINNT.
3. Сравнить значение sizeof с размером, записываемым в m_ofn.lStructSize.
4. В зависимости от результатов предыдущих шагов, сделать выводы, какой размер структуры ожидает MFC DLL, и плясать в том направлении. Например, если окажется, что нужна короткая версия, то можно сбацать что-то вроде этого
Автор: Areex
Дата: 25.08.03
:
#undef _WIN32_WINNT 
#include <afxext.h>
#define _WIN32_WINNT 0x0600

Ну и наоборот, задефайнить макрос перед инклудом, если выяснится, что ситуация обратная.
Почему же, ё-моё, ты нигде не пишешь «ё»?
Re[5]: Сообщение об ошибке после CFileDialog::DoModal()
От: Nikolaz Германия www.nikeware.com
Дата: 20.07.16 08:52
Оценка:
Здравствуйте, CaptainFlint, Вы писали:

CF>В общем, я немного покопался в своих проектах и нашёл то, о чём бормотали воспоминания. К сожалению, оказалось, что это была Студия 6.0 и MFC 4.2, так что к текущей ситуации моё решение не подойдёт. Насколько я понял по своему коду, в MFC DLL была вкомпилена "короткая" версия структуры, а когда я собирал приложение под _WIN32_WINNT 0x500, в коде программы компилялась "длинная" структура, отсюда и падение; а решил я его, вручную подхачив студийный файл AFXDLGS.H.

Ещё бы хотелось узнать, чем у ТС продиктован выбор Visual C++ 2008?
Re[6]: Сообщение об ошибке после CFileDialog::DoModal()
От: RussianFellow Россия http://russianfellow.livejournal.com
Дата: 20.07.16 10:22
Оценка:
Здравствуйте, Nikolaz, Вы писали:

N>Ещё бы хотелось узнать, чем у ТС продиктован выбор Visual C++ 2008?


Пишу на нём.
1613 г. = 2024 г.
Re[7]: Сообщение об ошибке после CFileDialog::DoModal()
От: Evgeniy Skvortsov Россия  
Дата: 20.07.16 13:05
Оценка:
Здравствуйте, RussianFellow, Вы писали:

RF>Пишу на нём.


Обновись до 2015
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.