2015-03-06 31 views
5

Bir örnekle sorunumu açıklamak için bir Java uygulaması ile ilgili bir sorunu kullanacağım, ancak bu sorunun Java ile hiçbir ilgisi yoktur.Yürütülebilir bir dosya için sembolik bir bağlantı için Windows kısayolu

Windows 7 (64-bit) kullanıyorum ve bir GUI Java uygulamasını yürütmek için Başlat Menüsü kısayolu oluşturmak istiyorum. Java 8 itibarıyla, yükleyici bir salım-özgü bir tanınmış yer işaret eden NTFS sembolik bağlantıları koyuyorsa (yani sık değişikliğe tabi) dizin: Ben hedef komut satırı C idi bir kısayol oluşturdu

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] 

: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe java_app.jar ama çalıştırdığımda, Windows javaw.exe yolunun mevcut olmadığını söylüyor. Aynı komut satırını Windows Çalıştır iletişim kutusundan başarıyla çalıştırabilirim; sadece bir kısayoldan değil. Herkes bir çözüm önerebilir mi? (Komutu çalıştırmak için bir toplu iş dosyası oluşturmamayı tercih ederim, çünkü bu işe yaramaz bir konsol kutusu oluşturur.)

(NB Ayrıca, Java'yı kullanmadan da aynı sorunu görebiliyorsunuz. Notepad.exe'ye sembolik bir bağlantı oluşturmalısınız. (MKLINK komutunu kullanarak) ve ardından sembolik bağlantıya bir kısayol oluşturmayı deneyin.)

+1

Sadece kısayollar? Doğrudan çift tıklama, hiç ya da en azından Vista ya da Windows 7'de hiç çalışmadı. 'ShellExecute' API'sinin Explorer, et al. Bir geçici çözüm olarak, 'CreateProcess' işlevini çağıran ve çıkılan konsol olmayan bir başlatıcı oluşturabilirsiniz. – eryksun

+0

Teşekkürler, eryksun, bu soruna da çift tıklamakla ilgili iyi bir nokta. Garip bir şekilde, Windows Run kutusundan aynı symlink'i çalıştırmanız da işe yaramaz. Bir başlatıcı yazma öneriniz muhtemelen en iyi çözümdür. –

+1

Bu sorun çözüldü mü? Geçen yıl aynı problemi yaşadım ve bugün sahip değilim.Tam olarak neyin değiştiğini, nasıl tamir ettiğimi veya bunu düzelten belirli bir Windows Güncellemesiydi. Ama 'C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G-jar "C: \ Program Files \ MyApp \ myapp.jar" kısayol hedefini kullanabiliyorum. Masaüstündeki kısayolu oluşturduktan sonra görev çubuğuna sabitlendim. Her güncellemeden sonra, sembolik link, Java yükleyicisi tarafından kaldırılmakta ve kısayolu elle yeniden oluşturmam gerekiyor. Yol değişmediğinden güncellenemez, ancak başka türlü çalışmaz. – user314159

cevap

0

Yine de gereksiz toplu iş dosyasını yapabilirsiniz. İçinde CALL kullanın, böylece uygulama başlatıldıktan hemen sonra konsol penceresi kapanır.

Ayrıca, Windows makinesinde şu anda değil, ancak CMD.exe'a bir kısayol oluşturabilir ve komutunuzu oraya gönderebilir misiniz? Konsol penceresi göründüğünde CALL ile birlikte yapabilirsiniz.

+0

Teşekkürler dimoniy. Bence START (CALL) toplu iş dosyalarını çağırmak içindir. "Cmd/c start javaw ..." komut satırı, küçültülmüş bir pencerede başlatmak üzere yapılandırılmış kısayol ile makul bir uzlaşmadır, ancak bir pencere oluşturmak zorunda olduğu için utanç verici. –

0

Bu basit başlatıcı yararlı olabilir; javaw.exe kısayolunda kullanacağınız komut satırı parametreleriyle bir veya daha fazla kısayol oluşturabilirsiniz.

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

bazı proje ayarlarını değiştirmeniz gerekecektir, Visual Studio içinde derlemek için:

    Linker Yes tüm varsayılan kitaplıkları Yoksay
  • C/C++ Kod Üretimi yok etmek
  • Tampon Güvenlik Kontrolü Girdi
  • Bağlayıcı Gelişmiş NoCRTMain için
  • Giriş Noktası
  • /DYNAMICBASE: HAYIR ve/SABİT: EVET as discussed here

(Yoksa WinMain için NoCRTMain ana işlevi değiştirebilir, ancak o zaman C çalışma zamanını yüklemek veya statik olarak bağlamak. Gerekir) Açıkçası

kolayca javaw dışındaki sembolik bağlantıları çalıştırmak için kodu değiştirebilir .exe, bazı programların argv[0] uygulamasının kendi uygulamasına işaret etmemesine benzemiyor olabilir.

İlgili konular