Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Zamknięcie komputera program w QT

Ostatnio zmodyfikowano 2016-03-30 21:14
Autor Wiadomość
Masterpc16
Temat założony przez niniejszego użytkownika
Zamknięcie komputera program w QT
» 2016-03-26 15:55:33
Witajcie kiedyś napisałem program konsolowy w c++ który zamykał komputer po podanym czasie albo o danej godzinie. Teraz chcę go przerobić na aplikację okienkową i problem się pojawia gdy następuje wywołanie komendy system, wtedy następuje mignięcie konsoli. Wszystko działa oprócz tego mignięcia. Chciałbym się go pozbyć, szukałem dużo w google ale znalazłem tylko gotowy program (bez kodu), tutaj fragment kodu który odpowiada za zamknięcie po określonym czasie.
C/C++
QString czas, wylacz( "shutdown /s /t " );
int minuty( 0 );
minuty = ui->wylacz_za->value();
minuty *= 60;
czas = QString::number( minuty );
wylacz += czas;
system( wylacz.toStdString().c_str() );

Z góry dziękuję wszystkim za pomoc :)
P-146580
Gibas11
» 2016-03-26 18:09:30
Użyj normalnej funkcji do tworzenia nowego procesu, chyba CreateProcess. Btw dlaczego nie używasz zwykłych Cstringów? Byłoby prościej.
P-146587
Masterpc16
Temat założony przez niniejszego użytkownika
» 2016-03-26 19:11:43
A tak jakoś wybrałem Qstringa :)
znalazłem coś takiego
C/C++
WinExec( wylacz.toStdString().c_str(), 0 );

niby działa ale czy jest poprawnie?

Tylko jakbym robił to w zwykłym stringu to żeby zamienić int na string to musiałbym przy pomocy stringstream to zrobić tak jak w zwykłym c++?

A czy mógłbyś coś rozwinąć na temat createprocess :) bo w google nie mogę trafić na nic związanego z zamknięciem systemu
P-146589
Gibas11
» 2016-03-27 11:20:51
Nie zauważyłem, że jeszcze coś tam doklejasz, w takim wypadku qstring jest lepszy.
Shutdown to chyba zwykły .exe i wystarczy go wywołać z odpowiednimi parametrami, nie? Szczerze mówiąc od kilku lat nawet nie mam Windowsa, ale StackOverflow zasugerowało takie rozwiązanie. Jeżeli to co masz działa, chyba nie ma po co więcej grzebać. Zakładam, że problemem była konieczność dostępu do jakiejś powłoki tekstowej (bo tak działa
system
) i rozwiązaniem jest bezpośrednie utworzenie procesu.
P-146607
Masterpc16
Temat założony przez niniejszego użytkownika
» 2016-03-27 12:30:44
Dzięki za odpowiedź doklejam tam do qstring czas podany przez użytkownika i z dwojga złego wolę przekonwertować liczbę na qstring i to wyrażenie na string. Krótszy kod :D
P-146609
mokrowski
» 2016-03-27 14:20:21
I z tym system() to uważaj bo to generator problemów bezpieczeństwa. O ile dopuszczalne na etapie testowania albo "programowania okazjonalnego" o tyle w aplikacji komercyjnej nie.  Możliwe jest przestawienie środowiska systemowego (choćby zmiana %PATH%) i komenda z system() będzie uruchamiania ... nie ta którą chciałeś :-)
P-146610
Masterpc16
Temat założony przez niniejszego użytkownika
» 2016-03-29 00:29:57
@mokrowski czyli jakbym chciał wypuścić tą aplikację do użytku komercyjnego to nie mogę użyć system(), a już np.
C/C++
WinExec( "shutdown /s /t 60", 0 );
 mogę użyć? Dobrze zinterpretowałem Twój post?
P-146684
mokrowski
» 2016-03-29 10:30:07
Nie. Nie o to chodzi. Co do system i innych niespodzianek w C/C++, warto przejrzeć to wiki..
https://www.securecoding.cert.org/confluence/display/seccode/SEI+CERT+Coding+Standards

Dokładnie chodzi o: SEI CERT C Coding Standard -> Rule 10. Environment (ENV) -> ENV33-C. Do not call system()
Specjalnie tak podaję link aby choćby zerknąć do innych reguł :-)

To nie jest tak że wołać system() "technicznie nie można", to po prostu ... nie uchodzi/zły styl/chałturnictwo :-)

Co do WinExec() to wywołanie legacy https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms687393(v=vs.85).aspx i powtórka z problemów.. system :-/ Dlaczego nie CreateProcess() ? https://msdn.microsoft.com/pl-pl/library/windows/desktop/ms682425(v=vs.85).aspx

Albo QProcess ? http://doc.qt.io/qt-5/qprocess.html Akurat w tej klasie masz wszystko czego potrzeba by było bezpiecznie.
P-146700
« 1 » 2
  Strona 1 z 2 Następna strona