2015-03-06 28 views
5

Zamierzam użyć problemu, który mam z aplikacją Java, aby wyjaśnić moje pytanie jako przykład, ale to pytanie nie ma nic wspólnego z Javą.Skrót Windows do dowiązania symbolicznego do pliku wykonywalnego

Używam systemu Windows 7 (64-bitowego) i chcę utworzyć skrót do menu Start, aby uruchomić aplikację Java w interfejsie GUI. Jak Java 8, instalator umieszcza NTFS linki symboliczne w dobrze znanym miejscem skierowaną do uwalniania specyficznych (tj podlega częstym zmianom) katalog:

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] 

utworzonego skrótu, którego cel wiersz poleceń było C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe java_app.jar, ale kiedy go uruchomię, Windows mówi, że ścieżka javaw.exe nie istnieje. Mogę pomyślnie uruchomić tę samą linię poleceń z okna dialogowego Uruchom Windows; po prostu nie ze skrótu. Czy ktoś może zaoferować rozwiązanie? (Wolę nie tworzyć pliku wsadowego, aby uruchomić polecenie, ponieważ utworzyłoby to bezużyteczne pole konsoli).

(UWAGA: Można również zobaczyć ten sam problem bez korzystania z Javy. Wystarczy utworzyć dowiązanie symboliczne do Notepad.exe (za pomocą polecenia MKLINK), a następnie spróbuj utworzyć skrót do dowiązania symbolicznego.)

+1

Tylko skróty? Podwójne kliknięcie bezpośrednio nigdy nie działało dla mnie, przynajmniej nie w Vista lub Windows 7. To jest coś dziwnego w tym, jak API "ShellExecute" jest wywoływane przez Explorera i innych. Aby obejść ten problem, można utworzyć program uruchamiający inny niż konsola, który wywołuje funkcję 'CreateProcess' i kończy działanie. – eryksun

+0

Dzięki, eryksun, to jest dobry punkt o podwójnym kliknięciu, który również ma ten problem. O dziwo, uruchomienie tego samego dowiązania symbolicznego z pola uruchamiania systemu działa dobrze, nawet jeśli jest to również Explorer, który też to uruchamia. Twoja propozycja napisania launchera jest prawdopodobnie najlepszym rozwiązaniem. –

+1

Czy to rozwiązano? W ubiegłym roku miałem dokładnie ten sam problem i nie mam go dzisiaj.Nie wiem dokładnie, co się zmieniło, jak to naprawiłem lub czy była to konkretna aktualizacja Windows Update, która to naprawiła. Ale jestem w stanie użyć skrótu cel 'C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G -jar" C: \ Program Files \ MyApp \ myapp.jar ". Stworzyłem skrót na pulpicie, a następnie przypięto do paska zadań. Po każdej aktualizacji, dowiązanie symboliczne jest manipulowane przez instalator Java i muszę ręcznie odtworzyć skrót. Nie można go zaktualizować, ponieważ ścieżka nie uległa zmianie, ale nie będzie działać inaczej. – user314159

Odpowiedz

0

Nadal można zrobić bezużyteczny plik wsadowy. Użyj jej wewnątrz, aby okno konsoli zostało zamknięte natychmiast po uruchomieniu aplikacji.

Również teraz nie na komputerze z systemem Windows, ale czy można zamiast tego utworzyć skrót do CMD.exe i przekazać tam swoje polecenie? Możesz to zrobić w połączeniu z CALL w przypadku wyświetlenia okna konsoli.

+0

Dzięki dimoniy. Myślę, że masz na myśli START (CALL służy do wywoływania plików wsadowych). Wiersz poleceń "cmd/c start javaw ...", ze skrótem skonfigurowanym do uruchamiania go w zminimalizowanym oknie, jest rozsądnym kompromisem, choć szkoda, że ​​musi w ogóle utworzyć okno. –

0

Ten prosty program uruchamiający może być przydatny; możesz utworzyć do niego jeden lub więcej skrótów za pomocą tych samych parametrów wiersza poleceń, które zostałyby użyte w skrócie do 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); 
} 

Do kompilacji w Visual Studio, trzeba będzie zmienić niektóre ustawienia projektu:

  • Bezpieczeństwo Buffer Sprawdzić Nie w C/C Kod ++ Generation
  • ignorowanie wszystkich bibliotek domyślnych YES Linker Wejście
  • punktu wejścia do NoCRTMain w Linker zaawansowane
  • /DYNAMICBASE: NO i/Poprawiono: TAK as discussed here

(lub można zmienić główną funkcję z NoCRTMain WinMain, ale wtedy trzeba zainstalować C czas pracy lub odwołuje go statycznie.)

Oczywiście można łatwo zmodyfikować kod, aby uruchomić dowiązania symboliczne inne niż javaw .exe, chociaż niektóre programy mogą nie lubić faktu, że argv[0] nie wskazuje na własny plik wykonywalny aplikacji.

Powiązane problemy