2016-03-12 2 views
0

При работе с Win32API функция i должна использовать, возвращает свои результаты, записывая их в буфер типа LPTSTR, а также индивидуальное количество символов, которые были написаны. Код здесь здесьКак можно разбить wchar_t/TCHAR/WCHAR/LPTSTR на QStringList?

Поскольку этот буфер представляет собой строку, и функция может возвращать несколько значений, фактические данные результата выглядеть примерно так:

Value1\0Value2\0Value3\0\0 

Что является лучшим способом, чтобы получить это в QStringList?

ответ

0

LPTSTR = длинный указатель на TCHAR. В современных системах (с поддержкой Unicode) это синонимом массива WCHAR.

Поскольку ваш выходной буфер будет содержать символы, каждый из которых имеет два байта, он, таким образом, совместим с UTF16.

QString имеет статический метод fromUtf16, который требует простого приведения, чтобы удовлетворить компилятор.

В этом случае мы ДОЛЖНЫ также указать общую длину всей строки. Невыполнение этого результата приводит к тому, что QString только считывает входные данные до первого нулевого символа, игнорируя любые другие данные результата.

Как только у нас на самом деле есть QString для работы, разделение просто. Вызвать метод split() QString, указав нулевой символ, заключенный в QChar.

Необязательно, и в моем случае требуется указать, что SplitBehavior as SkipEmptyParts гарантирует, что пустые строки (результат разбора нулевого символа) не окажутся в моем желаемом результате (QStringList значений).

Пример:

// The data returned by the API call. 
WCHAR *rawResultData = L"Value1\0Value2\0Value3\0"; 

// The number of individual characters returned. 
quint64 numberOfWrittenCharacters = 22; 

// Create a QString from the returned data specifying 
// the size. 
QString rString = 
QString::fromUtf16((const ushort *)rawResultData, numberOfWrittenCharacters); 

// Finally, split the string into a QStringList 
// ignoring empty results. 
QStringList results = 
rString.split(QChar(L'\0'), QString::SkipEmptyParts); 
+1

Нет, '' LPTSTR' является TCHAR * '', где TCHAR' является '' char' или wchar_t' в зависимости от условной определить. Таким образом, ваш код является неправильным. Я не понимаю, почему вы хотите использовать 'TCHAR'. Это было полезно, когда вам нужно было настроить таргетинг на систему без Юникода, например. Windows 98. Эти дни давно прошли. –

+0

@Инспективный Исправлено, спасибо! – Andrew

+0

@David Heffernan Когда я узнал о том, как струны были обработаны в WinAPI, я наткнулся на это: http://stackoverflow.com/questions/234365/is-tchar-still-relevant Из того, что я понял, не было фактическая ПРОБЛЕМА с использованием TCHAR, это был просто «более старый» способ делать что-то. Вы предлагаете использовать WCHAR исключительно, поскольку это современный современный стандарт? Помимо определения rawResultData как TCHAR *, что еще не так? Спасибо за вашу помощь! – Andrew