[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"
-
-
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...
-
Alo novamente.
@TloRoy, isso executa normalmenteQuanto 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
-
-
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...