4

我正在尝试使用以下代码从 C++ 应用程序启动 Java 应用程序:

#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文件是从 Eclipse 项目中导出的可运行 JAR 文件,其中包含一个类:

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一切都会按预期工作。

有谁知道这里发生了什么?

编辑:谢谢大家的帮助,但看起来我现在已经开始工作了。

4

4 回答 4

8

解决了。我用了:

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,为什么应该这样,我不知道,我错误地偶然发现了它!

于 2010-02-26T04:43:45.657 回答
3

我只需要改变调用 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) {
于 2010-02-26T04:50:23.167 回答
1

CreateProcess()用于指定参数的文档lpCurrentDirectory

进程当前目录的完整路径。该字符串还可以指定 UNC 路径。
如果此参数为 NULL,则新进程将具有与调用进程相同的当前驱动器和目录。

您的摘录缺少 的定义path,但很可能设置不正确。

于 2010-02-26T04:18:48.967 回答
0

尝试在-jar. 它可能与您当前的工作目录有关...

于 2010-02-26T04:20:44.467 回答