crossplatform.ru

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

 
Ответить в данную темуНачать новую тему
> QProcess не работает из-за strcat
mva
  опции профиля:
сообщение 1.10.2013, 15:37
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Доброго времени суток!

Подключаю драйвер фискального регистратора к своему приложению просто включая его исходники в свои. Обнаружил, что у меня перестает работать запуск через QProcess стороннего приложения (браузера FireFox), никак не связанного с драйвером, из-за одной строки в коде драйвера.

Раскрывающийся текст

int readoptions (void)
{
char *homedir;
int etc_res;
int home_res;

fr = drvfrInitialize();

homedir = getenv("HOME");
etc_res = readrcfile("/etc/drvfrrc");
home_res = readrcfile(strcat(homedir, "/.drvfrrc")); // Из-за присутствия strcat в этом месте, мое стороннее приложение не запускается

if(etc_res == -1 && home_res == -1) return -1;
fr->prop->ComPortNumber = t_devnum;
fr->prop->Password = t_passwd;
fr->prop->Timeout = t_timeout;
fr->prop->BaudRate = t_linespeed;
return 1;
}


Если я проблемную строку поменяю на такую:

home_res = readrcfile(QString().append(homedir).append("/.drvfrrc").toAscii().data());

то стороннее приложение запускается нормально. С чем может быть связан такой эффект?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.10.2013, 16:56
Сообщение #2


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

Группа: Модератор
Сообщений: 1611
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

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




Репутация:   12  


дык, тут сразу две ошибки памяти. во-первых, перетирать строки, возвращённые getenv, нельзя. если хочешь оперировать с этими данными, копируй в свой локальный буфер. во-вторых, strcat не занимается перераспределением памяти и у строки в первом параметре должно хватить длины на всё содержимое, с присоединённым хвостом.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
mva
  опции профиля:
сообщение 1.10.2013, 18:19
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 104
Регистрация: 15.3.2009
Из: Киров
Пользователь №: 615

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




Репутация:   0  


Сделал в исходниках драйвера так

Раскрывающийся текст

char buffer[1000];
...
homedir = getenv("HOME");
...
strcat(buffer, homedir);
strcat(buffer, "/.drvfrrc");
home_res = readrcfile(buffer);
...


и все нормально заработало. Iron Bug, спасибо. Драйвер не мой, а сам я плохо разбираюсь в С и С++.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.11.2024, 6:39