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]
不这样做的事实指向应用程序自己的可执行文件。
我将使用 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]
不这样做的事实指向应用程序自己的可执行文件。