Russian Qt Forum
Ноябрь 01, 2024, 04:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Записать файл и выполнить смd  (Прочитано 5133 раз)
stanukih
Гость
« : Май 25, 2015, 20:00 »

проблема следующая - код который полностью отрабатывает на linux не работает под Виндовс.
Цитировать
QFile temp("cod.cpp");
    temp.open(QIODevice::WriteOnly | QIODevice::Text);
    QTextStream out(&temp);
    out<<codeText->toPlainText();
    temp.close();
    QProcess *com=new QProcess;
    QString co;
    co="./compile.cmd";
    com->start("cmd.exe",QStringList()<<co);
    com->waitForFinished();

отличие с линукс версией только с co="./compile.cmd"; - там co="./compile.sh";
и com->start("xterm",QStringList()<<co);

суть программа по блоксхеме строит исходный код->сохраняет его->компилирует.
ошибки никакие не вылазят, код сохраняется а cmd не запускается. В чем косяк?
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #1 : Май 25, 2015, 21:29 »

Можно попробовать через

Код:
    com->startDetached("cmd.exe",QStringList()<<co);
    com->waitForFinished();

если следить не надо, закрылся вызывающий процесс или нет.
Записан
Bepec
Гость
« Ответ #2 : Май 26, 2015, 01:33 »

Ответ простой - windows это вам не linux.
Там нет такой логики вызова как ./
Вы можете убедиться сами, вызвав данную команду в консоли и получив

Цитировать
e:\>./2.bat
"." не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.

Потому определяйте ОС и делайте 2 ветки - для винды и для линя.

PS правильный вариант будет просто
Цитировать
e:\>2.bat

e:\>echo 123
123

PPS если непонятно, то в 2.bat имеется строка echo 123, которая выводит надпись 123 Улыбающийся
Записан
qate
Супер
******
Offline Offline

Сообщений: 1176


Просмотр профиля
« Ответ #3 : Май 26, 2015, 09:05 »

QProcess имеет два полезных метода:
QByteArray    readAllStandardError()
QByteArray    readAllStandardOutput()
вызвав их можно понять что не сработало
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #4 : Май 26, 2015, 09:16 »

QProcess имеет два полезных метода:
QByteArray    readAllStandardError()
QByteArray    readAllStandardOutput()
вызвав их можно понять что не сработало


Проблема в том, что процесс запускается. И эти выводы пустые. В диспетчере он виден. И state() показывает QProcess::Running, а вот само окно cmd не появляется.
При этом при использовании startDetached(), все работает.
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Май 26, 2015, 09:18 »

Оно и не должно появляться.
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #6 : Май 26, 2015, 09:55 »

Оно и не должно появляться.

Тогда я не так понял тему. Грустный
Записан
stanukih
Гость
« Ответ #7 : Май 26, 2015, 12:20 »

Цитировать
Потому определяйте ОС и делайте 2 ветки - для винды и для линя.
так и есть

Цитировать
если следить не надо, закрылся вызывающий процесс или нет.
если правильно понимаю то он закроеться сразу при конце функции т.к. QProcess описан локально.

Цитировать
PS правильный вариант будет просто
Цитировать
e:\>2.bat

e:\>echo 123
123

PPS если непонятно, то в 2.bat имеется строка echo 123, которая выводит надпись 123 Улыбающийся
пробовал     
co="compile.cmd";
    com->start("cmd.exe",QStringList()<<co);
он просто зависает, как говорит диспетчер задач cmd все же запущен. По закрытию программы cmd тоже завершается (кстати окно не появляеться).

Цитировать
QByteArray    readAllStandardError()
QByteArray    readAllStandardOutput()
Ни разу этим не пользовался и не знаю как тут применить.

Цитировать
Оно и не должно появляться.
Планировалось что оно (окно cmd) будет появляться. Файл сmd состоит из 
g++.exe cod.cpp
a.exe
@ping -n 6 127.0.0.1 >nul
если просто запустить то cmd то все отрабатывает без проблем.
Записан
qate
Супер
******
Offline Offline

Сообщений: 1176


Просмотр профиля
« Ответ #8 : Май 26, 2015, 14:30 »

можно попробовать использовать ключ /c у cmd.exe
есть еще ShellExecuteA
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #9 : Май 26, 2015, 16:34 »

Цитировать
если правильно понимаю то он закроеться сразу при конце функции т.к. QProcess описан локально.

Он не закроется. Нужно будет закрывать его вручную.
Записан
stanukih
Гость
« Ответ #10 : Май 26, 2015, 16:55 »

Цитировать
если правильно понимаю то он закроеться сразу при конце функции т.к. QProcess описан локально.

Он не закроется. Нужно будет закрывать его вручную.
Попробовал так как вы предложили - работает пока. Пока буду тестировать, тему не закрою.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.109 секунд. Запросов: 23.