Düzeltme: bir iletişim kutusu, Visual C++ ile oluşturulduğunda CDialog::Create() işlevi hatalı bir değer verir

Makale çevirileri Makale çevirileri
Makale numarası: 193099 - Bu makalenin geçerli olduğu ürünleri görün.
Bu makale arşivlenmiştir. "Olduğu gibi" sunulmaktadır ve bundan sonra güncelleştirilmeyecektir.
Hepsini aç | Hepsini kapa

Bu Sayfada

Belirtiler

CDialog::Create() işlevi, bir iletişim kutusu CDialog::Create() çağrı ve iletişim kutusunun OnInitDialog() (iletiye yanıt olarak WM_INITDIALOG içinde) biter EndDialog() aracılığıyla iletişim kutusu oluşturulursa, sıfır olmayan bir değer döndürür. Bu durumda, CDialog::Create() sıfır döndürmesi gerekir.

Iletişim kutusu nedeniyle için bir iletişim kutusu kullanıcının OnInitDialog() EndDialog() çağrısında özelleştirmeler, çünkü bu durumda CDialog::m_hWnd NULL olur.

Neden

NULL pencere tanıtıcısı olsa bile, Create() izleyen için müşteri adayları WM_INITDIALOG kodu (Dlgcore.cpp 365 satırında), ek bir sınama yapıldı.

Visual C++ 5.0 MFC kodu:
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,

      CWnd* pParentWnd, HINSTANCE hInst)

   {

      // ...

      if (hWnd == NULL)
      {
         // ...
         // .. dump some debug information
         return FALSE;
      }

      ASSERT(hWnd == m_hWnd);
      return TRUE;
   }
				
MFC kodunu Visual C++ 6.0:
BOOL CWnd::CreateDlgIndirect(LPCDLGTEMPLATE lpDialogTemplate,

      CWnd* pParentWnd, HINSTANCE hInst)

   {

      // ...
      // Help with error diagnosis (only if WM_INITDIALOG didn't
      // EndDialog())
      if (hWnd == NULL && (m_nFlags &amp; WF_CONTINUEMODAL)) // <--- PROBLEM!!!

{
         // ... dump some debug information.
         return FALSE;
      }

      ASSERT(hWnd == m_hWnd);
      return TRUE;

   }
				

Çözüm

Ne zaman CDialog::Create çağrılıyor denetleyin CDialog::Create() dönüş değeri hem CDialog::m_hWnd değeri. CDialog::m_hWnd null (BOş) olduğunda, iletişim kutusu oluşturma başarısız olur.

Durum

Microsoft bu hatanın bu makalenin başında listelenen Microsoft ürünlerinde bulunduğunu onaylamıştır. Bu hata, Visual Studio 6.0 Service Pack 1'de giderilmiştir.

Bu hizmet paketini edinmek için <a0></a0>, lütfen bkz:
http://msdn2.microsoft.com/en-us/vstudio/Aa718362.aspx
Visual Studio 6.0 Service Pack 1 hakkında daha fazla bilgi için lütfen aşağıdaki Microsoft Knowledge Base'deki makaleleri bakın:
193009 INFO: Visual Studio 6.0 Service Pack 1 Readme

194022 Visual Studio 6.0 service packs, what, where, why

194295 How To Tell That a Visual Studio Service Pack Is Installed

Daha fazla bilgi

Ayrıca, CDialog::m_hWnd değişken karşı denetler; bu nedenle, iletişim kutusunu görüntülemek için bu kodu değiştirebilirsiniz. Örneğin:
 
   // Create a modeless dialog box. In this example, m_pModeless is a
   // member variable of type CModeless where CModeless is a CDialog-
   // derived class. IDD_MODELESS is the ID number of a dialog-box template
   // resource.
   m_pModeless = new CModeless;
   if (m_pModeless->Create(IDD_MODELESS, this) &&
      ::IsWindow(m_pModeless->m_hWnd))
   {
      // ... succeeded in dialog-box creation.
   }
   else
   {
      // ... failed in dialog-box creation.
   }
				

Davranışı yeniden oluşturma adımları

  1. MFC örnek engelleyici OLMAYAN MSDN CD'sinden kopyalayın.
  2. ClassWizard CAdderDialog sınıfına bir OnInitDialog() ileti işleyicisinde (iletiye yanıt olarak WM_INITDIALOG) eklemek için kullanın. CAdderDialog CDialog türetilen bir sınıfı ' dir.
  3. EndDialog() CAdderDialog::OnInitDialog() aşağıdaki çağrı:
       BOOL CAdderDialog::OnInitDialog()
       {
          CDialog::OnInitDialog();
    
          // TODO: Add extra initialization here
          EndDialog(-1);
          return TRUE;  // return TRUE unless you set the focus to a control
                   // EXCEPTION: OCX Property Pages should return FALSE
       }
    					
  4. Win32 sürüm oluşturma, VC seçin ++ 's Build\Set Active yapılandırma menü komutu.
  5. Oluşturup sonra da engelleyici OLMAYAN örnek çalıştırın.
  6. Iletişim kutusundaki Ekle'yi tıklatın. TRUE, bu durumda, Ekle düğmesini (CAdderDialog engelleyici olmayan iletişim kutusunu görüntülemek için) neden Modeldlg.cpp dosyasında (178 satırında) m_pModeless->Create() arama işlevi devre dışı.
(c) Microsoft Corporation 1999, tüm hakları saklıdır. Katkıyı Yeong Kah Tam, Microsoft Corporation.

Özellikler

Makale numarası: 193099 - Last Review: 22 Şubat 2014 Cumartesi - Gözden geçirme: 6.2
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft Foundation Class Library 4.2, Ne zaman ne ile kullanilir:
    • Microsoft Visual C++ 5.0 Professional Edition
    • Microsoft Visual C++ 5.0 Enterprise Edition
    • Microsoft Visual C++ 5.0 Learning Edition
    • Microsoft Visual C++ 6.0 Enterprise Edition
    • Microsoft Visual C++ 6.0 Professional Edition
    • Microsoft Visual C++, 32-bit Learning Edition 6.0
Anahtar Kelimeler: 
kbnosurvey kbarchive kbmt kbfunctions kbqfe kbbug kbdlg kbfix kbnoupdate kbvc600sp1fix kbvs600sp1fix KB193099 KbMttr
Machine-translated Article
Ö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:193099

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com