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 861 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.
  • 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 Online
            Christian EhrlicherC Online
            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 Online
                Christian EhrlicherC Online
                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 Online
                    Christian EhrlicherC Online
                    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