Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QProcess start for mstsc (Remote Desktop) generates finished() signal immediately
Forum Updated to NodeBB v4.3 + New Features

QProcess start for mstsc (Remote Desktop) generates finished() signal immediately

Scheduled Pinned Locked Moved Solved General and Desktop
17 Posts 4 Posters 778 Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M m4kas

    @Christian-Ehrlicher
    Thanks for your message.
    Call as you suggested still immediately generates finished() signal.

    JonBJ Offline
    JonBJ Offline
    JonB
    wrote on last edited by JonB
    #4

    @m4kas
    I'm afraid I know nothing about mstsc. But as your code stands, for all I know it might not be on the path of the cmd and we would not know.

    I would start by hooking slots for anything on stdout and particularly on stderr. Windows/DOS has a way of sending you messages on stderr when (failing to) start processes. Note that this is not the same as hooking to error signal. I would also look at what the finished exit status is, just in case there is a clue there. Finally I would also hook onto started & stateChanged signals. That's what I do when debugging odd behaviour!

    M 1 Reply Last reply
    2
    • JonBJ JonB

      @m4kas
      I'm afraid I know nothing about mstsc. But as your code stands, for all I know it might not be on the path of the cmd and we would not know.

      I would start by hooking slots for anything on stdout and particularly on stderr. Windows/DOS has a way of sending you messages on stderr when (failing to) start processes. Note that this is not the same as hooking to error signal. I would also look at what the finished exit status is, just in case there is a clue there. Finally I would also hook onto started & stateChanged signals. That's what I do when debugging odd behaviour!

      M Offline
      M Offline
      m4kas
      wrote on last edited by
      #5

      @JonB
      Thanks for your reply and suggestions.
      finished() signal is being emitted with QProcess::NormalExit exitStatus
      Agree, stderr can contain something useful even though the RDP session with the target machine is being started correctly (at least, from user perspective), so I'll start with trying to read info from stderr and processing started & stateChanged signals.

      JonBJ 1 Reply Last reply
      0
      • M m4kas

        @JonB
        Thanks for your reply and suggestions.
        finished() signal is being emitted with QProcess::NormalExit exitStatus
        Agree, stderr can contain something useful even though the RDP session with the target machine is being started correctly (at least, from user perspective), so I'll start with trying to read info from stderr and processing started & stateChanged signals.

        JonBJ Offline
        JonBJ Offline
        JonB
        wrote on last edited by
        #6

        @m4kas
        Do those. Also while I think of it cmd /k ... is the same as cmd /c ... but should keep the Command Prompt window open. Try that to see what it has to show?

        M 1 Reply Last reply
        1
        • JonBJ JonB

          @m4kas
          Do those. Also while I think of it cmd /k ... is the same as cmd /c ... but should keep the Command Prompt window open. Try that to see what it has to show?

          M Offline
          M Offline
          m4kas
          wrote on last edited by
          #7

          @JonB
          With /k finished() signal is not being emitted at all, even after RDP session is closed.

          1 Reply Last reply
          0
          • M Offline
            M Offline
            m4kas
            wrote on last edited by
            #8

            Updated my code in next way:

            void MainWindow::on_tbl_machines_doubleClicked(const QModelIndex &index)
            {
                QString machine_address = ui->tbl_machines->model()->index(index.row(), 1).data().toString();
                QString machine_user = ui->tbl_machines->model()->index(index.row(), 4).data().toString();
                QString machine_password = ui->tbl_machines->model()->index(index.row(), 5).data().toString();
            
                // cmdkey /generic:<servername> /user:<username> /pass:<password>
                QStringList arg_list= QStringList() << QString("/generic:%1").arg(machine_address) << QString("/user:%1").arg(machine_user) << QString("/pass:%1").arg(machine_password);
                QProcess::execute("cmdkey", arg_list);
            
                QProcess *process = new QProcess();
                rdp_processes_list.append(process);
                connect(process, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(rdp_process_finished(int, QProcess::ExitStatus)));
                connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(rdp_process_error(QProcess::ProcessError)));
                connect(process, SIGNAL(started()), this, SLOT(rdp_process_started()));
                connect(process, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(rdp_process_state_changed(QProcess::ProcessState)));
                // start cmd and start mstsc app with /wait key to wait till RDP session is closed.
                process->start("cmd", QStringList() << "/c" << "start" << "/wait" << "mstsc" << "/v" << machine_address);
                // returns true if process started successfully
                process->waitForStarted(-1);
                process->waitForReadyRead(-1);
                qDebug() << "readAllStandardError:" << process->readAllStandardError();
                qDebug() << "readAllStandardOutput:" << process->readAllStandardOutput();
            }
            
            /* SLOTS */
            
            void MainWindow::rdp_process_started()
            {
                qDebug() << "started slot: Process started";
            }
            
            void MainWindow::rdp_process_state_changed(QProcess::ProcessState newState)
            {
                qDebug() << "stateChanged slot: Process state changed. New state: " << newState;
            }
            
            void MainWindow::rdp_process_finished(int exitCode, QProcess::ExitStatus exitStatus)
            {
                qDebug() << "finished slot: Exit code: " << exitCode << " Exit status: " << exitStatus;
            }
            
            void MainWindow::rdp_process_error(QProcess::ProcessError error)
            {
                qDebug() << "error slot: Process error:  " << error;
            }
            

            And got next messages from qDebug():

            CMDKEY: Credential added successfully.
            stateChanged slot: Process state changed. New state:  QProcess::Starting
            stateChanged slot: Process state changed. New state:  QProcess::Running
            started slot: Process started
            stateChanged slot: Process state changed. New state:  QProcess::NotRunning
            finished slot: Exit code:  0  Exit status:  QProcess::NormalExit
            readAllStandardError: ""
            readAllStandardOutput: ""
            

            So, it does not look mstsc want to say something to me...

            1 Reply Last reply
            0
            • Christian EhrlicherC Offline
              Christian EhrlicherC Offline
              Christian Ehrlicher
              Lifetime Qt Champion
              wrote on last edited by Christian Ehrlicher
              #9
              int main(int argc, char* argv[])
              {
                  QApplication a(argc, argv);
              
                  QProcess* proc = new QProcess;
                  QObject::connect(proc, &QProcess::started,
                      []() { qDebug() << "started";  });
                  QObject::connect(proc, &QProcess::stateChanged,
                      [](QProcess::ProcessState s) { qDebug() << "stateChanged:" << s;  });
                  QObject::connect(proc, qOverload<int,QProcess::ExitStatus>(&QProcess::finished),
                      [](int c, QProcess::ExitStatus s) { 
                      qDebug() << "finished:" << c << s;
                      QCoreApplication::quit(); 
                  });
                  proc->start("mstsc", { "/v:127.0.0.1" });
                  return a.exec();
              }
              
              -->
              stateChanged: QProcess::Running
              started
              // connect dialog is shown, I kill it
              stateChanged: QProcess::NotRunning
              finished: 0 QProcess::NormalExit
              

              Works perfectly fine for me. Still don't understand why everyone wants to use cmd /c to run a simple windows executable...

              Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
              Visit the Qt Academy at https://academy.qt.io/catalog

              M 1 Reply Last reply
              2
              • Christian EhrlicherC Christian Ehrlicher
                int main(int argc, char* argv[])
                {
                    QApplication a(argc, argv);
                
                    QProcess* proc = new QProcess;
                    QObject::connect(proc, &QProcess::started,
                        []() { qDebug() << "started";  });
                    QObject::connect(proc, &QProcess::stateChanged,
                        [](QProcess::ProcessState s) { qDebug() << "stateChanged:" << s;  });
                    QObject::connect(proc, qOverload<int,QProcess::ExitStatus>(&QProcess::finished),
                        [](int c, QProcess::ExitStatus s) { 
                        qDebug() << "finished:" << c << s;
                        QCoreApplication::quit(); 
                    });
                    proc->start("mstsc", { "/v:127.0.0.1" });
                    return a.exec();
                }
                
                -->
                stateChanged: QProcess::Running
                started
                // connect dialog is shown, I kill it
                stateChanged: QProcess::NotRunning
                finished: 0 QProcess::NormalExit
                

                Works perfectly fine for me. Still don't understand why everyone wants to use cmd /c to run a simple windows executable...

                M Offline
                M Offline
                m4kas
                wrote on last edited by m4kas
                #10

                @Christian-Ehrlicher
                My log when using your code:

                stateChanged: QProcess::Starting
                stateChanged: QProcess::Running
                started
                stateChanged: QProcess::NotRunning
                finished: 0 QProcess::NormalExit
                // RDP session is still in progress
                

                Update: when using your code, but not with loopback, but with real remote machine IP . Using with loopback gives error about "could not connect to another console session".

                1 Reply Last reply
                0
                • Christian EhrlicherC Offline
                  Christian EhrlicherC Offline
                  Christian Ehrlicher
                  Lifetime Qt Champion
                  wrote on last edited by
                  #11

                  I don't know what exactly mstsc is doing but maybe it's detaching the rdp connection internally so the mstsc process is not running when the rdp session is open. Take a look into your running taskmanager/processes when you have an open rdp connection if the mstsc process which you're using for connecting is still there. I would say it's not the case.

                  Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                  Visit the Qt Academy at https://academy.qt.io/catalog

                  M 1 Reply Last reply
                  2
                  • Christian EhrlicherC Christian Ehrlicher

                    I don't know what exactly mstsc is doing but maybe it's detaching the rdp connection internally so the mstsc process is not running when the rdp session is open. Take a look into your running taskmanager/processes when you have an open rdp connection if the mstsc process which you're using for connecting is still there. I would say it's not the case.

                    M Offline
                    M Offline
                    m4kas
                    wrote on last edited by
                    #12

                    @Christian-Ehrlicher
                    Yes, I can see mstsc.exe in active processes list after QT reported finished() for that process.

                    Christian EhrlicherC 1 Reply Last reply
                    0
                    • M m4kas

                      @Christian-Ehrlicher
                      Yes, I can see mstsc.exe in active processes list after QT reported finished() for that process.

                      Christian EhrlicherC Offline
                      Christian EhrlicherC Offline
                      Christian Ehrlicher
                      Lifetime Qt Champion
                      wrote on last edited by
                      #13

                      @m4kas said in QProcess start for mstsc (Remote Desktop) generates finished() signal immediately:

                      I can see mstsc.exe in active processes list after

                      And is it exactly this process which was started from Qt? Check the process id.

                      Qt Online Installer direct download: https://download.qt.io/official_releases/online_installers/
                      Visit the Qt Academy at https://academy.qt.io/catalog

                      M 1 Reply Last reply
                      1
                      • Christian EhrlicherC Christian Ehrlicher

                        @m4kas said in QProcess start for mstsc (Remote Desktop) generates finished() signal immediately:

                        I can see mstsc.exe in active processes list after

                        And is it exactly this process which was started from Qt? Check the process id.

                        M Offline
                        M Offline
                        m4kas
                        wrote on last edited by
                        #14

                        @Christian-Ehrlicher
                        Good catch!
                        PIDs really differs. Now I will try to understand how track the process, that is being started by mstsc I am starting...

                        mrjjM 1 Reply Last reply
                        0
                        • M m4kas

                          @Christian-Ehrlicher
                          Good catch!
                          PIDs really differs. Now I will try to understand how track the process, that is being started by mstsc I am starting...

                          mrjjM Offline
                          mrjjM Offline
                          mrjj
                          Lifetime Qt Champion
                          wrote on last edited by
                          #15

                          @m4kas
                          Hi
                          I think you are going to need to use the APIs
                          https://docs.microsoft.com/en-us/windows/win32/termserv/terminal-services-administration

                          1 Reply Last reply
                          1
                          • M Offline
                            M Offline
                            m4kas
                            wrote on last edited by m4kas
                            #16

                            As mentioned on microsoft forum post, most likely when building 32-bit app (which I was doing), it makes mstsc call of 32-bit version mstsc, which calls the correct 64-bit version and closes original process that was called from QT app.
                            Switched my QT project to build 64 bit application and it fixed my problem - now finished() signal is being emitted exactly after RDP session finished.
                            @Christian-Ehrlicher @JonB @mrjj thanks for your inputs.
                            Issue is solved.

                            mrjjM 1 Reply Last reply
                            4
                            • M m4kas

                              As mentioned on microsoft forum post, most likely when building 32-bit app (which I was doing), it makes mstsc call of 32-bit version mstsc, which calls the correct 64-bit version and closes original process that was called from QT app.
                              Switched my QT project to build 64 bit application and it fixed my problem - now finished() signal is being emitted exactly after RDP session finished.
                              @Christian-Ehrlicher @JonB @mrjj thanks for your inputs.
                              Issue is solved.

                              mrjjM Offline
                              mrjjM Offline
                              mrjj
                              Lifetime Qt Champion
                              wrote on last edited by
                              #17

                              @m4kas
                              Good digging!

                              1 Reply Last reply
                              1

                              • Login

                              • Login or register to search.
                              • First post
                                Last post
                              0
                              • Categories
                              • Recent
                              • Tags
                              • Popular
                              • Users
                              • Groups
                              • Search
                              • Get Qt Extensions
                              • Unsolved