2013-05-02 2 views
4
char* stheParameterFileName = argv[1]; //I'm passing the file name as a parameter. 
TCHAR szName [512]; 

Как я могу конвертировать char* в TCHAR []?Как конвертировать char * в TCHAR []?

+2

Существует ли конкретная причина, по которой вы не просто используете '_tmain (int argc, TCHAR * argv [])', т. Е. Как Visual Studio сначала настроил ваш проект для начала при первом создании? – WhozCraig

+0

TCHAR szName [512]; hMapFile = CreateFileMapping ( INVALID_HANDLE_VALUE, // файл подкачки использование NULL, // по умолчанию безопасности PAGE_READWRITE // чтение/запись доступ 0, BUF_SIZE, szName); // имя объекта сопоставления SO, я просто хочу передать имя файла, которое у меня уже есть, но в char * как szName, которое имеет тип TCHAR [] –

+1

. Почему вы так уверены, что некоторая сила в два будет волшебным образом сделать ваш буфер достаточно большой, не переполняя ваш стек? Тем не менее, есть функции * A и * W, если вы хотите явно использовать CHAR или WCHAR. –

ответ

10

Если включить заголовочный файл:

#include "atlstr.h" 

Затем вы можете использовать À2t макрос, как показано ниже:

// You'd need this line if using earlier versions of ATL/Visual Studio 
// USES_CONVERSION; 

char* stheParameterFileName = argv[1]; 
TCHAR szName [512]; 
_tcscpy(szName, A2T(stheParameterFileName)); 
MessageBox(NULL, szName, szName, MB_OK); 

Details on MSDN

+0

@ John Sibly: это сработало. Благодаря!! –

+0

Да, это сработает, но это означает, что ваше приложение не может обрабатывать символы Unicode в путях. Лучшее решение - сделать то, что предложил WhozCraig и прототипировать точку входа, или сгенерировать массив самостоятельно, передав результаты функции «GetCommandLine» функции 'CommandLineToArgv'. –

+4

(с использованием VS 2013, C++) Я получаю эту ошибку: Ошибка ошибка C2065: '_lpa': необъявленный идентификатор \t для этой строки: _tcscpy (szName, A2T (stheParameterFileName)); – qqqqq

0

Форма MSDN:

// convert_from_char.cpp 
// compile with: /clr /link comsuppw.lib 

#include <iostream> 
#include <stdlib.h> 
#include <string> 

#include "atlbase.h" 
#include "atlstr.h" 
#include "comutil.h" 

using namespace std; 
using namespace System; 

int main() 
{  
// Create and display a C style string, and then use it 
// to create different kinds of strings. 
char *orig = "Hello, World!"; 
cout << orig << " (char *)" << endl; 

// newsize describes the length of the 
// wchar_t string called wcstring in terms of the number 
// of wide characters, not the number of bytes. 
size_t newsize = strlen(orig) + 1; 

// The following creates a buffer large enough to contain 
// the exact number of characters in the original string 
// in the new format. If you want to add more characters 
// to the end of the string, increase the value of newsize 
// to increase the size of the buffer. 
wchar_t * wcstring = new wchar_t[newsize]; 

// Convert char* string to a wchar_t* string. 
size_t convertedChars = 0; 
mbstowcs_s(&convertedChars, wcstring, newsize, orig, _TRUNCATE); 
// Display the result and indicate the type of string that it is. 
wcout << wcstring << _T(" (wchar_t *)") << endl; 
... 
} 

Определение часто TCHAR зависит от того, используется ли Unicode или ANSI.

Смотрите также here:

Используя tchar.h, вы можете построить однобайтные, многобайтовый символ Set (MBCS), а также приложения Unicode из одних и тех же источников.
Tchar.h определяет макросы (которые имеют префикс _tcs), которые с правильными определениями препроцессора сопоставляются с функциями str, _mbs или wcs, если это необходимо. Чтобы создать MBCS, определите символ _MBCS. Чтобы создать Unicode, определите символ _UNICODE. Чтобы создать однобайтовое приложение, не определяйте ни (по умолчанию).
По умолчанию _MBCS определен для приложений MFC. Тип данных _TCHAR определен условно в Tchar.h. Если для вашей сборки определен символ _UNICODE, то _TCHAR определяется как wchar_t;, в противном случае для однобайтовых и MBCS-сборок он определяется как char. (wchar_t, основной широкоформатный тип данных Unicode, представляет собой 16-разрядный аналог 8-разрядного символа, подписанного.) Для международных приложений используйте семейство функций _tcs, которые работают в единицах _TCHAR, а не в байтах. Например, _tcsncpy копирует n_TCHAR, а не n байтов.

0

Ваш проект может быть настроен для использования Unicode. Unicode предназначен для программ, которые хотят обрабатывать большинство языков на планете Земля. Если вам это не нужно, перейдите в свойства проекта/общий/набор символов и переключитесь с Unicode на многобайтовый.