2009-10-16 41 views

Trả lời

20

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

KB175030 DE -> EN

+1

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

+0

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

+0

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. –

14

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.

+0

'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

+1

Đã 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

+2

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

6

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.

+1

Đ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. –

3

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.

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