2015-03-06 15 views
5

Tôi sẽ sử dụng một ứng dụng Java để giải thích câu hỏi của mình bằng một ví dụ, nhưng câu hỏi này không liên quan gì đến Java.Phím tắt Windows tới một liên kết tượng trưng đến một tập tin thực thi

Tôi đang sử dụng Windows 7 (64 bit) và tôi muốn tạo lối tắt Start Menu để thực thi ứng dụng Java GUI. Tính đến Java 8, trình cài đặt đặt NTFS liên kết tượng trưng ở một nơi trỏ nổi tiếng một thông cáo cụ thể (tức là phụ thuộc vào sự thay đổi thường xuyên) thư mục:

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] 

Tôi tạo ra một shortcut mà mục tiêu dòng lệnh là C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe java_app.jar nhưng khi tôi chạy nó, Windows nói rằng đường dẫn javaw.exe không tồn tại. Tôi có thể chạy thành công cùng một dòng lệnh từ hộp thoại Windows Run; không chỉ từ một phím tắt. Bất cứ ai có thể cung cấp một giải pháp? (Tôi không muốn tạo ra một tập tin batch để chạy lệnh, vì điều đó sẽ tạo ra một giao diện điều khiển hộp vô dụng.)

(NB Bạn cũng có thể nhìn thấy cùng một vấn đề mà không sử dụng Java. Chỉ cần tạo một liên kết tượng trưng đến Notepad.exe (sử dụng lệnh MKLINK) và sau đó thử tạo lối tắt cho liên kết tượng trưng.)

+1

Chỉ cần phím tắt? Kích đúp trực tiếp chưa bao giờ làm việc cho tôi, ít nhất là không có trong Vista hoặc Windows 7. Đó là một cái gì đó hay ho với cách mà API 'ShellExecute' được gọi bởi Explorer, et al. Để giải quyết sự cố, bạn có thể tạo trình khởi chạy không có giao diện điều khiển gọi là 'CreateProcess' và thoát. – eryksun

+0

Cảm ơn, eryksun, đó là một điểm tốt về việc nhấp đúp có vấn đề này. Thật kỳ lạ, chạy cùng một liên kết tượng trưng từ hộp Windows Run hoạt động ok, mặc dù nó cũng là Explorer chạy quá. Đề xuất của bạn để viết một launcher có lẽ là giải pháp tốt nhất. –

+1

Điều này đã được giải quyết chưa? Tôi đã có cùng một vấn đề chính xác vào năm ngoái và hôm nay tôi không có nó.Tôi không biết chính xác những gì đã thay đổi, cách tôi sửa nó, hoặc nếu đó là một Windows Update cụ thể đã sửa nó. Nhưng tôi có thể sử dụng một mục tiêu tắt của 'C: \ ProgramData \ Oracle \ Java \ javapath \ javaw.exe -Xmx1G -jar" C: \ Program Files \ MyApp \ myapp.jar ". Tôi đã tạo lối tắt trên màn hình, sau đó được ghim vào thanh tác vụ. Sau mỗi lần cập nhật, symlink bị trình cài đặt Java bỏ qua và tôi phải tạo lại lối tắt theo cách thủ công. Nó không thể được cập nhật vì đường dẫn đã không thay đổi, nhưng sẽ không hoạt động nếu không. – user314159

Trả lời

0

Bạn vẫn có thể thực hiện tệp lô vô dụng. Sử dụng CALL bên trong để cửa sổ bảng điều khiển đóng ngay lập tức sau khi bắt đầu ứng dụng của bạn.

Ngoài ra, không phải trên máy Windows ngay bây giờ, nhưng bạn có thể tạo lối tắt đến CMD.exe thay thế và chuyển lệnh của bạn vào đó không? Bạn có thể làm điều đó cùng với CALL trong trường hợp cửa sổ bảng điều khiển xuất hiện.

+0

Cảm ơn dimoniy. Tôi nghĩ bạn có nghĩa là START (CALL là để gọi các tập tin batch). Dòng lệnh "cmd/c start javaw ...", với phím tắt được cấu hình để khởi động nó trong một cửa sổ thu nhỏ, là một sự thỏa hiệp hợp lý, mặc dù nó là một sự xấu hổ, nó phải tạo ra một cửa sổ. –

0

Trình chạy đơn giản này có thể hữu ích; bạn có thể tạo một hoặc nhiều phím tắt cho nó với các tham số dòng lệnh giống như bạn đã sử dụng trong phím tắt đến 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); 
} 

Để biên dịch trong Visual Studio, bạn sẽ cần phải thay đổi một số thiết lập dự án:

  • Buffer Security Check No trong C/C++ Code Generation
  • Ignore All Libraries Default Yes trong Linker input
  • Entry Point để NoCRTMain trong Linker nâng cao
  • /DYNAMICBASE: NO và/cố định: YES as discussed here

(Hoặc bạn có thể thay đổi chức năng chính từ NoCRTMain để WinMain, nhưng sau đó bạn cần phải cài đặt thời gian chạy C hoặc liên kết nó tĩnh.)

Rõ ràng bạn có thể dễ dàng thay đổi mã để chạy liên kết tượng trưng khác hơn javaw .exe, mặc dù một số chương trình có thể không thích thực tế là argv[0] không trỏ đến tệp thực thi của ứng dụng.

Các vấn đề liên quan