Преобразование TCHAR в строку на C

#c #tchar

#c #tchar

Вопрос:

Я пытаюсь преобразовать TCHAR в строку, как в:

 std::string mypath;
TCHAR path[MAX_PATH];
GetModuleFileName( NULL, path, MAX_PATH );
  

Мне нужно установить mypath значение path для. Я выполнил простой цикл и объединил path[index] в mypath , и это работает, но мне не нравится этот способ.

Я новичок в C , но много работал с C #. Я видел примеры GetModuleFileName , которые передаются в «char», но ему это не нравится. Для этого нужен TCHAR или LPWSTR .

Ответ №1:

TCHAR — это макрос, определенный как char или wchar в зависимости от того, для чего определен ваш набор символов. После 2008 года по умолчанию используется набор символов в Unicode. этот код работает, если вы измените свой набор символов.

 int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR* bob ="hi";
    string s = bob;    
}
  

Щелкните правой кнопкой мыши на настройках проекта и измените следующие

введите описание изображения здесь

если вы хотите использовать TCHAR в качестве набора символов Unicode, используйте wstring

Комментарии:

1. А еще лучше, определите typedef в TCHAR : typedef std::basic_string<TCHAR> tstring; и используйте tstring везде.

2. Спасибо за помощь. Установка указанного выше символа сработала. Теперь я могу использовать тип char в методе GetModuleFileName.

3. Это выдает ошибку a value of type "const char *" cannot be used to initialize an entity of type "TCHAR *"

4. @ThisClark определяется как TCHAR. Это работает на VS2013 и 2015. TCHAR определен в tchar.h если это не включено, это, конечно, не сработает.

5. Ты ЕДИНСТВЕННЫЙ, НЕПОВТОРИМЫЙ. Кто действительно указал на реальную проблему TCHAR. ВАУ, это был отличный ответ.

Ответ №2:

Когда мне действительно нужно это сделать, я использую следующее:

 TCHAR  infoBuf[32767];
GetWindowsDirectory(infoBuf, 32767);
  

И затем я конвертирую его в wstring, который может быть преобразован в стандартный std::string :

 wstring test(amp;infoBuf[0]); //convert to wstring
string test2(test.begin(), test.end()); //and convert to string.
  

Ответ №3:

Если вам нужен путь в символах, вы должны вызвать GetModuleFilenameA . Эта функция принимает LPSTR вместо LPTSTR .

Обратите внимание, что почти все функции Win32, которые принимают или возвращают строки, имеют две версии, одна из которых заканчивается на A (ANSI?), а другая заканчивается на W (wide).

Ответ №4:

Вы также можете преобразовать из _TCHAR* в char* с помощью функции wcstombs or wcstombs_s

http://msdn.microsoft.com/en-us/library/5d7tc9zw(v=vs.80).aspx

Ответ №5:

Привет, это поздний ответ, но у меня есть идея.

 {wstring test = User;
 std::wcout << test << std::endl;
 string test2(test.begin(), test.end());
 std::cout << test2 << std::endl;}
  

Пользователь в этом примере является именем пользователя в качестве TCHAR .
Теперь я могу использовать это имя как string или wstring .
Это самый простой способ преобразовать TCHAR в string .