Thiết lập Inno không thể xóa thành phần trong quá trình gỡ cài đặt vì chương trình của tôi vẫn đang chạy và không thể xóa tệp thực thi. Làm cách nào để kiểm tra xem nó có đang chạy trước khi cho phép gỡ cài đặt không?Gỡ cài đặt không thành công vì chương trình đang chạy. Làm thế nào để thiết lập Inno Setup kiểm tra quá trình chạy trước khi thử xóa?
Trả lời
Kiểm tra những
Inno Setup: Detect instances running in any user session with AppMutex
Inno Setup: Is application running?
Inno Setup: Detect if an application is running
Có một số cách. Nếu chương trình của bạn định nghĩa một mutex sử dụng
[Setup]
AppMutex=MyMutexName
hoặc cho một mutex quy định tại phần Code
function CheckForMutexes (Mutexes: String): Boolean;
Bạn cũng có thể sử dụng
function FindWindowByClassName (const ClassName: String): Longint;
để có được xử lý cửa sổ theo tên lớp và gửi tin nhắn.
Hoặc có được nó bằng tên
function FindWindowByWindowName (const WindowName: String): Longint;
Hoặc bạn sử dụng một trong số các file DLL đối với trường hợp sử dụng cụ thể này
Hoặc làm điều đó chính bạn sau khi đọc
How To Terminate an Application "Cleanly" in Win32
How To Enumerate Applications Using Win32 APIs (này một liên kết đến các phiên bản tiếng Đức như đối với một số lý do tôi không thể tìm thấy phiên bản tiếng anh của KB175030
hoặc thử google dịch phiên bản của KB175030-DE
Chúng tôi đã sử dụng cách khác với mô tả ở trên. Bởi vì đây là một quá trình gỡ cài đặt, chúng tôi có thể hủy ứng dụng và hủy bỏ ứng dụng đó. Cách đơn giản nhất, khi u không thể sử dụng AppMutex: (liên quan đến Really killing a process in Windows)
[UninstallRun]
Filename: "{cmd}"; Parameters: "/C ""taskkill /im <precessname>.exe /f /t"
Hope ai đó sẽ giúp này. Tôi đã tìm kiếm một thời gian dài cho việc này.
'Taskkill' có giết nhiều hơn một cá thể đang chạy của cùng một tiến trình không? – TLama
Đã thử với notepad.exe và nó hoạt động rất tốt. Nó sẽ giết ứng dụng mà không có phản hồi. – kdoteu
Cảm ơn! Yup, nó sẽ giết tất cả các trường hợp trừ khi bạn chạy thiết lập với các đặc quyền thấp hơn quá trình được nâng lên. [+ 1ed anyway :)] – TLama
Hãy thử giải pháp này! Tôi đã gặp sự cố với các giải pháp khác khi đóng ứng dụng, nhưng Inno Setup vẫn cho rằng các tệp đã cài đặt đã bị khóa.
Hãy nhớ để xác định hằng số của bạn:
#define MyAppName "AppName"
#define MyAppExeName "AppName.exe"
[Code]
function InitializeUninstall(): Boolean;
var ErrorCode: Integer;
begin
ShellExec('open','taskkill.exe','/f /im {#MyAppExeName}','',SW_HIDE,ewNoWait,ErrorCode);
ShellExec('open','tskill.exe',' {#MyAppName}','',SW_HIDE,ewNoWait,ErrorCode);
result := True;
end;
đạo cụ chính để các original source of this solution.
Điều này là tuyệt vời, một điều mà tôi đã thay đổi là sử dụng một thủ tục khác thay vì "function InitializeUninstall(): Boolean;" do thực tế là chức năng này sẽ giết chết ứng dụng ngay cả khi người dùng hủy bỏ quá trình gỡ cài đặt trong khi "thủ tục InitializeUninstallProgressForm;" sẽ chỉ chạy nếu anh ấy xác nhận gỡ cài đặt. –
Sử dụng AppMutex
directive để ngăn trình gỡ cài đặt tiếp tục, khi ứng dụng đang chạy.
[Setup]
AppMutex=MyProgMutex
Ứng dụng phải tạo mutex được chỉ định bởi chỉ thị. Xem tài liệu hướng dẫn AppMutex
được liên kết để biết ví dụ.
Nếu bạn muốn có chương trình cài đặt diệt các ứng dụng, khi nó vẫn đang chạy, sử dụng mã này để thay thế:
function InitializeUninstall(): Boolean;
var
ErrorCode: Integer;
begin
if CheckForMutexes('MyProgMutex') and
(MsgBox('Application is running, do you want to close it?',
mbConfirmation, MB_OKCANCEL) = IDOK) then
begin
Exec('taskkill.exe', '/f /im MyProg.exe', '', SW_HIDE,
ewWaitUntilTerminated, ErrorCode);
end;
Result := True;
end;
Như với AppMutex
chỉ thị trên, các ứng dụng có để tạo ra các mutex được chỉ định trong cuộc gọi CheckForMutexes
.
Lưu ý rằng đối với trình cài đặt, bạn không phải viết mã này. Trình cài đặt đã khởi động lại trình quản lý được tích hợp sẵn.
Xem Kill process before (re)install using "taskkill /f /im" in Inno Setup.
- 1. Chạy trình cài đặt khác trong cài đặt Inno Setup
- 2. Làm thế nào để chạy một tệp trước khi thiết lập với Inno Setup
- 3. Cài đặt Inno Setup có thể chạy được (cài đặt trình điều khiển) trong khi cài đặt
- 4. Làm thế nào để kiểm tra với thiết lập inno, nếu một quá trình đang chạy tại một cửa sổ 2008 r2 64bit?
- 5. Chạy devenve.exe/setup sau khi gỡ cài đặt trong Wix
- 6. Làm thế nào để kiểm tra xem quá trình vẫn chạy trước khi gọi Process.GetProcessById?
- 7. Làm cách nào để thực hiện chương trình trước khi quá trình gỡ cài đặt bắt đầu?
- 8. Cài đặt Inno: Cách đặt trình cài đặt "Chạy với tư cách quản trị viên"?
- 9. Cài đặt Inno - làm cách nào để chương trình của tôi chạy khi người dùng đăng nhập vào Windows?
- 10. Trình cài đặt MSI không thành công mà không xóa cài đặt trước
- 11. Kiểm tra Nếu quá trình đang chạy từng phút
- 12. Cài đặt Inno: Ẩn/Tắt thành phần khi chạy
- 13. Cách nâng cấp cài đặt MSI bằng trình cài đặt Inno Setup?
- 14. Bootstrapper: Kiểm tra xem msi phiên bản được cài đặt trước khi chạy
- 15. Làm cách nào để kiểm tra xem chương trình có đang chạy lần đầu tiên không?
- 16. Lập trình kiểm tra xem quá trình đang chạy trên máy Mac
- 17. cài đặt lại android không thành công sau khi tắt hoạt động của trình khởi chạy
- 18. Kiểm tra xem ứng dụng có đang chạy trong NSIS hay không trước khi gỡ cài đặt
- 19. Kiểm tra lập trình nếu syncdb đang chạy
- 20. Làm thế nào để chạy "gói" trước khi thử nghiệm "
- 21. Trình khởi chạy nào đang chạy?
- 22. Thời gian chạy chương trình đang chạy
- 23. Làm cách nào để kiểm tra quá trình đang chạy với Ruby?
- 24. Tại sao Visual Studio Setup Project của tôi khởi chạy IE khi quá trình cài đặt hoàn tất?
- 25. Thiết lập Inno: Làm cách nào để xem đầu ra (bản dịch) của Bộ xử lý cài đặt Inno?
- 26. Làm thế nào để đảm bảo chương trình thiết lập sẽ chạy với quyền quản trị viên?
- 27. Làm cách nào để gỡ lỗi chương trình C++ đang chạy trong Linux?
- 28. Làm thế nào để gỡ lỗi "Cài đặt Kiểm tra thất bại" lỗi trong Mac App Pkg trình cài đặt?
- 29. C# - làm thế nào để kiểm tra xem một quá trình được bắt đầu thành công
- 30. Loại nào để sử dụng, Trình cài đặt Visual Studio hoặc Thiết lập Inno?
Câu trả lời thú vị. Rất kỹ lưỡng; cảm ơn bạn! Các tùy chọn mutex toàn cầu mất 5 phút để làm cho nó đúng! Không có gì tốt hơn thế. – max
Bạn có câu trả lời cho tệp dựa trên mạng có thể được mở trên bộ nhớ của máy tính khác không? – none
Phiên bản tiếng Anh mới nhất của KB 175030 mà tôi có thể tìm thấy trên Máy Wayback là từ tháng 2 năm 2007: http://web.archive.org/web/20070216103757/http://support.microsoft.com/kb/175030. –