5

我将使用 Java 应用程序遇到的问题通过示例来解释我的问题,但这个问题与 Java 没有任何关系。

我使用的是 Windows 7(64 位),我想创建一个开始菜单快捷方式来执行 GUI Java 应用程序。从 Java 8 开始,安装程序将 NTFS 符号链接放在一个众所周知的位置,指向特定于发行版(即经常更改)的目录:

C:\>where javaw
C:\ProgramData\Oracle\Java\javapath\javaw.exe

C:\>dir C:\ProgramData\Oracle\Java\javapath\javaw.exe
 Volume in drive C is OS
 Volume Serial Number is D4DC-33AF

 Directory of C:\ProgramData\Oracle\Java\javapath

05/03/2015  15:40    <SYMLINK>      javaw.exe [C:\Program Files\Java\jre1.8.0_40\bin\javaw.exe]

我创建了一个快捷方式,其目标命令行是 C:\ProgramData\Oracle\Java\javapath\javaw.exe java_app.jar但是当我运行它时,Windows 说 javaw.exe 路径不存在。我可以从 Windows 运行对话框成功运行相同的命令行;只是不是从捷径。任何人都可以提供解决方案吗?(我不想创建批处理文件来运行命令,因为这会创建一个无用的控制台框。)

(注意,您也可以在不使用 Java 的情况下看到相同的问题。只需创建指向 Notepad.exe 的符号链接(使用 MKLINK 命令),然后尝试创建符号链接的快捷方式。)

4

2 回答 2

0

你仍然可以做无用的批处理文件。在其中使用CALL,以便在启动应用程序后立即关闭控制台窗口。

另外,现在不在 Windows 机器上,但你可以创建一个快捷方式来CMD.exe代替并在那里传递你的命令吗?CALL如果出现控制台窗口,您可以结合执行此操作。

于 2015-03-06T19:03:11.403 回答
0

这个简单的启动器可能很有用;您可以使用在 javaw.exe 的快捷方式中使用的相同命令行参数创建一个或多个快捷方式。

#include <Windows.h>

void NoCRTMain(void)
{
    wchar_t * cmdline = GetCommandLineW();
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    GetStartupInfo(&si);

    if (!CreateProcess(L"C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe", cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    {
        MessageBox(NULL, L"Unable to launch Java.", L"runjava.exe", MB_OK);
    }

    ExitProcess(0);
}

要在 Visual Studio 中编译,您需要更改一些项目设置:

  • 在 C/C++ 代码生成中将缓冲区安全检查设为否
  • 在链接器输入中将所有默认库忽略为是
  • Linker Advanced 中 NoCRTMain 的入口点
  • /DYNAMICBASE:NO 和 /FIXED:YES如此处所述

(或者您可以将主函数从 NoCRTMain 更改为 WinMain,但是您需要安装 C 运行时或静态链接它。)

argv[0]显然,您可以轻松地修改代码以运行 javaw.exe 以外的符号链接,尽管有些程序可能不喜欢不指向应用程序自己的可执行文件的事实。

于 2015-03-15T20:38:05.110 回答