2015-03-06 2 views
5

Я собираюсь использовать проблему, с которой я сталкиваюсь с Java-приложением, чтобы объяснить мой вопрос в качестве примера, но этот вопрос не имеет ничего общего с Java.Windows ярлык на символическую ссылку на исполняемый файл

Я использую 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), а затем попытайтесь создать ярлык для символической ссылки.)

+1

Просто ярлыки? Двойной щелчок напрямую никогда не работал для меня, по крайней мере, не в Vista или Windows 7. Это что-то нелепо, как API-интерфейс ShellExecute вызывается Explorer и др. В качестве обходного пути вы можете создать неконсольную пусковую установку, которая вызывает «CreateProcess» и завершает работу. – eryksun

+0

Спасибо, eryksun, это хорошая мысль о двойном щелчке с этой проблемой. Как ни странно, запуск одной и той же символической ссылки из окна Windows Run работает нормально, хотя это тоже Explorer, который тоже работает. Ваше предположение о написании пусковой установки, вероятно, является лучшим решением. –

+1

Решено ли это? У меня была такая же проблема в прошлом году, и сегодня у меня ее нет.Я не знаю точно, что изменилось, как я его исправил, или если это был специальный Windows Update, который исправил его. Но я могу использовать ярлык «C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G -jar» C: \ Program Files \ MyApp \ myapp.jar. Я создал ярлык на рабочем столе, а затем привязал к панели задач. После каждого обновления symlink получает скрипт установки Java, и мне нужно вручную создать ярлык вручную. Он не может быть обновлен, потому что путь не изменился, но не будет работать иначе. – user314159

ответ

0

Вы все равно можете сделать бесполезный командный файл. Используйте внутри него CALL, поэтому окно консоли закрывается сразу после запуска приложения.

Кроме того, не на машине Windows прямо сейчас, но вы можете создать ярлык для CMD.exe и передать свою команду там? Вы можете сделать это вместе с CALL в случае появления окна консоли.

+0

Спасибо dimoniy. Я думаю, вы имеете в виду START (CALL для вызова пакетных файлов). Командная строка «cmd/c start javaw ...» с ярлыком, сконфигурированным для запуска в свернутом окне, является разумным компромиссом, хотя стыдно, что он должен создать окно вообще. –

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, вам необходимо изменить некоторые параметры проекта:

    Проверить
  • Buffer Безопасности Нет в C/C++ код поколения
  • Игнорировать все библиотеки по умолчанию Да в Linker Входной
  • Точка входа в NoCRTMain в Linker Advanced
  • /DYNAMICBASE: NO и/FIXED: ДА as discussed here

(Или вы можете изменить основную функцию от NoCRTMain до WinMain, но тогда вам необходимо установить среду выполнения C или связать его статический.)

Очевидно, что вы могли бы легко изменить код для запуска других, чем javaw символических ссылок .exe, хотя некоторым программам может не понравиться тот факт, что argv[0] не указывает на собственный исполняемый файл приложения.

Смежные вопросы