Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Visual C++/MFC/WTL > CStdioFile,WriteString, NTDLL.DLL, AccessViolation


Автор: lv151 24.7.2009, 14:50
Пишу в файл с помощью CStdioFile+WriteString.
В дэбаг версии всё ок.

В релизе при попытке WriteString вылазит: 

Unhandled exception in .... (NTDLL.DLL):0000..5: Access Violation.

VC6.

Автор: azesmcar 24.7.2009, 14:57
lv151

Это микрософт так задумал. Не любят они программистов, вот и ставят палки в колеса. Надо выбирать другую профессию.
 smile 
Ну ты хотя бы код покажи. Как ты вообще видишь ответ на свой вопрос без кода? Ну вылетает он..и что? мало ли программ вылетает с access violation?

Автор: lv151 24.7.2009, 15:07
Код один и тот же. Разница только в дэбаг и релиз.
Код


CStdioFile file;
file.Open("d:\\1.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
file.WriteString("str");

Автор: Andrey44 24.7.2009, 15:11
Код

CStdioFile file;
    if(file.Open("d:\\1.txt", CFile::modeCreate | CFile::modeReadWrite | CFile::typeText))//typeText вместо typeBinary
        file.WriteString("str");


Автор: lv151 24.7.2009, 15:13
Мне нужно typeBinary. smile.

С CFile::typeText то же самое.

Автор: azesmcar 24.7.2009, 15:16
Код

CStdioFile file;
if (file.Open(_T("d:\\1.txt"), CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary))
   file.WriteString(_T("str"));

Посмотри разницу в настройках юникода в дебаге и в релизе.

Автор: Andrey44 24.7.2009, 15:19
Цитата(azesmcar @  24.7.2009,  15:16 Найти цитируемый пост)
Посмотри разницу в настройках юникода в дебаге и в релизе.

Согласен с azesmcar, у тебя настройки в дебаге и релизе разные.

Добавлено @ 15:22
А что-бы CFile::typeBinary пиши 
Код

TCHAR *data = _T("str");
file.Write((void*)data, wcslen(data) * sizeof TCHAR);

Автор: lv151 24.7.2009, 15:41
Ползаю по свойствам проекта и не могу найти настройку юникода smile
В Project Options её нет.

Автор: azesmcar 24.7.2009, 15:53
user posted image

Автор: lv151 24.7.2009, 15:54
VC6 smile

Автор: azesmcar 24.7.2009, 15:56
Цитата(lv151 @  24.7.2009,  15:54 Найти цитируемый пост)
VC6 smile 

У нас запрещено хранение антиквариатов smile 

Автор: lv151 24.7.2009, 16:03
smile

Автор: Albor 24.7.2009, 16:12
Проверил в 6й студии - всё работает нормально и в дебаге и в релизе.

Автор: lv151 24.7.2009, 17:10
Кому то везёт smile

Автор: lv151 28.7.2009, 14:53
First chance exception 0xC0000005 ACCESS_VIOLATION occurred at 0x7C90100B, read of address 0x00000034 at 0x7C90100B (in C:\WINDOWS\system32\ntdll.dll) 1168 14:50:43:083 
    0x7C90100B RtlEnterCriticalSection + 0xB in ntdll.dll 1168   
    0x77C40EFA fputs + 0x27 in msvcrt.dll 1168   
    0x5F45FA20 + 0x10 in mfc42.dll 1168   
    0x004056AE ttt.exe 1168   
    0x004053BB ttt.exe 1168   
    0x7E42F3C2 SendMessageA in user32.dll 1168   
    0x00408DCA ttt.exe 1168   
    0x004034F1 ttt.exe 1168   
    0x7C802600 WaitForSingleObjectEx + 0xB0 in kernel32.dll 1168   
    0x5F4186ED + 0x18C in mfc42.dll 

Вот что показал AQTime.

Автор: Peter 31.7.2009, 15:43
Это в функции main (или ее аналоге) всего лишь три строчки? Я бы в первую очередь проверил, на какой команде грохается. Вставил бы через строчку оповещение типа MessageBox() или записи в лог.
Бывает, что Debug отличается от Release разным заполнением неинициализированных переменных. Когда все переменные инициализированы, они работают одинаково.

Автор: lv151 5.8.2009, 09:14
Я MessageBox()-ми и ловил smile.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)