2009-08-01 33 views
11

Dưới hệ điều hành POSIX có tín hiệu API cho phép gửi tín hiệu để xử lý để tắt nó với lệnh giết và bạn có thể bắt nó với sigaction và làm những gì bạn cần;Tương tự Win32 API gửi/bắt SIGTERM

Tuy nhiên, Win32 không phải là hệ thống POSIX, vì vậy:

  • Làm thế nào tôi có thể xử lý các sự kiện tắt máy mà có thể đến, ví dụ từ "End Process" trong "công tác quản lý"?
  • API tiêu chuẩn để gửi tín hiệu tắt máy đến ứng dụng Win32 là gì?

Tôi không nói về GUI, tôi đang nói về máy chủ TCP/IP cần được tắt độc đáo. rằng không chạy như dịch vụ cửa sổ.

Trả lời

2

Bạn nhận được một thông điệp WM_QUIT trên sợi tạo ra đầu tiên của bạn.

Khi bạn không xử lý, quá trình của bạn sẽ bị tắt cưỡng bức.

Vì vậy, chỉ cần triển khai hàng đợi thư trong chuỗi đầu tiên của bạn, tìm kiếm thông báo WM_QUIT

+1

Bạn nên xử lý WM_CLOSE. "Thông báo WM_QUIT không liên kết với một cửa sổ và do đó sẽ không bao giờ được nhận thông qua quy trình cửa sổ của cửa sổ. Nó chỉ được lấy bởi các hàm GetMessage hoặc PeekMessage." -MSDN – Indy9000

+0

Tôi có thể sử dụng cùng một phương thức cho Bảng điều khiển Ctrl + C và cho quá trình runnig như dịch vụ Windows không? Hoặc tôi nên sử dụng các phương pháp khác nhau cho mỗi người trong số họ? – Artyom

3

Có thể là Windows Power Management từ MSDN sẽ hữu ích. Nhưng nó đề cập đến các sự kiện hệ thống hơn là cho mỗi quá trình.

Để xử lý, bạn có thể phát hiện sự chấm dứt với WM_CLOSE. Bạn sẽ cần phải xử lý các tin nhắn cửa sổ. Nếu đó là một ứng dụng giao diện điều khiển, bạn sẽ cần phải cài đặt một trình điều khiển điều khiển; hãy nhìn vào SetConsoleCtrlHandler trên MSDN

4

MSDNs Unix Mã Hướng dẫn di chuyển có một chương riêng về Win32 code conversion and signal handling.
Mặc dù Microsoft đã quyết định lưu trữ hướng dẫn tuyệt vời này, nó rất hữu ích.

Ba phương pháp được mô tả: các đối tượng
tín hiệu Native
Event
Tin nhắn

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