MFC Exceptions
От: Bogerm  
Дата: 25.06.01 03:04
Оценка:
Приветствую!
Кто может подсказать в чем здесь ошибка ?
Есть совсем простая консольная програмка:

#include <afx.h>
#include <afxwin.h>
#include <iostream>

using namespace std;

int main( void )
{
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
cout << "panic: MFC couldn't initialize!" << endl;
return 1;
}

CFileException ex;
CFile sFile;

if (!sFile.Open("Test.myf", /* CFile::modeCreate | */
CFile::modeWrite, &ex))
{
char szError[1024];
ex.GetErrorMessage(szError, 1024);
cout << "Couldn't open source file: ";
cout << szError;
return 1;
}
sFile.Close();
return 0;
}

Суть в том, что GetErrorMessage в отладочной версии вылетает по ASSERT с криками, что не может найти строку в ресурсах. Компилировалась программа как в IDE со включенной опцией "Use MFC in Static Library", так и с помощью
cl /GX /MT obj2.cpp
MSDN вроде говорит, что достаточно включить вызов AfxWinInit(), что бы механизм обработки исключений в MFC заработал.
Re: MFC Exceptions
От: Alexander Shargin Россия RSDN.ru
Дата: 25.06.01 07:40
Оценка:
Здравствуйте Bogerm, вы писали:

B>Приветствую!

B>Кто может подсказать в чем здесь ошибка ?
B>Есть совсем простая консольная програмка:

<skip>

B>Суть в том, что GetErrorMessage в отладочной версии вылетает по ASSERT с криками, что не может найти строку в ресурсах.


Всё дело в ресурсах. Когда MFC пытается загрузить из ресурсов строку с описанием ошибки, строка не находится, потому что в exe-файле её нет.

Для решения проблемы есть два пути.
1. Слинковаться с MFC динамически. В этом случае нужные ресурсы будут взяты из mfc*.dll.
2. Слинковаться с MFC статически. В этом случае ресурсы нужно включить в файл приложения. Для этого создай rc-файл для приложения (если ещё не создал), а затем открой окно View->Resource Includes и впиши в поле Compile-time directives строчку #include "afxres.rc".


С уважением,
Александр
--
Я думал, ты огромный страшный Бажище,
А ты недоучка, крохотный Бажик...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.