[SOLVED] QProcess não inicia no Windows XP



  • 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!



  • 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



  • "c:\caminhodo_seu_programa\seuprograma.exe"



  • Neutrino, já faço isso...

    @QString program = fbpath + fbexe;@

    Obrigado



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



  • É 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? :-(



  • 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



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



  • 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...



  • 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
    @



  • 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...



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



  • 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.



  • 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



  • 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.....



  • Este programa é um jogo

    Dll: http://goo.gl/HPkDYF

    Vlw



  • 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.



  • Qt 32 bits com Mingw 32 bits

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



  • 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... :-/



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

    Já estou ficando doido...



  • Resolvido... era um dll do jogo que foi compilado no W7... recompilando usando o MSVC Express dentro do XP resolve o problema...

    Ufa :)


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.