Windows 符号快捷方式 link 可执行文件

Windows shortcut to a symbolic link to an executable

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

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

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 的情况下看到同样的问题。只需创建一个符号 link 到 Notepad.exe(使用 MKLINK 命令),然后尝试创建一个快捷方式到符号 link.)

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

此外,现在不在 Windows 机器上,但是您可以创建一个指向 CMD.exe 的快捷方式并在其中传递您的命令吗?如果控制台 window 出现,您可以与 CALL 结合使用。

这个简单的启动器可能会有用;您可以使用与 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++ 代码生成中的缓冲区安全检查为否
  • 在链接器输入中将所有默认库忽略为是
  • 高级链接器中 NoCRTMain 的入口点
  • /DYNAMICBASE:NO 和 /FIXED:YES

(或者你可以把主要功能从NoCRTMain改成WinMain,但是你需要安装C 运行time或者link它是静态的。)

显然,您可以轻松地将代码修改为 运行 符号 link 而不是 javaw.exe,尽管某些程序可能不喜欢 argv[0] 不这样做的事实指向应用程序自己的可执行文件。