Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2011, 15:35   #1
Lindemann66
Форумчанин
 
Регистрация: 28.02.2011
Сообщений: 127
Стрелка _bstr_t -> LPCWSTR-> LPCTSTR->LPCSTR

Всем привет
Вопрос следующий

Есть код
Код:
// Look for instance pInstanceName
_bstr_t bstrInstance;
_bstr_t bstrInputInstance = pInstanceName;
for( int k=0; k < pPerfObj->NumInstances; k++ ) {
    bstrInstance = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset);
    if (!stricmp((LPCTSTR)bstrInstance, (LPCTSTR)bstrInputInstance)) {
       pCounterBlock = (PPERF_COUNTER_BLOCK) ((LPBYTE) pPerfInst + pPerfInst->ByteLength);
       break;
    }
				
    // Get the next instance.
    pPerfInst = NextInstance( pPerfInst );
}
Этот код для VS

Мне надо, чтобы он работал под Qt
В Qt, естественно, нету _bstr_t
_bstr_t здесь, я так понимаю, нужен для того, чтобы принимать wchar*, или LPCWSTR
То есть, код нужно привести к виду
Код:
LPCWSTR bstrInstance;
LPCWSTR bstrInputInstance = toWS(pInstanceName);
for( int k=0; k < pPerfObj->NumInstances; k++ ) {
    bstrInstance = (wchar_t *)((PBYTE)pPerfInst + pPerfInst->NameOffset);
    if (!stricmp((LPCTSTR)bstrInstance, (LPCTSTR)bstrInputInstance)) {
        pCounterBlock = (PPERF_COUNTER_BLOCK) ((LPBYTE) pPerfInst + pPerfInst->ByteLength);
        break;
    }
				
    // Get the next instance.
    pPerfInst = NextInstance( pPerfInst );
}
Также надо учесть, что pInstanceName имеет тип LPCTSTR
Написал функцию конвертации
Код:
LPCWSTR s2ws(LPCTSTR str) {
    int len = MultiByteToWideChar(CP_ACP, 0, str, -1, 0, 0);
    wchar_t* buf = new wchar_t[len];
    MultiByteToWideChar(CP_ACP, 0, str, -1, buf, len);
    LPCWSTR wstr = LPCWSTR(buf);
    return buf;
}
Но тут опять проблема - функция MultiByteToWideChar требует уже LPCSTR, то есть обычную строку
Выходит, нужно делать ещё и LPCTSTR to LPCSTR?
Уже мозг пухнет от этих преобразований, если честно...
Буду признателен за любые советы

Последний раз редактировалось Lindemann66; 17.08.2011 в 15:38.
Lindemann66 вне форума Ответить с цитированием
Старый 17.08.2011, 16:45   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Lindemann66

Также надо учесть, что pInstanceName имеет тип LPCTSTR

в таком случае получаем обычный говно-код, написанный быдло-школьнеГом, ибо тип TCHAR может превратиться и в char, а в цикле используется кастинг к wchar_t*
Опять же, функция stricmp расчитана на работу с char-типами, а ей дают на вход T-типы

правильный вариант - ни во что строку не преобразовывать, а сразу заюзать функцию стравнения, совместимую с TCHAR:

LPCTSTR instance = (LPCTSTR) (...)
if (!_tcscmp(...)) ...
Rififi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
и снова LPCWSTR Farrel Общие вопросы C/C++ 1 04.10.2010 09:07
LPCWSTR Farrel Общие вопросы C/C++ 3 03.10.2010 14:53
LPCWSTR Farrel Общие вопросы C/C++ 0 02.10.2010 17:51
Преобразования типа LPCSTR -> int без потери данных coNsept Общие вопросы C/C++ 2 20.05.2010 20:49
из char получить LPCSTR Ozerich Общие вопросы C/C++ 8 09.12.2008 23:15