2013-09-16 3 views
0

Я пытался использовать этот код:как конвертировать или отличать CString в LPWSTR?

USES_CONVERSION; 
LPWSTR temp = A2W(selectedFileName); 

, но когда я проверить переменную temp, просто получить первый символ

заранее спасибо

+0

Является ли это ANSI или Unicode строить? – dan04

+0

Ваше описание проблемы очень узкое. Пожалуйста, объясните, что вы пытаетесь сделать и что удерживает переменная. – 0x499602D2

+1

Является ли 'selectedFileName'' CStringA' или 'CStringW'? –

ответ

4

Если я правильно помню, CString является typedef'd либо CStringA, либо CStringW, в зависимости от того, строите ли вы Unicode или нет.

LPWSTR является "длинный указатель на строку широких" - он же: wchar_t*

Если вы хотите передать CString в функцию, которая принимает LPWSTR, вы можете сделать:

some_function(LPWSTR str); 

// if building in unicode: 
some_function(selectedFileName); 

// if building in ansi: 
some_function(CA2W(selectedFileName)); 

// The better way, especially if you're building in both string types: 
some_function(CT2W(selectedFileName)); 

HOWEVER LPWSTR - это неконстантный доступ к строке. Вы используете функцию, которая пытается изменить строку? Если это так, вы хотите использовать фактический буфер, а не CString.

Кроме того, когда вы «проверяете» temp - что вы имеете в виду? вы попробовали cout << temp? Потому что это не сработает (будет отображаться только первый символ):

char использует один байт на символ. wchar_t использует два байта на символ. Для простого английского языка, когда вы конвертируете его в широкие строки, он использует те же байты, что и исходная строка, но каждый символ заполняется нулем. Поскольку терминатор NULL также равен нулю, если вы используете плохой отладчик или cout (который использует текст ANSI), вы увидите только первый символ.

Если вы хотите напечатать широкую строку до стандартного, используйте wcout.

+0

Привет, thnank для ответа u. Я имел в виду, что в функции, вызываемой с веб-страницы, я получаю только первый символ строки (в данном случае выбранный файл), то есть букву «C», которая является диск, из которого я получаю имя архива. , очевидно, чтобы преобразовать CString в LPWSTR, потерял остальную часть строки –

+1

@ Luis Я сомневаюсь, что что-то потерялось. Просто вы не понимаете, как кодируется строка UNICODE в Windows. Обязательно прочитайте [Абсолютный минимум, каждый разработчик программного обеспечения, безусловно, должен знать об Unicode и наборах символов (никаких оправданий!)] (Http://www.joelonsoftware.com/articles/Unicode.html). Когда вы закончите, вы поймете, почему для строк требуются разные [Спецификаторы формата] (http://msdn.microsoft.com/en-us/library/vstudio/75w45ekt.aspx). Вы должны использовать 'su'. – IInspectable

+0

UNICODE: CString cstring = "some"; LPWSTR lpwstr = cstring .GetBuffer (cstring .GetLength()); – MrHIDEn

1

Вкратце: вы не можете. Если вам нужен неконстантный указатель на базовый буфер символов объекта CString, вам необходимо позвонить GetBuffer.

Если вам нужен указатель const, вы можете просто использовать static_cast<LPCWSTR>(selectedFilename).

+0

Листинг работает только в том случае, если программа построена с флагом 'UNICODE', который отображает' TCHAR' на 'wchar_t'. Если этот флаг не включен, это 'char', поэтому статический бросок не даст вам то, что вы хотите. Поскольку 'CString' имеет перегрузку для' operator LPCTSTR() ', нет необходимости использовать' static_cast' - он будет делать неявное преобразование. –

+0

@ Zac Вы абсолютно умны. Спасибо, что указал на очевидное. И не совсем корректно ... ['CStringT'] (http://msdn.microsoft.com/en-us/library/5bzxfsea.aspx) не имеет перегрузки' operator LPCTSTR() '* *. И его базовый класс 'CSimpleStringT' имеет [' operator PCXSTR'] (http://msdn.microsoft.com/en-us/library/tk1z2hd9.aspx). Независимо от того, требуется ли «static_cast» или нет, это вопрос уровня предупреждения компилятора и наборов инструментов сборки. Не стесняйтесь пропустить это. – IInspectable

+0

В ваших попытках выбрать бой, вы полностью упустили точку. 'LPCTSTR' =" длинный указатель на постоянную t-строку ". 'PCXSTR' =" указатель на константу x-string ", где' x' заполняется на основе параметра шаблона, объявленного с помощью CSimpleString <> '. То есть, если UNICODE не определен, 'CString' в основном представляет собой' CSimpleString ', поэтому попытка использовать' static_cast 'не будет работать, а это то, что вы оставили, и это то, что я указывал. –

0

Я знаю, что это довольно старый вопрос, но у меня был такой же вопрос, и ни один из предыдущих ответов не работал для меня.

Это, однако, не будет работать для моей юникода сборки:

LPWSTR temp = (LPWSTR)(LPCWSTR)selectedFileName; 
Смежные вопросы