Erro ao lançar um aplicativo Java de um aplicativo Win32 C ++ usando CreateProcess
-
22-09-2019 - |
Pergunta
Estou tentando lançar um aplicativo Java a partir de um aplicativo C ++ usando o seguinte código:
#include <windows.h>
#include <memory.h>
#include <tchar.h>
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
STARTUPINFOW siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
if (CreateProcess(TEXT("c:\\java\\jre\\bin\\java.exe"), TEXT("-jar testapp.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
CloseHandle(piProcessInfo.hProcess);
CloseHandle(piProcessInfo.hThread);
return 0;
}
Quando eu construo e executo o programa, recebo o seguinte erro:
Exception in thread "main" java.lang.NoClassDefFoundError: testapp/jar
Caused by: java.lang.ClassNotFoundException: testapp.jar
at: java.net.URLClassLoader$1.run(Uknown Source)
at: java.security.AccessController.doPrivileged(Native Method)
at: java.net.URLClassLoader.findClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
at: sun.misc.Launcher$AppClassLoader.loadClass(Uknown Source)
at: java.lang.ClassLoader.loadClass(Uknown Source)
Could not find the main class: testapp.jar. Program will exit.
o testapp.jar
O arquivo é um arquivo JAR executável exportado de um projeto Eclipse com uma única classe:
public class Test {
public static void main(String[] args) {
System.out.println("test");
}
}
O arquivo EXE e JAR estão exatamente na mesma pasta e estou executando o EXE na linha de comando. Se eu correr o frasco diretamente colocando c:\java\jre\bin\java.exe -jar testapp.jar
no comando-promove tudo, tudo funciona conforme o esperado.
Alguém tem alguma ideia do que está acontecendo aqui?
EDIT: Obrigado a todos pela sua ajuda, mas parece que tenho que funcionar agora.
Solução
Resolvi-o. Eu usei:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT(" -jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
Considerando que você usou:
if (CreateProcess(TEXT("C:\\Program Files\\Java\\jre6\\bin\\java.exe"), TEXT("-jar test.jar"), NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
MessageBox(NULL, L"Could not load app", L"Error", 0);
}
que, quando eu o usei, replica seu erro. A diferença é um espaço que precede o -jar
Mudar e por que isso deveria ser, eu não sei, tropecei nele por erro!
Outras dicas
Eu só tive que mudar a maneira como eu estava chamando de criação de criação:
wchar_t *command = (wchar_t*)calloc(512, sizeof(wchar_t));
wsprintf(command, TEXT("c:\\java\\jre\\bin\\java.exe -jar testapp.jar"));
if (CreateProcess(NULL, command, NULL, NULL, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcessInfo) == false) {
A documentação para CreateProcess()
Especifica para o parâmetro lpCurrentDirectory
:
O caminho completo para o diretório atual para o processo. A string também pode especificar um caminho UNC.
Se esse parâmetro for nulo, o novo processo terá a mesma unidade e diretório atuais que o processo de chamada.
Seu trecho está faltando uma definição para path
, mas provavelmente está configurado incorretamente.
Tente especificar o diretório do frasco depois -jar
. Pode ter a ver com seu diretório de trabalho atual ...