Makale numarası: 164166 - Son Gözden Geçirme: 21 Kasım 2006 Salı - Gözden geçirme: 4.3

Bir Windows NT hizmeti veya Windows NT hizmeti olarak kökenli Visual C++ 4.x MFC uygulaması kullandığınızda bir onay işlemi Wincore.cpp aldığınız

Sistem İpucuBu makale, kullandığınızdan farklı bir işletim sistemine yöneliktir. Sizinle ilgili olmayabilecek makale içeriği devre dışı bırakıldı.

Bu Sayfada

Hepsini aç | Hepsini kapa

Belirtiler

Bir Windows NT hizmeti veya Windows NT hizmeti olarak kökenli Visual C++ 4.x MFC uygulaması kullandığınızda, bir onaylama işlemi Wincore.cpp oluşabilir. Özellikle aşağıdaki satırında _AfxActivationWndProc() oluşur:
  LRESULT CALLBACK
 _AfxActivationWndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
 {

    WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, szAfxOldWndProc);
    ASSERT(oldWndProc != NULL);  // <----- assert occurs here
    .
    .
    .
 }
				
belirtilme <a1>Satır</a1> ile Visual C++ sürüm 4.2 ve 4.2b, Visual C++ sürüm 4.1, <a1>Satır</a1> Visual C++ sürüm 5.0 ve Visual C++ 6.0 ile 389 satırındaki 392 ile 384 satırındaki 385 oluşur.

Neden

MFC alt olmayan-oluşturulan MFC tüm pencereleri belirli etkinleştirme sorunları tanıtıcı. Non-oluşturulan MFC pencere sınıflara sırasında eski pencere yordamı penceresinin özelliklerinde saklanır. Özelleştirmeler için özelliklerini tanımlamak için kullanılan atomları neden olan bir Windows NT oturumunu kapatmadan ve özelliği alınamıyor. Bu onaylama işlemi, yapılmasına neden olur.

MFC Windows NT Hizmetleri için tasarlanmıştır. Onaylama işlemi sonucunda MFC uygulamanın simge durumuna küçültülemez, bir Windows NT hizmetten kökenli ve sonra kullanıcı oturum açtığında, - kapatın, sonra da ortaya çıkar.

Ayrıca bir MFC uygulaması bir hizmet veya bir hizmet olarak bağlantı sırasında göz önünde bulundurulması gereken başka sorunlar var olan aklınızda bulundurun. Ana çerçeve penceresi için OnEndSession() ileti işleyicisi CDocument nesnesi dışında kapatır. Bu nedenle bu gelen oluşmasını engellemek için WM_ENDSESSION iletinin işlenmeli.

Çözüm

Aşağıdakilerden birini yapabilirsiniz:

  • Unsubclass tüm olmayan MFC pencerelerini kapatma veya WM_ENDSESSION işleyicisinde olarak gibi oturum kapatma sırasında bazı zaman.
  • MFC kodunu değiştirmek ve MFC kitaplıklarını yeniden oluşturun. Bu durumda, MFC kodu olmayan MFC herhangi bir pencerenin sınıflara gelen engellemek veya eski pencere yordamı Özellikleri penceresi yerine bir listede saklayabilirsiniz kodunu değiştirerek değiştirebilirsiniz. Her pencerenin özelleştirmeler gibi (WM_NCDESTROY alınan), arama pencere tanıtıcısı listeniz ve unsubclass, MFC _AfxActivationWndProc() işlevinde yaptığı gibi.
  • GUI hizmet bölümünden uygulamanın bir parçası olarak ayırın. Kullanıcı her oturum açışında, ba?ka bir deyi?le, bir GUI istemci başlatması gerekir. Daha sonra bazı adlandırılmış yöneltmeler veya yuva gibi işlemler arası iletişim için formu aracılığıyla hizmeti konuşun GUI istemci sağlayın. Hizmetin, verileri korumak ve, oturum açarken her zaman yukarı GUI başlatır.
Karıştırılmış penceresini etkinleştirme sorunları genelde işlenecek MFC alt olmayan MFC windows. Örneğin, bunu uygun etkinleştirme toplevel pencerelerin yerinde OLE etkinleştirme yaparken sağlar. Ayrıca, kullanıcı bir uygulamanın parçası olan devre dışı bırakılmış bir pencerede tıklattığında son etkin iletişim kutusu etkin sağlar. Normal olarak, bilgisayarınızda bir kalıcı iletişim kutusu sahibi olan bir ana pencere ve kayan bir araç çubuğu gibi bazı diğer açılan pencereyi ve etkinleştirme, başka bir uygulamaya geçin ve kalıcı bir iletişim kutusu tarafından devre dışı bırakılmış araç çubuğunu tıklatın, Windows bip sesi çıkarıyor ve uygulama etkinleştirmez. Kalıcı iletişim kutusu, araç çubuğunda tıklattığınızda üstüne hazırlanmıştır MFC sağlar. MFC windows MFC oluşturulan ve non-oluşturulan MFC Windows bu etkinleştirme sorunları tüm işler unutmayın. Eski pencere yordamı, yalnızca olmayan MFC pencereler için pencere ile ilişkili bir özelliği olarak depolanır. Varsa, unsubclass olmayan MFC windows (ilk yöntem yukarıda önerdiği), yine de bu etkinleştirme özellikleri MFC CWnd türetilmiş nesneleri olarak oluşturulan tüm windows alın.

Unsubclassing olmayan-MFC pencereleri

Yukarıda listelenen ilk teknik bir uygulama zaten yazdınız ve istemiyorsanız tasarımlarını rework, MFC kitaplıklarını yeniden veya etkinleştirme tanıtıcı gerekmez geliştiriciler için kolay bir geçici çözüm, MFC tanıtıcıları sorunları olabilir.

Unsubclass MFC Windows olmayan ana çerçeve pencerenizin WM_ENDSESSION işleyicisindeki kullanabilirsiniz. Aşağıdaki örnek kod, tüm işlem ve unsubclass pencerelerini Numaralandırılacak gösterilmiştir bunları: için Visual C++ 4.x ve Visual C++ 5.0:
    static const TCHAR szAfxOldWndProc[] = _T("AfxOldWndProc");  
				
Visual C++ 6.0:
    static const TCHAR szAfxOldWndProc[] = _T("AfxOldWndProc423");  // Visual C++ 6.0
				
ve işlevleri ekleyin:
    BOOL CALLBACK EnumProc( HWND hWnd, LPARAM lParam)
 {
    //check for property and unsubclass if necessary
    WNDPROC oldWndProc = (WNDPROC)::GetProp(hWnd, szAfxOldWndProc);
    if (oldWndProc!=NULL)
    {
       SetWindowLong(hWnd, GWL_WNDPROC, (DWORD)oldWndProc);
       RemoveProp(hWnd, szAfxOldWndProc);
    }

    return TRUE;

 }

 void CMainFrame::OnEndSession(BOOL bEnding)
 {
    // unsubclass the non-MFC windows which MFC has subclassed
    DWORD dwProcessId;

    DWORD dwThreadId= GetWindowThreadProcessId(m_hWnd,&dwProcessId);
    EnumThreadWindows(dwThreadId, EnumProc,(LPARAM) dwThreadId);

 }
				

Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • Microsoft Visual C++ 4.0 Standard Edition
    • Microsoft Visual C++ 4.1 Aboneliği
    • Microsoft Visual C++ 4.2 Enterprise Edition
    • Microsoft Visual C++ 4.2 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual Studio 2005 Professional
  • Microsoft Visual Studio 2005 Standard Edition
  • Microsoft Visual Studio 2005 Team System Architect Edition
  • Microsoft Visual Studio 2005 Team System Developer Edition
  • Microsoft Visual Studio .NET 2003 Professional Edition
  • Microsoft Visual Studio .NET 2003 Enterprise Architect
  • Microsoft Visual Studio .NET 2003 Enterprise Developer
Anahtar Kelimeler: 
kbmt kberrmsg kbtshoot kbcode kbdocview kbprb kbservice kbuidesign KB164166 KbMttr
Otomatik TercümeOtomatik Tercüme
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:164166  (http://support.microsoft.com/kb/164166/en-us/ )