Ansi c/c++ para executar jar externo e sair imediatamento. [RESOLVIDO]

12 respostas
WRYEL

Eu não sei o que acontece com a lingaugem C/C++ que para procurar documentação é um sofrimento danado pra mim :?

Uu preciso de uma função qualquer que chame meu .jar da mesma pasta que o executavel estiver e feche a janela logo em seguida.
eu consegui fazer algo muito perto com:

system("java - jar MeuJar.jar");
//A Janela externa fica aberta, e se fechar ela, ela encerra o .jar

a solução mais perto foi:

_execlp("calc", "calc", NULL);

só que tem que passar o caminho relativo, e só jesus sabe aonde vão querer jogar o .jar :S
Já ate tentei até resgatar o nome do diretorio atual com C/C++ mas esses negocios de ponteiro* e referencia& eu não entendi nada, e qualquer codigo encontrado no google só fala de caminho relativo :frowning:

12 Respostas

E

Hum… você precisa rodar seu programa em Windows ou em Linux? O modo de você determinar em que diretório está seu programa é diferente nos dois sistemas operacionais. (Como não tenho uma máquina Linux aqui, não consigo lhe dizer como é que se faria no Linux assim, de bate-pronto.)

WRYEL

hm, esqueci de citar, é no windows :slight_smile:

E

De fato, é difícil achar as coisas em português. A tradução automática do MSDN mais confunde que ajuda.

Exemplo:

#include <windows.h>
#include <string>
#include <iostream>

using namespace std;

// http://msdn.microsoft.com/en-us/library/ms683197%28VS.85%29.aspx

string getExecutableDirectory () 
{
    char szPathname [1024];
    ::GetModuleFileName (NULL, szPathname, sizeof (szPathname));
    string executableFilename (szPathname);
    // Agora devemos remover o nome do arquivo executável e deixar só o nome do diretório
    int pos = executableFilename.find_last_of ('\\');
    return executableFilename.substr (0, pos + 1);
}

int main (int argc, char *argv[]) 
{
    cout << getExecutableDirectory() << endl;
}
peczenyj

Desculpe mas… vc não poderia utilizar um vbscript ou jscript para isso?

WRYEL

@peczenyj: obrigado, mas não dá porquê seria como se foce um executavel para desktop!

@entanglement: Esse fonte que você passou caiu muito bem obrigado!
Só que agora eu voltei no problema do _execlp(); não funcionar, pelo jeito só funciona com aplicação do windows. Se você conhecer alguma outra função parecida ainda estou aceitando sugestões.

eu to usando o seguine fonte agora:

#include <process.h>
#include <windows.h>
#include <string>
using namespace std;

int main (int argc, char *argv[])
{
    // From: http://msdn.microsoft.com/en-us/library/ms683197%28VS.85%29.aspx
    char szPathname [1024];
    ::GetModuleFileName (NULL, szPathname, sizeof (szPathname));
    string executableFilename(szPathname);

    string saida = "java -jar ";
    saida = saida + executableFilename.substr (0, executableFilename.find_last_of('\\')+1);
    saida = saida +  "MinhaAplicacao.jar";

    printf("%s", saida.c_str());
    _execlp(saida.c_str(), saida.c_str(), NULL); //<-- aqui não faz nada
    return EXIT_SUCCESS;
}
E

Bom, o nome do diretório tem espaços? Isso dá muitos problemas. Você normalmente precisa cercar com aspas.

WRYEL

@entanglement: cerquei com aspas também mas não funcionou, obrigado pela ajuda até agora. Ao menos agora o caminho certo ja tenho, enquanto isso vou procurar outras maneiras de fazer chamada, se você souber alguma outra coisa vai dando um toque porfavor.

[]'s

E

Você não deve usar “execlp” desse jeito. Você não olhou a documentação? Ou só usou o Intellisense?

http://msdn.microsoft.com/en-us/library/1kxct8h0(VS.80).aspx

Pelo que imagino, você teria de usar _execlp assim:

_execlp ("java", "-jar", "c:\\diretorio\\arquivo.jar", NULL);

É que _execlp monta a linha de comando (com as aspas se necessário) para você.

WRYEL

@entanglement: funcinou, mas dei um espaço na string " -jar " para funcionar. Porém, voltamos ao mesmo problema, se eu fechar a janela externa, ele fecha o meu .jar :frowning: ja tentei jogar até pra thread com c++, mas nem assim deu resultado.

você não saberia me dizer se existe algo para executar esse comando e não ficar esperando a saida ?

[]'s

E

Ah, você não explicou direito. _execlp espera o comando ser terminado. Se precisar que o comando rode em paralelo com o seu programa em C++, então use CreateProcess:

É bom procurar direitinho na Internet como é que se chama esse troço. Ele tem alguns parâmetros bem enjoados (infelizmente estou sem nenhum programa-fonte contendo um CreateProcess que funcione direitinho).

WRYEL

então, deu certo não =x
Eu não sei se tinha sido muito claro, mas, eu preciso apenas que quando de dois clicks no jar, ele abra como aplicação normal, estranhamente, isso antes até funcionava no começo do projeto, dai adicionei alguns jars externos e pronto, a aplicação só passou a ser executada mediante ir linha de comando e fazer :

java -jar MinhaAplicacao.jar

se der 2 clicks em cima, não acontece nada =|

eis o código que não tinha funcionado em c++, na verdade ele só funciona com notepads, windows media players da vida, não sei o porque …

#include <process.h>
#include <windows.h>
#include <string>
using namespace std;

int main(int argc, char *argv[])
{
    // From: http://msdn.microsoft.com/en-us/library/ms683197%28VS.85%29.aspx
    char szPathname [1024];
    ::GetModuleFileName (NULL, szPathname, sizeof (szPathname));
    string executableFilename(szPathname);
    string saida = "";
    saida = saida + executableFilename.substr (0, executableFilename.find_last_of('\\')+1);
    saida = saida +  "MinhaAplicacao.jar";

    STARTUPINFO startupInfo = {0};
    startupInfo.cb = sizeof(startupInfo);
    PROCESS_INFORMATION processInformation;
    ::CreateProcess(saida.c_str(), NULL, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS, NULL, NULL, &startupInfo, &processInformation);

    return EXIT_SUCCESS;
}

Eu acho que eu to fazendo alguma coisa errada com esses jars, tanto o jar gerado com o eclipse, quanto o jar gerado pelo Fat jar tão dando esse mesmo tipo de problema, a aplicação ainda só não foi distribuida por causa desse bug :stuck_out_tongue:

WRYEL

entanglement valeu pela ajuda anteriormente, dei mais uma googlada e conseguir resolver, caso alguem precise criar um .exe para chamar seu .jar, pode usar este fonte abaixo, usei o Code::Blocks para compilar.

#include <Windows.h>
#include <string>

using namespace std;

int main()
{
    char szPathname[MAX_PATH];
    ::GetModuleFileName(NULL, szPathname, sizeof(szPathname));
    string executableFilename(szPathname);
    string aplicacao = "/C java -jar \"";
    aplicacao = aplicacao + executableFilename.substr(0, executableFilename.find_last_of('\\')+1);
    aplicacao = aplicacao + "TW.jar"; //Nome do jar aqui.
    aplicacao = aplicacao + "\"";
    ShellExecute(NULL, "open", "cmd", aplicacao.c_str(), NULL, SW_HIDE);
    return EXIT_SUCCESS;
}

lembrando que o .exe tem que ficar no mesmo diretório que seu jar.
[]'s

Criado 8 de dezembro de 2009
Ultima resposta 10 de dez. de 2009
Respostas 12
Participantes 3