Java 指向可执行文件的符号链接的Windows快捷方式

Java 指向可执行文件的符号链接的Windows快捷方式,java,windows,symlink,desktop-shortcut,Java,Windows,Symlink,Desktop Shortcut,我将使用Java应用程序中的一个问题,通过一个例子来解释我的问题,但是这个问题实际上与Java无关 我正在使用Windows7(64位),我想创建一个开始菜单快捷方式来执行GUI Java应用程序。从Java 8开始,安装程序将NTFS符号链接放在一个众所周知的位置,指向一个特定于发行版(即经常更改)的目录: C:\>where javaw C:\ProgramData\Oracle\Java\javapath\javaw.exe C:\>dir C:\ProgramData\Or

我将使用Java应用程序中的一个问题,通过一个例子来解释我的问题,但是这个问题实际上与Java无关

我正在使用Windows7(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:\>其中javaw
C:\ProgramData\Oracle\Java\javapath\javaw.exe
C:\>目录C:\ProgramData\Oracle\Java\javapath\javaw.exe
驱动器C中的卷是OS
卷序列号为D4DC-33AF
C:\ProgramData\Oracle\Java\javapath目录
2015年3月5日15:40 javaw.exe[C:\Program Files\Java\jre1.8.0\u 40\bin\javaw.exe]
我创建了一个快捷方式,其目标命令行是C:\ProgramData\Oracle\Java\javapath\javaw.exe Java\u app.jar,但当我运行它时,Windows说javaw.exe路径不存在。我可以从Windows运行对话框成功运行相同的命令行;只是不是走捷径。有人能提供解决方案吗?(我不希望创建批处理文件来运行该命令,因为那样会创建一个无用的控制台框。)


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

您仍然可以执行无用的批处理文件。在其内部使用,以便启动应用程序后控制台窗口立即关闭


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

这个简单的启动器可能很有用;您可以使用与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);
}
#包括
void NoCRTMain(void)
{
wchar_t*cmdline=GetCommandLineW();
STARTUPINFO si;
处理信息;
GetStartupInfo&si;
如果(!CreateProcess(L“C:\\ProgramData\\Oracle\\Java\\javapath\\javaw.exe),cmdline,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
MessageBox(NULL,L“无法启动Java.”,L“runjava.exe”,MB_OK);
}
退出过程(0);
}
要在Visual Studio中编译,您需要更改某些项目设置:

  • C/C++代码生成中缓冲区安全检查为否
  • 在链接器输入中将所有默认库忽略为“是”
  • 高级链接器中NoCRTMain的入口点
  • /动态数据库:否和/或已修复:是
(也可以将main函数从NoCRTMain更改为WinMain,但随后需要安装C运行时或静态链接它。)


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

只是捷径?直接双击对我来说也从来没有起过作用,至少在Vista或Windows7中不起作用。Explorer等调用
ShellExecute
API的方式有些古怪。作为一种解决方法,您可以创建一个非控制台启动器来调用
CreateProcess
并退出。谢谢,eryksun,双击也会出现此问题。奇怪的是,从Windows Run box运行相同的符号链接可以正常工作,即使它也是Explorer运行的。你关于编写启动器的建议可能是最好的解决方案。这个问题解决了吗?去年我也有同样的问题,但今天我没有。我不知道到底发生了什么变化,我是如何修复它的,或者是某个特定的Windows更新修复了它。但是我能够使用快捷目标'C:\ProgramData\Oracle\Java\javapath\javaw.exe-Xmx1G-jar“C:\ProgramFiles\MyApp\MyApp.jar”。我在桌面上创建了快捷方式,然后固定到任务栏上。每次更新之后,Java安装程序都会修改符号链接,我必须手动重新创建快捷方式。无法更新它,因为路径未更改,否则将不起作用。@user314159:问题一直是间歇性的-符号链接的快捷方式有时会起作用,但不总是。谢谢Dimony。我想你指的是开始(调用用于调用批处理文件)。命令行“cmd/cstartjavaw…”配置了在最小化窗口中启动它的快捷方式,这是一个合理的折衷方案,尽管很遗憾它必须创建一个窗口。