在Windows启动时由C ++应用程序启动时,JAR文件将不会运行

时间:2013-03-06 10:34:28

标签: java c++ windows

我有一个JAR文件,我想在系统启动时运行(OS = Windows)。为了实现在系统启动时运行的程序,我做了两件事:

  • 我在C ++中创建了一个可执行文件,它将触发JAR文件的启动。
  • MyApp中创建了一个名为HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion/Run(名称实际上并不重要)的注册表项,其值为可执行文件的路径。

可执行文件的代码如下:

BOOL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR commandLine, int nCmdShow) {

    ShowWindow(GetConsoleWindow(), SW_HIDE);

    // First display a box with text 'Hello!'
    stringstream msg; msg << "Hello!";
    MessageBox(NULL, msg.str().c_str(), "", MB_OK);

    // getJavaHome is a function
    stringstream javadir; javadir << getJavaHome() << "\\bin\\java.exe";
    stringstream params; params << " -jar jarfile.jar";

    STARTUPINFO info = { sizeof (info) };
    PROCESS_INFORMATION processInfo;

    char* path = stringToCharArray(javadir.str().c_str());
    char* args = stringToCharArray(params.str().c_str());

    if (CreateProcess(path, args, NULL, NULL, TRUE, CREATE_NO_WINDOW, NULL, NULL, &info, &processInfo)) {
        ::WaitForSingleObject(processInfo.hProcess, INFINITE);
        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
    }
    return 0;
}

请注意,正如您所看到的,此程序将在启动JAR文件之前输出一个消息框,上面写着“Hello!”

现在这是奇怪的事情:

  • 当我通过双击它来运行可执行文件时,它将显示消息框,然后它将启动JAR文件。
  • 但是当系统启动并且触发应用程序启动时,显示 Hello ,但 JAR文件。

到底怎么样?安德......如何解决?

1 个答案:

答案 0 :(得分:1)

我认为这是工作目录的一个问题 - 最终它在自动启动时完全不同。所以你应该通过正确的工作目录(不能判断是否可以用CreateProcess()完成);或者为JAR文件提供固定的绝对路径。