2013-04-09 36 views
5

Tôi có một ứng dụng MFC dựa trên hộp thoại cần dừng dịch vụ Windows Wifi để chạy chính xác, nhưng tôi muốn kích hoạt lại khi ứng dụng của tôi thoát.Chạy mã tùy chỉnh khi ứng dụng MFC bị chấm dứt: d'tor hoặc WM_CLOSE?

Vì vậy, tôi nghĩ tôi sẽ đặt mã khởi động lại dịch vụ trong trình phá hủy của lớp hộp thoại chính.

Bây giờ tôi đã chú ý rằng những người khác đặt mã của họ sẽ được chạy trong khi chấm dứt chương trình vào trình xử lý tin nhắn WM_CLOSE.

Cả hai cách đều có vẻ hiệu quả, nhưng tôi muốn biết nếu có bất kỳ cách nào.

+3

Tôi thường đặt nó vào trình xử lý 'WM_DESTROY', nhưng tôi thích điều đó hơn với trình phá hủy vì tôi biết cơ sở hạ tầng MFC sẽ vẫn còn sống và khi tôi đến dtor, tôi không chắc chắn :-) Thông thường tôi dự trữ các dtor cho chỉ cần xóa phân bổ heap. –

Trả lời

3

Đối với ứng dụng dựa trên hộp thoại MFC, bạn có thể đặt mã quyết toán theo phương thức InitInstance của lớp ứng dụng, ngay sau khi cuộc gọi thoại DoModal được thực hiện. Đối với các loại ứng dụng MFC khác (MDI, SDI), mã quyết toán thường được đặt ở phương thức ExitInstance.

Sự khác biệt giữa ứng dụng dựa trên hộp thoại và ứng dụng SDI/MDI, là InitInstance trong ứng dụng dựa trên hộp thoại trả về FALSE và thoát ứng dụng - tất cả hành động được thực hiện trong cuộc gọi thoại chính DoModal.

Bạn có thể thích sử dụng ExitInstance cho tất cả các loại ứng dụng, nó cũng sẽ hoạt động.

Chỉnh sửa. Nếu bạn muốn làm cho mã dọn dẹp bên trong của lớp hộp thoại, WM_DESTROY (đã được đề cập bởi Roger Rowland) là nơi tốt hơn so với WM_CLOSE. Đôi khi, chúng tôi có thể xử lý thông báo WM_CLOSE và ngăn hộp thoại đóng, ví dụ: bằng cách yêu cầu "Thoát khỏi chương trình? Có - Không". Trong trường hợp bạn muốn sử dụng một số cửa sổ con, chúng tồn tại trong các trình xử lý tin nhắn WM_CLOSEWM_DESTROY và không tồn tại trong trình phá hoại hộp thoại. Ngoài ra, hàng đợi tin nhắn không tồn tại khi hộp thoại hủy chính được gọi, do đó bạn không nên sử dụng tính năng nhắn tin Windows trong trường hợp này.

3

Nhằm duy trì tính đối xứng: nếu bạn dừng dịch vụ wifi trong một hàm khởi tạo, hãy khởi động lại nó trong cùng một hàm hủy. Thay vào đó, nếu bạn ngừng dịch vụ trong InitInstance, bạn sẽ khởi động lại dịch vụ trong ExitInstance; nếu như một phản ứng với WM_CREATE hoặc một số thông báo khác, sau đó khởi động lại nó trong WM_CLOSE, v.v.

Constructors and destructors không có cách nào trả về trạng thái lỗi, vì vậy chúng phù hợp hơn cho các tác vụ đơn giản như khởi tạo và cấp phát bộ nhớ/deallocation.

InitInstanceExitInstance, cũng như các thông báo cửa sổ như WM_CLOSE, xảy ra ở vị trí tốt trong thời gian của ứng dụng để hiển thị thông báo lỗi nếu cần hoặc hủy để đáp ứng với điều kiện lỗi.

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