Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. International
  3. Portuguese
  4. [SOLVED] QProcess não inicia no Windows XP
Forum Updated to NodeBB v4.3 + New Features

[SOLVED] QProcess não inicia no Windows XP

Scheduled Pinned Locked Moved Portuguese
21 Posts 3 Posters 12.7k Views 1 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.
  • F Offline
    F Offline
    franzbischoff
    wrote on last edited by
    #1

    Alo pessoal

    Minha primeira questão é sobre o QProcess. Tenho o seguinte código funcionando corretamente no Windows 7:

    @bool ArenaListWindow::startFooBar()
    {
    QString program = fbpath + fbexe;
    QStringList arguments;
    arguments << "/blablabla";

    QProcess fbprocess;
    fbprocess.setWorkingDirectory(fbpath);
    fbprocess.start(program, arguments);
    
    if (!fbprocess.waitForStarted(10000))
    {
        QMessageBox::warning(this, "FooBar Starting", "Error starting FooBar.\nPlease contact administrator.");
        return false;
    }
    
    if (!fbprocess.waitForFinished(-1))
        return false;
    else
    {
        if (fbprocess.exitStatus() == QProcess::CrashExit)
        {
            QString errqtcode;
    
            switch (fbprocess.error())
            {
            case QProcess::FailedToStart:
                errqtcode = "The process failed to start. Either the invoked program is missing, or you may have insufficient permissions to invoke the program.";
                break;
            case QProcess::Crashed:
                errqtcode = "The process crashed some time after starting successfully.";
                break;
            case QProcess::Timedout:
                errqtcode = "The last waitFor...() function timed out. The state of QProcess is unchanged, and you can try calling waitFor...() again.";
                break;
            case QProcess::WriteError:
                errqtcode = "An error occurred when attempting to write to the process. For example, the process may not be running, or it may have closed its input channel.";
                break;
            case QProcess::ReadError:
                errqtcode = "An error occurred when attempting to read from the process. For example, the process may not be running.";
                break;
            case QProcess::UnknownError:
                errqtcode = "An unknown error occurred. This is the default return value of error().";
                break;
            default:
                errqtcode = "Default error.";
            }
    
            QMessageBox::warning(this, "Error Starting", errqtcode);
        }
    }
    
    return true;
    

    }@

    O problema é que em vários Windows XP o processo não é executado (ou melhor, é e retorna imediatamente), e o código de erro é "QProcess::Crashed".

    Esse código é de um Launcher que roda um programa e aguarda até o usuário sair do programa (pode demorar horas). No Windows 7 funciona ok, no Windows XP ele nem abre e já volta pro Launcher...

    Outra coisa interessante que vi, no Windows XP, é que se eu colocar o notepad.exe no lugar do programa que quero iniciar, o notepad abre... :-/

    Alguma luz?

    Obrigado!

    Free Online WWII Air Combat SImulation
    http://www.tabajarahost.org

    1 Reply Last reply
    0
    • N Offline
      N Offline
      neutrin0_brazil
      wrote on last edited by
      #2

      Já tentou colocar o PATH inteiro do programa que está tentando iniciar

      Lembrando que o notepad.exe fica dentro do PATH setado da variavel %PATH%

      Abs

      1 Reply Last reply
      0
      • N Offline
        N Offline
        neutrin0_brazil
        wrote on last edited by
        #3

        "c:\caminhodo_seu_programa\seuprograma.exe"

        1 Reply Last reply
        0
        • F Offline
          F Offline
          franzbischoff
          wrote on last edited by
          #4

          Neutrino, já faço isso...

          @QString program = fbpath + fbexe;@

          Obrigado

          Free Online WWII Air Combat SImulation
          http://www.tabajarahost.org

          1 Reply Last reply
          0
          • N Offline
            N Offline
            neutrin0_brazil
            wrote on last edited by
            #5

            Se o notepad.exe funciona, pode ser erro no programa a ser carregado.

            1 Reply Last reply
            0
            • F Offline
              F Offline
              franzbischoff
              wrote on last edited by
              #6

              É estranho... no W7 roda legal... Se eu executar o outro processo manualmente ele inicia... só pelo Qt que dá erro...

              De qualquer forma, como debugar isso sem ter que instalar toda IDE no XP? :-(

              Free Online WWII Air Combat SImulation
              http://www.tabajarahost.org

              1 Reply Last reply
              0
              • N Offline
                N Offline
                neutrin0_brazil
                wrote on last edited by
                #7

                Mano acho que pelo http://www.bloodshed.net/devcpp.html DevC++ vc consegue debugar e descobrir onde está a falha. sem um IDE não conheço a forma. se estiver usando GCC para compilar tente usar o parametro -d

                1 Reply Last reply
                0
                • N Offline
                  N Offline
                  neutrin0_brazil
                  wrote on last edited by
                  #8

                  pode ser falha no fonte do QT em relação ao XP Kernel, APIs, as famosas chamadas internas ;-)

                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    franzbischoff
                    wrote on last edited by
                    #9

                    Pois pode ser... tenho que ver um workaround... :-(

                    Vou experimentar usando as chamadas padrões do C/C++ pra iniciar outro processo e posto aqui o resultado.

                    O que queria mesmo era poder controlar a saída do processo pra fazer o Launcher sumir e reaparecer depois da execução do novo processo...

                    Free Online WWII Air Combat SImulation
                    http://www.tabajarahost.org

                    1 Reply Last reply
                    0
                    • T Offline
                      T Offline
                      TioRoy
                      wrote on last edited by
                      #10

                      Este executável depende de alguma outra DLL?

                      Tente fazer um teste no XP: abra o cmd.exe, digite:
                      @
                      cd
                      @

                      e depois chame o executável com o PATH completo:
                      @
                      c:\caminhodo_seu_programa\seuprograma.exe
                      @

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        franzbischoff
                        wrote on last edited by
                        #11

                        Alo novamente.
                        @TloRoy, isso executa normalmente

                        Quanto ao meu teste com chamada padrão C/C++ ficou pra depois, oq eu fiz entretanto foi passar meu projeto de Qt 4.8 pra Qt 5.1 e o erro ficou melhor, agora aparece uma mensagem quando o Launcher tenta executar o novo processo:

                        "Não foi possível localizar o ponto de entrada do procedimento InitOnceExecuteOnce na biblioteca de vínculo dinâmico KERNEL32.dll"

                        Esta deve ser a explicação de o processo ser terminado no Qt4.8 (mas sem mensagem).

                        Tenho agora que ver pq isto acontece...

                        Free Online WWII Air Combat SImulation
                        http://www.tabajarahost.org

                        1 Reply Last reply
                        0
                        • F Offline
                          F Offline
                          franzbischoff
                          wrote on last edited by
                          #12

                          Pronto... "MSDN.com says that this function is only available on Windows Vista and later" portanto... Qt nao suporta XP? :)

                          Free Online WWII Air Combat SImulation
                          http://www.tabajarahost.org

                          1 Reply Last reply
                          0
                          • T Offline
                            T Offline
                            TioRoy
                            wrote on last edited by
                            #13

                            Mas acho que a função InitOnceExecuteOnce não é usada pelo Qt.

                            Dei uma olhada nos fontes do Qt (4.8 e 5.2) e não achei uso desta função pelo Qt. Ele usa a CreateProcess para iniciar processos.

                            Como você já testou com o notepad, não me parece um problema diretamente do Qt.

                            Este executável que você está tentando rodar.... posso dar uma olhada nele.

                            1 Reply Last reply
                            0
                            • F Offline
                              F Offline
                              franzbischoff
                              wrote on last edited by
                              #14

                              Olá novamente,
                              Pra tira teima, instalei tudo no xp e compilei o launcher lá. Mesmo problema...

                              De fato outros executáveis rodam, mas este que está dando problema não dava quando o launcher era escrito em Lazarus, só quando o refiz em Qt...

                              o executável é este http://goo.gl/AymzjH

                              vlw

                              Free Online WWII Air Combat SImulation
                              http://www.tabajarahost.org

                              1 Reply Last reply
                              0
                              • T Offline
                                T Offline
                                TioRoy
                                wrote on last edited by
                                #15

                                Dei uma olhada no EXE e ele não usa a dita função.

                                Mas este usa uma DLL chamada TASKKEYHOOK.DLL.

                                Consegue ela também?

                                Estou achando muito estranho.....

                                1 Reply Last reply
                                0
                                • F Offline
                                  F Offline
                                  franzbischoff
                                  wrote on last edited by
                                  #16

                                  Este programa é um jogo

                                  Dll: http://goo.gl/HPkDYF

                                  Vlw

                                  Free Online WWII Air Combat SImulation
                                  http://www.tabajarahost.org

                                  1 Reply Last reply
                                  0
                                  • T Offline
                                    T Offline
                                    TioRoy
                                    wrote on last edited by
                                    #17

                                    Esqueci de perguntar... No XP você está usando o VS2008 para compilar, certo?

                                    Você pode usar o Dependency Walker (http://www.dependencywalker.com/) para verificar as dependências do EXE, e ver se está quebrado algo. É muito estranho mesmo você rodar o EXE "manualmente" e funcionar, e pelo Qt não.

                                    Um coisa que você pode fazer com o Dependency Walker é fazer um "profiling": Rodar o programa pelo Dependency Walker" e ele analisa o carregamento de outras DLL's que ocorreram durante o programa (e não no início que é o normal). Pode tentar fazer isso também com o seu Launcher.

                                    1 Reply Last reply
                                    0
                                    • F Offline
                                      F Offline
                                      franzbischoff
                                      wrote on last edited by
                                      #18

                                      Qt 32 bits com Mingw 32 bits

                                      Vou experimentar. Quero testar também com outras chamadas... enfim, tenho trabalho pro fds :-)

                                      Free Online WWII Air Combat SImulation
                                      http://www.tabajarahost.org

                                      1 Reply Last reply
                                      0
                                      • F Offline
                                        F Offline
                                        franzbischoff
                                        wrote on last edited by
                                        #19

                                        Criei um HelloWorldQT no netbeans, roda normal, abre a janelinha e tal. Então adicionei uma chamada CreateProcess() que é executada quando eu escrevo no textbox, e tudo correu lindamente...

                                        @if (CreateProcessA((LPSTR) "C:/caminhodo/maldito.exe", NULL,
                                        NULL, NULL, FALSE, 0, NULL,
                                        NULL, &StartupInfo, &ProcessInfo)) {
                                        std::cout << "OK" << std::endl;
                                        WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
                                        CloseHandle(ProcessInfo.hThread);
                                        CloseHandle(ProcessInfo.hProcess);
                                        std::cout << "OK2" << std::endl;
                                        }@

                                        Portanto... isso é ou não um bug do Qt? :)

                                        Update:

                                        Copiei o código inteiro do QProcessPrivate::startDetached() que tem no qprocess_win.cpp do Src do Qt e continua funcionando... :-/

                                        Free Online WWII Air Combat SImulation
                                        http://www.tabajarahost.org

                                        1 Reply Last reply
                                        0
                                        • F Offline
                                          F Offline
                                          franzbischoff
                                          wrote on last edited by
                                          #20

                                          Ok, agora pra piorar... uso o QProcess dentro do HelloWorld (conforme o codigo do meu primeiro post) e funciona... :-(

                                          Já estou ficando doido...

                                          Free Online WWII Air Combat SImulation
                                          http://www.tabajarahost.org

                                          1 Reply Last reply
                                          0

                                          • Login

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