2013-04-09 14 views
5

Düzgün çalışması için Windows Wifi hizmetini durdurması gereken bir iletişim tabanlı MFC uygulamasına sahibim, ancak uygulamadan çıktığında yeniden etkinleştirmek istiyorum.MFC uygulaması sonlandırıldığında özel kod çalıştır: d'tor veya WM_CLOSE?

Ana iletişim sınıfının yıkıcısı içinde hizmeti yeniden başlatan kodu koyacağımı düşündüm.

Şimdi, diğerlerinin program sonlandırma sırasında çalıştırılması gereken kodlarını WM_CLOSE ileti işleyicisine koymaları dikkatimi çekti.

Her iki yol da işe yarıyor gibi görünüyor, ancak iki yönden dezavantaj olup olmadığını bilmek istiyorum.

+3

Genelde bir "WM_DESTROY" işleyicisine koydum ama bunu yok ediciye tercih ediyorum çünkü MFC altyapısının hala canlı olacağını biliyorum ve dtor'a ulaştığımda emin değilim :-) Genellikle, yığın ayırmalarını silmek için dtoru ayırırım. –

cevap

3

MFC iletişim tabanlı uygulama için ana iletişim kutusu DoModal çağrısından hemen sonra, sonlandırma kodunu InitInstance yöntemine uygulayabilirsiniz. Diğer MFC uygulama türleri için (MDI, SDI) sonlandırma kodu genellikle ExitInstance yöntemine yerleştirilir.

Diyaloga dayalı uygulama ile SDI/MDI uygulamaları arasındaki fark, diyalog tabanlı uygulamalarda InitInstance'un FALSE değerini döndürmesi ve uygulama çıkmasıdır - tüm eylemler ana iletişim kutusu DoModal çağrısında gerçekleştirilir.

Tüm uygulama türleri için ExitInstance kullanmayı tercih edebilirsiniz, ayrıca çalışmalıdır.

Düzenle. İletişim sınıfının içinde temizleme kodu yapmak istiyorsanız, WM_DESTROY (daha önce Roger Rowland tarafından belirtilmiştir), WM_CLOSE'dan daha iyi bir yerdir. Bazen WM_CLOSE mesajını kullanabiliriz ve bir diyalogun kapanmasını önleyebiliriz, örneğin "Programdan çıkılsın mı? Evet - Hayır" diye sorabiliriz. Bazı alt pencereleri kullanmak istediğinizde, bunlar WM_CLOSE ve WM_DESTROY ileti işleyicilerinde bulunur ve bir iletişim nesnesinde yoktur. Ayrıca, ana iletişim bozucusu çağrıldığında ileti kuyruğu mevcut değildir, bu durumda Windows mesajlaşmasını kullanmamalısınız.

3

Simetriyi korumayı hedefleyin: Eğer bir kurucuda wifi servisini durdurursanız, aynı sınıfın destructor'ında yeniden başlatın. Bunun yerine hizmeti InitInstance'da durdurursanız, ExitInstance; WM_CREATE veya başka bir iletiye yanıt olarak, WM_CLOSE, vb. yeniden başlatın.

Oluşturucular ve yıkıcılar, bir hata durumu döndürmenin bir yolu yoktur, bu nedenle normal olarak başlatma ve bellek ayırma gibi basit görevler için daha uygundurlar/serbest bırakma. Böyle WM_CLOSE olarak

InitInstance ve ExitInstance

yanı sıra pencereler mesajları, gerekirse hata iletileri görüntülemek için, ya da şartlarını hata yanıt olarak iptal etmek uygulamanın ömrü boyunca iyi bir noktada olur.

İlgili konular