Конвертация типов
От: avsokolov  
Дата: 05.09.07 03:58
Оценка:
вынес в отдельный пост, хотя тема чем то схожа с "перекодировать в юникод" на этом же форуме

конкретный пример из MSDN, который у меня не компилируется:

WIN32_FIND_DATA FindFileData;
char DirSpec[MAX_PATH];
HANDLE hFile=FindFirstFile(DirSpec, &FindFileData);

не может конвертировать из const char * to LPCWSTR

допустим, я вместо char DirSpec[MAX_PATH]; напишу:
wchar_t DirSpec[MAX_PATH];
тогда, вродебы не выдается ошибка во время компиляции, но если я хочу, чтобы пользователь ввел имя каталога:
cin.get(DirSpec, MAX_PATH);

теперь будет ругаться на cin.get, т.к. не сможет конвертировать в const char *

отсюда два вопроса:
1. как решить проблему, чтобы можно было пользоваться потоковыми классами С++ и функциями Windows
2. почему готовый пример MSDN не работает?


PS: изначально стоит задача, получить список содержимого каталога, пользователь вводит путь.
Re: Конвертация типов
От: SnowMan  
Дата: 05.09.07 04:28
Оценка:
Здравствуйте, avsokolov, Вы писали:

A>отсюда два вопроса:

A>1. как решить проблему, чтобы можно было пользоваться потоковыми классами С++ и функциями Windows
A>2. почему готовый пример MSDN не работает?

1. использовать wcin вместо cin
2. ну а это философский вопрос
Re: Конвертация типов
От: _Dreamer Россия  
Дата: 05.09.07 04:36
Оценка:
Здравствуйте, avsokolov, Вы писали:

A>отсюда два вопроса:

A>1. как решить проблему, чтобы можно было пользоваться потоковыми классами С++ и функциями Windows
A>2. почему готовый пример MSDN не работает?
A>PS: изначально стоит задача, получить список содержимого каталога, пользователь вводит путь.

Вам стоит почитать про макросы UNICODE \ _UNICODE и их связь с Win32 API.

вариантов для первого вопроса несколько.
как мне кажется, лучше жестко фиксировать символьный тип, скажем 'wchar_t', и использовать API функции вида ИмяФункцииW, в этом конкретном случае — FindFirstFileW. соответственно, использовать не std::cin\std::cout а std::wcin\std::wcout, std::wstring.

а не работает(вернее не компилируется, так как работы он никакой совершить и не может по этой причине) пример потому, что у Вас макрос FindFirstFile раскрывается в FindFirstFileW, которая первым параметром принимает LPCTSTR(тоесть LPCWSTR в этом случае), а не LPCSTR.

если исправить пример на
WIN32_FIND_DATA FindFileData;
TCHAR DirSpec[MAX_PATH];
HANDLE hFile=FindFirstFile(DirSpec, &FindFileData);

компилироваться должно.
Re[2]: Конвертация типов
От: Аноним  
Дата: 05.09.07 09:46
Оценка:
Здравствуйте, _Dreamer, Вы писали:

_D>Здравствуйте, avsokolov, Вы писали:


A>>отсюда два вопроса:


A>>2. почему готовый пример MSDN не работает?


_D>Вам стоит почитать про макросы UNICODE \ _UNICODE и их связь с Win32 API.


Для VS8: Project->Properties->Preprocessor->Preprocessor Definitions снять checkbox Inherit from parent or project defaults ( в Inherited values указаны : _UNICODE и UNICODE ). После чего готовый пример MSDN заработает.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.