Ошибка при запуске Java-приложения из приложения Win32 C ++ с использованием CreateProcess

StackOverflow https://stackoverflow.com/questions/2339445

Вопрос

Я пытаюсь запустить Java-приложение из приложения на C ++, используя следующий код:

#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;
}

Когда я создаю и запускаю программу, я получаю следующую ошибку:

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.

В testapp.jar file - это исполняемый файл JAR, экспортированный из проекта Eclipse с одним классом в нем:

public class Test {
    public static void main(String[] args) {
        System.out.println("test");
    }
}

EXE-файл и JAR-файл находятся в одной и той же папке, и я запускаю EXE-файл из командной строки.Если я запущу JAR напрямую, поместив c:\java\jre\bin\java.exe -jar testapp.jar в командной строке все работает так, как ожидалось.

У кого-нибудь есть хоть малейшее представление о том, что здесь происходит?

Редактировать:Спасибо вам всем за вашу помощь, но, похоже, теперь у меня все работает.

Это было полезно?

Решение

Решил это.Я использовал:

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);
    }

Принимая во внимание, что вы использовали:

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);
    }

который, когда я его использовал, повторяет вашу ошибку.Разница заключается в пробеле , предшествующем -jar переключатель и почему это должно быть, я не знаю, я наткнулся на это по ошибке!

Другие советы

Мне просто нужно было изменить способ, которым я вызывал CreateProcess:

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) {

Документация для CreateProcess() указывает для параметра lpCurrentDirectory:

Полный путь к текущему каталогу процесса.Строка также может указывать UNC-путь.
Если этот параметр равен НУЛЮ, новый процесс будет иметь тот же текущий диск и каталог, что и вызывающий процесс.

В вашем отрывке отсутствует определение для path, но, скорее всего, он настроен неправильно.

Попробуйте указать каталог JAR после -jar.Это может быть связано с вашим текущим рабочим каталогом...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top