Russian Qt Forum

Qt => Общие вопросы => Тема начата: Flake от Октябрь 15, 2007, 12:57



Название: Конвертация переменных.
Отправлено: Flake от Октябрь 15, 2007, 12:57
Есть задача перенести программу из чистого C++ в Qt.

Сама программа: http://www.codeproject.com/tools/SetEnv.asp

При переносе кода в qt проект появились ошибки.

1.
Код:
error C2664: '_strdup' : cannot convert parameter 1 from 'LPCTSTR' to 'const char *'
в строке типа
Код:
TCHAR* pszCopy = _tcsdup(pszKeyName);

Решено это было путём установки в свойствах проекта Configuration Properties -> General - Character Set = Use Unicode Character Set;


2.
Код:
cannot convert parameter 2 from 'const char *' to 'LPCTSTR'
в строке типа
Код:
bRetVal = obKey.SetKeyValueEx(((bSystem)? szREG_SYSTEM : szREG_USER), szName.c_str(), szValue.c_str(), (DWORD)szValue.length(), true, false, ((bSystem)? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER));

Ругается на szName.c_str() и szValue.c_str().
Переменные объявлены так: const string& szName, const string& szValue

Помогите разобраться почему такое происходит. Нужно что либо ещё указывать в настройках.


Название: Re: Конвертация переменных.
Отправлено: Kainit от Октябрь 15, 2007, 13:21
Цитировать
Сама программа: http://www.codeproject.com/tools/SetEnv.asp
Для того чтобы глянуть на исходники, надо регистрироваться, а влом...

Цитировать
Есть задача перенести программу из чистого C++ в Qt.
Если решили переносить на Qt, то зачем strdup? Есть класс QString, которые всё за вас сделает.

Цитировать
ешено это было путём установки в свойствах проекта
Это Visual Studio, Eclipse или что?

Цитировать
Configuration Properties -> General - Character Set = Use Unicode Character Set
Не слишком ли мощное решение такой проблемы?

А нельзя ли глянуть на исходники, очень уж не хочется регистрироваться чтобы их скачать?





Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 15, 2007, 13:28
Исходники: http://slil.ru/24980973
Цитировать
Это Visual Studio, Eclipse или что?
Visual Studio


Название: Re: Конвертация переменных.
Отправлено: Kainit от Октябрь 15, 2007, 13:46
Спасибо, глянул.

На каждой строчке вижуал студия орёт что всё депрекейтед, но оригинал компилится и работает...

Действительно при переходе в Qt есть проблемы. Только нужно ли о них размышлять, при том что прогу всё равно планируете перевести на Qt... Если так, то переходите к QSettings и QString и все проблемы как рукой снимет.


Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 15, 2007, 13:47
Спасибо за совет.


Название: Re: Конвертация переменных.
Отправлено: Mikor от Октябрь 15, 2007, 13:50
Можно поизвращяться с QString::fromLocal8Bit(szName.c_str())).utf16()


Название: Re: Конвертация переменных.
Отправлено: Racheengel от Октябрь 15, 2007, 19:22
но если переносить...
то надо все LPCTSTR также в QString преобразовать по коду...
иначе получится мутант...


Название: Re: Конвертация переменных.
Отправлено: Sergeich от Октябрь 15, 2007, 23:08
Посмотри тролльскую презентуху http://chaos.troll.no/~ahanssen/devdays2007/QtOnWindows.pdf, там есть раздел про конвертацию из виндовых сторк в кутевые и наоборот.


Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 16, 2007, 11:09
Появилась следующая проблема:

LPCTSTR pszValue;
BYTE* ba;
ba = (BYTE*)pszValue;

Криво конвертирует. Например от слова hello остается только he. Никто с этим не сталкивался?


Название: Re: Конвертация переменных.
Отправлено: Вячеслав от Октябрь 16, 2007, 12:17
Появилась следующая проблема:

LPCTSTR pszValue;
BYTE* ba;
ba = (BYTE*)pszValue;

Криво конвертирует. Например от слова hello остается только he. Никто с этим не сталкивался?
Цитировать

#ifdef UNICODE
 typedef LPCWSTR LPCTSTR;
#else
 typedef LPCSTR LPCTSTR;
#endif

typedef unsigned char BYTE;

typedef WCHAR *LPWSTR;

1) Qt по умолчанию использует unicode
2) чем wchar от char'a отличаються надо рассказывать ?


Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 16, 2007, 12:46
Спасибо.
Чем char отличается от wchar'а знаю.

Только не пойму, что надо сделать чтобы происходила нормальная конвертация. Вставить тот код который вы привели?


Название: Re: Конвертация переменных.
Отправлено: Dodge от Октябрь 16, 2007, 12:59
Появилась следующая проблема:

LPCTSTR pszValue;
BYTE* ba;
ba = (BYTE*)pszValue;

Криво конвертирует. Например от слова hello остается только he. Никто с этим не сталкивался?

можно сделать примерно так:

Код:

LPCTSTR pszValue;
BYTE* ba;

int i, count = <длинна конвертируемой строки>;

ba = new BYTE[count+1];
ba[count] = '\0';

for ( i=0; i<count; i++ )
    ba[i] = (BYTE)pszValue[i];


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


Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 16, 2007, 13:06
Dodge

Вашим способом срезки не происходит, но переменная записывается в виде кубиков, а не своим значением.


Название: Re: Конвертация переменных.
Отправлено: Dodge от Октябрь 16, 2007, 13:08
Dodge

Вашим способом срезки не происходит, но переменная записывается в виде кубиков, а не своим значением.

попробуйте конвертировать не в BYTE а в char, я думаю проблема отпадет.


Название: Re: Конвертация переменных.
Отправлено: Flake от Октябрь 16, 2007, 13:13
попробуйте конвертировать не в BYTE а в char, я думаю проблема отпадет.

для функции добавления нужно именно BYTE;


Название: Re: Конвертация переменных.
Отправлено: Вячеслав от Октябрь 16, 2007, 13:14
QString temp =QString::fromUtf16(pszValue);

И делаем чего хотим ;)