1

我有一个 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 文件。

到底是怎么来的?Annnd...如何解决?

4

1 回答 1

1

我想这是工作目录的问题——最终它在自动启动时完全不同。因此,您应该通过正确的工作目录(无法判断是否可以使用CreateProcess());或为您的 JAR 文件提供一个固定的绝对路径。

于 2013-03-06T10:58:34.537 回答