FIX: CWindow::GetTopLevelWindow() Returns NULL (168123)



The information in this article applies to:

  • The Microsoft Active Template Library (ATL) 2.1
  • The Microsoft Active Template Library (ATL) 3.0

This article was previously published under Q168123

SYMPTOMS

A call to CWindow::GetTopLevelWindow() always returns NULL.

CAUSE

This is due to a bug in the function.

RESOLUTION

Change the function in AtlWin.cpp from:
   HWND CWindow::GetTopLevelWindow() const
   {
      ...
      while(hWndTmp != NULL)
      {
         hWndTmp = (::GetWindowLong(hWndParent, GWL_STYLE) & WS_CHILD) ?
            ::GetParent(hWndParent) :
            ::GetWindow(hWndParent, GW_OWNER);

         hWndParent = hWndTmp;
      }

      return hWndParent;
   }
				
to the following:
   HWND CWindow::GetTopLevelWindow() const
   {
      ...
      while(hWndTmp != NULL)
      {
         // Modification
         hWndParent = hWndTmp;

         hWndTmp = (::GetWindowLong(hWndParent, GWL_STYLE) & WS_CHILD) ?
            ::GetParent(hWndParent) :
            ::GetWindow(hWndParent, GW_OWNER);

      }

      return hWndParent;
   }
					

STATUS

Microsoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. This problem was corrected in Visual C++ version 6.0 for Windows.

(c) Microsoft Corporation 1997, All Rights Reserved. Contributions by Sridhar Madhugiri, Microsoft Corporation

Modification Type:MajorLast Reviewed:10/2/2003
Keywords:kbATL300fix kbATLWC kbBug kbfix kbInprocSvr kbServer kbVC600fix KB168123