Windows到可执行文件的符号链接的快捷方式

时间:2015-03-06 18:22:55

标签: java windows symlink desktop-shortcut

我将使用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运行对话框成功运行相同的命令行;只是不是从捷径。有人能提供解决方案吗? (我不想创建一个批处理文件来运行命令,因为这会创建一个无用的控制台框。)

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

2 个答案:

答案 0 :(得分:0)

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

此外,现在不在Windows机器上,但是您可以创建CMD.exe的快捷方式并在那里传递命令吗?如果出现控制台窗口,您可以与CALL一起使用。

答案 1 :(得分: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 as discussed here

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

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