Кажется, разобрался - по крайней мере, в основном.
Итак, аккумулируя все советы, которые мне дали в эхах.
При установке UNICODE необходимо использовать std::wstring и макрос _T
std::wstring s(_T("c:\\тест\\kub.x"));
std::ifstream in(s.c_str());
if (!in)
::MessageBox(NULL,_T("BAD"),_T("BAD"),MB_OK);
и всё будет работать.
При установке Multi-byte Character Set можно обойтись без _T и можно
использовать std::string.
о нужно делать явный вызов setlocale
setlocale(LC_ALL, "Russian" );
std::string s("c:\\тест\\kub.x");
std::ifstream in(s.c_str());
if (!in)
::MessageBox(NULL,"BAD","BAD",MB_OK);
К сожалению, не смог добиться никакого эффекта от #pragma setlocale("russian").
Что-то делаю не так?
Остаются вопросы:
1. Как работают с русскими путями файлов приложения, которые ничего не знают ни
про Multi-Byte, ни про Unicode. И ведь работают же! И никаких проблем. Даже
win16-приложения работают!
2. Как быть в случае с Multi-Byte Character Set и setlocale и несколькими
языками? Пусть одновременно только два - английский и какой-то другой. о
другой-то может быть любым! Читать из настроек Windows?
3. Как делать правильно? Т.е. как писать в большом проекте, чтобы потом не
удивляться? Как сейчас делают все?
4. Что прочитать, чтобы никого не мучить такими простыми вопросами?
Удачи в бою!.. ;)
Damir.