2015-03-06 23 views
5

Ho intenzione di utilizzare un problema che sto avendo con un'applicazione Java per spiegare la mia domanda a titolo di esempio, ma questa domanda non ha nulla a che fare con Java.Collegamento di Windows a un collegamento simbolico a un eseguibile

Sto usando Windows 7 (64-bit) e voglio creare un collegamento al menu Start per eseguire un'applicazione GUI Java. Come di Java 8, il programma di installazione mette NTFS link simbolici in un luogo ben noto che punta a un rilascio specifico (cioè soggetto a frequenti cambiamenti) annuario:

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] 

ho creato un collegamento il cui obiettivo riga di comando è stato C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe java_app.jar ma quando lo eseguo, Windows dice che il percorso javaw.exe non esiste. Posso eseguire correttamente la stessa riga di comando dalla finestra di dialogo Esegui di Windows; solo non da una scorciatoia. Qualcuno può offrire una soluzione? (Preferisco non creare un file batch per eseguire il comando, in quanto ciò creerebbe una console inutile.)

(NB È anche possibile visualizzare lo stesso problema senza utilizzare Java. Basta creare un collegamento simbolico a Notepad.exe (utilizzando il comando MKLINK) e quindi provare a creare un collegamento al collegamento simbolico.)

+1

Solo scorciatoie? Anche il doppio clic non ha mai funzionato per me, almeno non in Vista o Windows 7. È qualcosa di strano con il modo in cui l'API 'ShellExecute' viene richiamata da Explorer, et al. Come soluzione alternativa potresti creare un launcher senza console che chiama 'CreateProcess' ed esce. – eryksun

+0

Grazie, eryksun, questo è un buon punto per fare doppio clic su questo problema. Stranamente, l'esecuzione dello stesso collegamento simbolico dalla casella Esegui di Windows funziona correttamente, anche se è anche Explorer che esegue anche questo. Il tuo suggerimento per scrivere un lanciatore è probabilmente la soluzione migliore. –

+1

È stato risolto? Ho avuto lo stesso identico problema l'anno scorso e non ce l'ho oggi.Non so esattamente cosa è cambiato, come l'ho risolto o se si trattava di un aggiornamento specifico di Windows che lo risolveva. Ma sono in grado di utilizzare un target di scelta rapida di 'C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G -jar" C: \ Programmi \ MyApp \ myapp.jar ". Ho creato il collegamento sul desktop, quindi bloccato sulla barra delle applicazioni. Dopo ogni aggiornamento, il link simbolico viene intercettato dal programma di installazione Java e devo ricreare manualmente il collegamento. Non può essere aggiornato perché il percorso non è cambiato, ma non funzionerà diversamente. – user314159

risposta

0

È ancora possibile eseguire il file batch inutile. Utilizzare CALL al suo interno in modo che la finestra della console si chiuda immediatamente dopo l'avvio dell'applicazione.

Inoltre, non sulla macchina Windows in questo momento, ma è possibile creare un collegamento a CMD.exe invece e passare il comando in là? È possibile farlo in combinazione con CALL in caso venga visualizzata la finestra della console.

+0

Grazie dimoniy. Penso che tu intenda START (CALL è per chiamare i file batch). La riga di comando "cmd/c start javaw ...", con il collegamento configurato per avviarlo in una finestra ridotta a icona, è un ragionevole compromesso, anche se è un peccato che debba creare una finestra. –

0

Questo semplice programma di avvio può essere utile; puoi creare una o più scorciatoie con gli stessi parametri della riga di comando che avresti usato nel collegamento a 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); 
} 

Per compilare in Visual Studio, è necessario modificare alcune impostazioni di progetto:

  • Buffer Controllo di sicurezza a No in C/codice C++ Generation
  • Ignora tutte le librerie predefinite su Sì in Linker ingresso
  • punto di ingresso per NoCRTMain in Linker avanzata
  • /DYNAMICBASE: NO e/fissa: Yes as discussed here

(In alternativa, è possibile modificare la funzione principale da NoCRTMain a WinMain, ma poi è necessario installare il runtime C o collegarlo in modo statico.)

Ovviamente si potrebbe facilmente modificare il codice per eseguire i collegamenti simbolici diversi javaw .exe, anche se alcuni programmi potrebbero non gradire il fatto che argv[0] non punta all'eseguibile dell'applicazione stessa.

Problemi correlati