TN003: Mapeamento de Windows manipula a objetos

Esta anotação descreve o MFC rotinas que oferecem suporte a mapeamento Windows objeto identificadores a objetos do C++.

O problema

Objetos do Windows normalmente são representados por lidar coms. As classes do MFC encapsular identificadores de objeto do Windows com C++ objetos. As funções de quebra automática de identificador de biblioteca de classes do MFC fornecem uma maneira de localizar o objeto C++ que é quebra automática o objeto de Windows com um determinado identificador. Há momentos quando um objeto do Windows não tem um objeto de invólucro do C++, no entanto e nestes momentos que um objeto temporário é criado para agir como o invólucro do C++.

Os objetos do Windows que usam mapas de identificador são:

Fornecido um identificador para qualquer um desses objetos, você pode localizar o objeto MFC que envolve a alça, chamando a função de membro estático FromHandle. Por exemplo, dado um HWND chamado hWnd:

CWnd::FromHandle(hWnd)

retornará um ponteiro para o CWnd que envolve o hWnd. Se esse hWnd não tiver um objeto de invólucro específico, um temporária CWnd é criada para quebrar hWnd. Isso torna possível obter um objeto C++ válido de qualquer identificador.

Uma vez que você tem um objeto de invólucro, você pode obter a sua alça através de uma variável de membro público. No caso de um CWnd, m_hWnd contém o HWND para esse objeto.

Anexar identificadores a objetos do MFC

Dado um objeto identificador-wrapper recém-criado e um identificador para um objeto do Windows, você pode associar os dois chamando anexar. Por exemplo:

CWnd myWnd;
myWnd.Attach(hWnd)

Isso cria uma entrada no mapa permanente associando myWnd e hWnd. Chamar CWnd::FromHandle(hWnd) agora retornará um ponteiro para myWnd. Quando myWnd é excluído, o destruidor automaticamente destruirá hWnd chamando o Windows DestroyWindow função. Se isso não for desejado, o hWnd deve desanexado do myWnd antes do objeto myWnd é destruído (normalmente quando sair do escopo no qual myWnd foi definido). A função de membro desanexar faz isso.

myWnd.Detach()

Mais informações sobre objetos temporários

Objetos temporários são criados sempre que FromHandle recebe um identificador que ainda não tiver um objeto de invólucro. Esses objetos temporários são desanexados do seu punho e excluídos pelas funções DeleteTempMap . O processamento de OnIdle padrão em CWinThread automaticamente chama DeleteTempMap para cada classe que oferece suporte a mapas de identificador temporário. Isso significa que você não pode assumir que um ponteiro para um objeto temporário será válido após o ponto de saída da função de onde o ponteiro foi obtido, como o objeto temporário será excluído durante o tempo ocioso loop de mensagem do Windows.

Objetos de invólucro e Múltiplo segmentos

Objetos temporários e permanentes são mantidos em uma base por thread. Ou seja, um thread não é possível acessar outro segmentos objetos de invólucro C++, seja temporária ou permanente. Como dito acima, os objetos temporários serão excluídos quando o segmento que pertence o objeto temporário insere OnIdle.

Para passar esses objetos de um thread para outro, sempre enviá-los como seus nativos identificador tipo. Passar um objeto de invólucro do C++ de um thread para outro freqüentemente resultará em resultados inesperados.

Técnico anotações por número |nbsp; &Notas técnicas por categoria

Index