2011-08-30 30 views
11

Win32 API kullanılarak yazılmış bir C++ Win32 uygulamasına sahibim ve bu işlevlerden birinde çıkmak için zorlamak istiyorum. Exit() veya Destroy() veya Abort() gibi bir şey var mı? Pencereli bir uygulamadan çıkmanın standart, zarif yoluNasıl Win32 uygulaması API ile çıkmak için?

+1

Olmak için ne kadar güçlü ihtiyacınız var? –

+1

Eh, sadece orada, devam etmeden çıkın. – bodacydo

cevap

1

ExitProcess kullanmak fonksiyonudur, başka bütünlüğünü sağlamak ne unutmayın exit kullanabilirsiniz kapatma (yani: çok sayıda sızıntı tutamağı vb. ve iş parçacıklı işlemleri bir işlemden geçirildiyse bile, bir db işlemi gibi sonlandırılır)

12

.

Bu, hemen çıkmak değil, ana döngü tarafından ayrıştırılacak bir bırakma iletisi (doğru olarak yapılırsa) gönderir ve sonra uygulamayı bırakır.

5

Uygun bir pencere yordamı olan bir Win32 uygulaması kullanıyorsanız, PostQuitMessage işlevini kullanabilirsiniz.

2

Sadece WinMain işlevinden döner. Bir mesaj döngünüz varsa, patlak vermek için PostQuitMessage kullanın. İşlemin ortasında yürütmeyi denemeyin; özensiz.

25

Aiiieeeeeeeeeeee. Bu şeylerden hiçbirini yapmayın!

  • çıkış() ve ExitProcess silah alıp yüzüne sürecini çekim eşdeğerdir. Umarım bunun neden iyi olmadığını açıklamak zorunda değilim, özellikle de sistem çapında olabilecek veritabanı tanıtıcıları gibi paylaşılan nesneleri tutan işlemler için. Android'de bu norm olduğunu biliyorum, ama bu Windows ve biz bunu burada yapmıyoruz.

  • PostQuitMessage() öğesinin aranması doğrudan bellek sızıntılarına neden olabilir. PostQuitMessage() WM_DESTROY'den çağrılmak üzere tasarlanmıştır. Pencerenin kapatılmasını istemek için kullanılması amaçlanan bir mesaj DEĞİLDİR. Uygulamaların çıkış kodlarını kabuklara geri göndermeleri için bir geri çağırma mekanizması. WM_QUIT'i uygulama çıkış koduyla doldurmak amaçlanmıştır. Doğrudan PostQuitMessage() 'i çağırırsanız, WM_DESTROY'yi tamamen atlarsınız. Bu sorunludur, çünkü birçok pencere - ve çocuk widget'ları - çok doğru perform their clean-up in WM_DESTROY. Bu mesajı pencereye bakarak atlarsanız, bileşenlerin temizleme şansını reddedersiniz.

  • Ve konuyla ilgili olduğumuza göre, WM_DESTROY doğrudan arama yapmıyor. Microsoft'un Raymond Chen'in, harika bir makalesi var. O, "Sending a window a WM_DESTROY message is like prank calling somebody pretending to be the police". PostQuitMessage'ın kötülük ikizlerinden biri. Temizleme yapmadan çıkmak yerine, pencereden çıkmadan temizlik yapmasını istiyorsun. Pencere yöneticisi, bileşenleri çıkarmayı asla bilemez ve bellekte ölü bir yetim pencereyle kaldınız. İç çekmek.

doğru cevap WM_CLOSE göndermektir. Varsayılan pencere yordamını kullanan herhangi bir şey, WM_DESTROY için daha sonra WM_QUIT olarak tasarlanan pencereyi yok etmek için pencere yöneticisini doğru şekilde bilgilendirecektir.

Standart kapanıştan farklı bir davranışa ihtiyacınız varsa, diğer alternatif bir WM_USER veya WM_APP mesajı oluşturmaktır. Pencerenizin "süslü" bir WM_CLOSE varsa - örneğin, kullanıcıya "Çıkmak istediğinizden emin misiniz?" Sorusunu iletin - ve bunu atlamak istiyorsanız, WM_USER ile özel bir ileti tanımlayabilirsiniz veya WM_APP ve bunu kendi yerine çağırın. Uygulamanızın tanımladığı mesajınız varsayılan yakın davranışı uygular ve sistem araçlarına bağlı WM_CLOSE, fantezi davranışınızı gerçekleştirir.

Umarım bu yardımcı olur!

İlgili konular