TN003: mapeamento de identificadores do Windows para objetos
Essa observação descreve as rotinas de MFC que dão suporte a identificadores de objeto do windows do para objetos C++.
O problema
Os objetos do windows geralmente são representados por vários objetos de ALÇA os identificadores de objeto do windows da quebra automática das classes MFC com C++ objeto. O identificador que envolve funções da biblioteca MFC da classe permite localizar o objeto do C++ que está encapsulando o objeto que tem um identificador específico. No entanto, às vezes um objeto não tiver o objeto de wrapper c criando e essas hora do sistema cria um objeto temporário para atuar como o wrapper C++.
O objeto que os mapas do identificador de uso são os seguintes:
HWND (CWnd e CWnd- classes derivadas)
HDC (CDC e CDC- classes derivadas)
HMENU (CMenu)
HPEN (CGdiObject)
HBRUSH (CGdiObject)
HFONT (CGdiObject)
HBITMAP (CGdiObject)
HPALETTE (CGdiObject)
HRGN (CGdiObject)
HIMAGELIST (CImageList)
SOQUETE (CSocket)
Um identificador atribuído a qualquer um desses objetos, você pode localizar o objeto de MFC que encapsula o identificador chamando o método estático FromHandle. Por exemplo, em um HWND chamou hWnd, a linha a seguir retornará um ponteiro para CWnd que encapsula hWnd:
CWnd::FromHandle(hWnd)
Se hWnd não tem um objeto específico de wrapper, CWnd temporário será criado para envolver hWnd. Isso possibilita fazer um objeto válido C++ de qualquer identificador.
Depois que você tiver um objeto de wrapper, você pode recuperar seu identificador de uma variável pública do membro da classe de invólucro. No caso de CWnd, m_hWnd contém o HWND para esse objeto.
Anexando identificadores para objetos MFC
Dado um objeto recém-criado alça- de invólucro e um identificador para o objeto, você pode associar os dois chamando a função de Attach como neste exemplo:
CWnd myWnd;
myWnd.Attach(hWnd);
Isso torna uma entrada no mapa permanente que associa myWnd e hWnd. A chamada CWnd::FromHandle(hWnd) retornará agora um ponteiro para myWnd. Quando myWnd é excluído, o destruidor destruirá automaticamente hWnd chamando a função de DestroyWindow do windows. Se isso não for desejado, hWnd deve ser desanexado de myWnd antes de myWnd ser destruído (normalmente deixando o escopo em que myWnd estiver definido). O método de Detach faz isso.
myWnd.Detach();
Mais objetos temporários
Os objetos temporários são criados sempre que FromHandle é fornecido um identificador que não tem um objeto do wrapper. Esses objetos temporários são desanexados de seu identificador e excluídos por funções de DeleteTempMap . Por padrão CWinThread::OnIdle chama automaticamente DeleteTempMap para cada classe que oferece suporte a mapas temporários do identificador. Isso significa que você não pode assumir um ponteiro para um objeto temporário será válida após o ponto de saída da função onde o ponteiro foi obtido.
Objetos de invólucro e vários threads
Os objetos temporários e permanentes são mantidos em uma base por thread. Isto é, um thread não pode acessar objetos de wrapper de C++ de outro thread, independentemente de se é temporário ou permanente.
Para passar esses objetos de um thread para outro, envie sempre como seu tipo nativo de HANDLE . Passe o objeto de wrapper c criando de um thread para outro fará com que frequência resultados inesperados.