crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Проблема с преобразованием QString
Bat
  опции профиля:
сообщение 27.10.2009, 13:42
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 27.10.2009
Пользователь №: 1184

Спасибо сказали: 0 раз(а)




Репутация:   0  


В приложении требуется создание архивов с вложенными папками. Работает все исключительно под windows. Поэтому пошел по пути наименьшего сопротивления, использовал 7zip. В предыдущей версии QT все было собрано, и года 2 работало без проблем. Недавно понадобилось внести изменения. Поставил версию 4.5. Победил остальные проблемы, но вот с вызовом собственно 7zip проблемы.

QString zipExePath = QDir::convertSeparators(qApp->applicationDirPath()+"/7za.exe");
SHExecInfo.lpFile = zipExePath;

выдает error C2440: '=' : cannot convert from 'QString' to 'LPCSTR' - да вообще даже простой printf(str), если str типа QString - ту же ошибку выдает. Может сконфигурировал что не так?

вариант
SHExecInfo.lpFile = zipExePath.toAscii().constData();

нормально компилится, но потом в LpFile оказывается строка вида "юююююююююююююююююююююююююююююю" - много маленьких русских букв ю. Это toAscii() такое возвращает.

Как быть?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 27.10.2009, 13:58
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Нужно разобраться со строками (QString) в Qt.

Сначала преобразуем строку к QByteArray используя или toLatin1, или toAscii, или QTextCodec (в зависимости от того, какую строку хотим получить).
Затем получаем указатель на данные из QByteArray.
QString zipExePath = QDir::convertSeparators(qApp->applicationDirPath()+"/7za.exe");
QByteArray buf = zipExePath.toLatin1();

SHExecInfo.lpFile = buf.constData();    // !!! Этот указатель будет корректен пока жива переменная buf

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Bat
  опции профиля:
сообщение 27.10.2009, 14:19
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 27.10.2009
Пользователь №: 1184

Спасибо сказали: 0 раз(а)




Репутация:   0  


Спасибо, в таком виде заработало. Непонятно правда чем
SHExecInfo.lpFile = zipExePath.toAscii().constData();
хуже был.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 27.10.2009, 14:25
Сообщение #4


Профессионал
*****

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

Спасибо сказали: 264 раз(а)




Репутация:   44  


Цитата(Bat @ 27.10.2009, 14:19) *
Спасибо, в таком виде заработало. Непонятно правда чем
SHExecInfo.lpFile = zipExePath.toAscii().constData();
хуже был.

Подумай, кто что возвращает и какие деструкторы когда вызываются. ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
vanner
  опции профиля:
сообщение 27.10.2009, 23:55
Сообщение #5


Новичок


Группа: Новичок
Сообщений: 5
Регистрация: 27.8.2009
Пользователь №: 1025

Спасибо сказали: 1 раз(а)




Репутация:   0  


Да и вообще, можно и запуск процесса 7Zip было бы сделать через QProcess, который понимает QString и является кросплатформенным.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 30.11.2024, 13:47