2015-03-06 15 views
5

Ich werde ein Problem verwenden, das ich mit einer Java-Anwendung habe, um meine Frage anhand eines Beispiels zu erklären, aber diese Frage hat nichts wirklich mit Java zu tun.Windows Verknüpfung zu einem symbolischen Link zu einer ausführbaren Datei

Ich verwende Windows 7 (64-Bit) und ich möchte eine Startmenü-Verknüpfung erstellen, um eine GUI-Java-Anwendung auszuführen. Ab Java 8, setzt das Installationsprogramm NTFS symbolische Links in einer bekannten Ort zeigt auf eine Freisetzung spezifischen (dh, unterliegt häufigen Wechsel) Verzeichnis:

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] 

ich eine Verknüpfung, deren Zielbefehlszeile war C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe java_app.jar aber wenn ich es ausführe, sagt Windows, dass der Pfad javaw.exe nicht existiert. Ich kann die gleiche Befehlszeile erfolgreich über den Windows-Ausführen-Dialog ausführen. nur nicht von einer Abkürzung. Kann jemand eine Lösung anbieten? (Ich möchte keine Stapeldatei erstellen, um den Befehl auszuführen, da dies eine nutzlose Konsolenbox erzeugen würde.)

(Hinweis: Sie können dasselbe Problem auch ohne Java sehen. Erstellen Sie einfach eine symbolische Verknüpfung zu Notepad.exe (Verwenden Sie den Befehl MKLLINK), und versuchen Sie dann, eine Verknüpfung zur symbolischen Verknüpfung zu erstellen.)

+1

Nur Abkürzungen? Doppelklick direkt hat auch nie für mich funktioniert, zumindest nicht in Vista oder Windows 7. Es ist etwas verrückt mit wie die ShellExecute API von Explorer, et al aufgerufen wird. Um dieses Problem zu umgehen, können Sie ein nicht konsolefähiges Startprogramm erstellen, das CreateProcess aufruft und beendet. – eryksun

+0

Danke, Eryksun, das ist ein guter Punkt über Doppelklick mit diesem Problem auch. Seltsamerweise funktioniert das Ausführen des gleichen Symlinks aus der Windows Run-Box, obwohl es auch der Explorer ist, der das ausführt. Ihr Vorschlag, einen Launcher zu schreiben, ist wahrscheinlich die beste Lösung. –

+1

Wurde das gelöst? Ich hatte genau das gleiche Problem letztes Jahr, und ich habe es heute nicht.Ich weiß nicht genau, was sich geändert hat, wie ich es repariert habe, oder ob es ein bestimmtes Windows Update war, das es behoben hat. Aber ich kann ein Verknüpfungsziel von 'C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G -jar" C: \ Programme \ MyApp \ myapp.jar "verwenden. Ich habe die Verknüpfung auf dem Desktop erstellt und dann an die Taskleiste angeheftet. Nach jeder Aktualisierung wird der Symlink vom Java-Installer manipuliert, und ich muss die Verknüpfung manuell neu erstellen. Es kann nicht aktualisiert werden, da sich der Pfad nicht geändert hat und trotzdem nicht funktioniert. – user314159

Antwort

0

Sie können immer noch die nutzlose Batchdatei ausführen. Verwenden Sie dazu CALL, damit das Konsolenfenster sofort nach dem Start der Anwendung geschlossen wird.

Auch nicht auf Windows-Maschine jetzt, aber können Sie stattdessen eine Verknüpfung zu CMD.exe erstellen und übergeben Sie Ihren Befehl dort? Sie können dies in Verbindung mit CALL tun, falls das Konsolenfenster erscheint.

+0

Danke dimoniy. Ich denke du meinst START (CALL ist für den Aufruf von Batch-Dateien). Die Befehlszeile "cmd/c start javaw ...", mit der Verknüpfung konfiguriert, um es in einem minimierten Fenster zu starten, ist ein vernünftiger Kompromiss, obwohl es eine Schande ist, ein Fenster überhaupt zu erstellen. –

0

Dieser einfache Launcher kann nützlich sein; Sie können eine oder mehrere Verknüpfungen mit denselben Befehlszeilenparametern erstellen, die Sie in der Verknüpfung zu javaw.exe verwendet hätten.

#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); 
} 

in Visual Studio zu kompilieren, müssen Sie einige Projekteinstellungen ändern:

  • Buffer Security Check auf Nein in C/C++ Code-Generierung
  • Alle Standardbibliotheken auf Ja in Linkers Ignorieren Eingang
  • Einspeisepunkt zu NoCRTMain in Linkers Erweiterte
  • /DYNAMIC: NEIN und/fixed: JA as discussed here

(Sie können auch die Hauptfunktion von NoCRTMain zu WinMain ändern, aber dann müssen Sie die C-Laufzeit installieren oder statisch verknüpfen.)

Offensichtlich Sie einfach den Code ändern könnte symbolische Links andere als javaw laufen .exe, obwohl einige Programme die Tatsache nicht mögen mögen, dass argv[0] nicht auf die eigene ausführbare Datei der Anwendung zeigt.