2010-12-24 10 views
5

Tôi có chức năng cập nhật trong ứng dụng - nó tải xuống và xác minh trình cài đặt (setup.exe, được tạo bằng NSIS). Để thực sự bắt đầu cập nhật, tôi đã thực hiện một cách đơn giản:QProcess :: startDetached bị chặn bởi UAC (chạy trình cập nhật)

QString path = .. absolute path to the downloaded file ... 
QProcess::startDetached(path, QStringList()); 

Điều này hoạt động tốt trên XP - nhưng trên Vista và Win7, không có gì xảy ra khi quá trình tải xuống hoàn tất. Nếu tôi duyệt đến bản cập nhật đã tải xuống và chạy nó theo cách thủ công, nó hoạt động tốt. Tôi cho rằng những gì đang xảy ra là UAC đang chặn trình cài đặt tại thời điểm CreateProcess, nhưng đây là nơi kiến ​​thức của tôi hết.

Biến chứng khác - khi tôi đang chạy bản dựng gỡ lỗi từ dòng lệnh, các bước ở trên hoạt động - Tôi nhận được lời nhắc UAC và có thể chạy trình cài đặt. Đó là bản phát hành được xây dựng, bắt đầu tạo biểu mẫu trình đơn bắt đầu/lối tắt, có vấn đề - Tôi cho rằng có sự khác biệt trong mã thông báo xác thực khi chạy từ trình bao lệnh.

Trả lời

3

Nếu bạn không phải là quản trị viên và bạn gọi CreateProcess() trên .exe có biểu thức "Vista" (hoặc không có tệp kê khai, nhưng .exe mà cửa sổ phát hiện dưới dạng trình cài đặt (bao gồm NSIS)) bạn cần sử dụng ShellExecute[Ex](). ShellExecute sẽ kích hoạt UAC nhắc nếu cần thiết ...

1

này có vẻ là một lỗi Qt, xem QTBUG-9761, thực hiện giải pháp đúng là sử dụng ShellExecute với lpOperation thiết lập để runas.

+0

Sử dụng runas động từ sẽ _force_ UAC độ cao, nếu bạn không chỉ định một động từ , ShellExecute sẽ tự tìm ra nó ... – Anders

+0

Chính xác, cảm ơn thông tin bổ sung. – ismail

7

Bạn cũng có thể sử dụng

QDesktopServices::openUrl(QUrl::fromLocalFile(path)); 

Có thể ngạc nhiên và phản trực giác, nhưng nó hoạt động và nhiều cross-platform

+0

Giải pháp tuyệt vời. Điều này thực sự gọi ShellExecute ở chế độ nền. Vấn đề duy nhất tôi thấy là nó không mang cửa sổ UAC lên đầu –