tempo para HWND (VS8 C ++)
-
01-07-2019 - |
Pergunta
Como posso lançar tempo para HWND (C ++ visual studio 8)?
Long lWindowHandler;
HWND oHwnd = (HWND)lWindowHandler;
Mas eu tenho o seguinte aviso:
aviso C4312: 'conversão de tipo': conversão de 'LONGO' para 'HWND' de maior tamanho
Graças.
Solução 2
HWND é um identificador para uma janela. Este tipo é declarado em Windef.h da seguinte forma:
typedef HWND PUNHO;
alça é identificador para um objeto. Este tipo é declarado em WinNT.h da seguinte forma:
typedef PVOID PUNHO;
Finalmente, PVOID é um ponteiro para qualquer tipo. Este tipo é declarado em WinNT.h da seguinte forma:
typedef void * PVOID;
Assim, HWND é realmente um ponteiro para void. Você pode lançar uma longa para um HWND como esta:
HWND h = (HWND) my_long_var;
mas muito cuidado com o que informação é armazenada em my_long_var. Você tem que ter certeza que você tem um ponteiro lá.
Editar Mais tarde: O aviso sugerem que você tem verificações de portabilidade de 64 bits ligado. Se você está construindo uma aplicação de 32 bits, você pode ignorá-los.
Outras dicas
Enquanto você está certo de que o tempo você é realmente um HWND, então é tão simples como:
HWND hWnd = (HWND)(LONG_PTR)lParam;
Fazer isso só é segura se você não está sendo executado em uma versão do Windows de 64 bits. O tipo LONG é de 32 bits, mas o tipo de identificador é provavelmente 64 bits. Você precisa fazer o seu bit código de 64 limpo. Em suma, você vai querer mudar o LONG para um LONG_PTR.
regras para usar tipos de ponteiro :
Não molde ponteiros para int, longo, ULONG, ou DWORD. Se você deve lançar um ponteiro para testar alguns bits, ou conjunto bocados claras, ou de outra forma manipular o seu conteúdo, ou utilizar o UINT_PTR Tipo INT_PTR. Estes tipos são integrais tipos que escala para o tamanho de uma ponteiro para ambos os 32 e 64 bits Windows (por exemplo, ULONG para 32-bit Windows e _int64 para 64-bit Janelas). Por exemplo, suponha que você está portar o seguinte código:
ImageBase = (PVOID) ((ULONG) ImageBase | 1);
Como parte do processo de portabilidade, você iria mudar o código da seguinte forma:
ImageBase = (PVOID) ((ULONG_PTR) ImageBase | 1);
Use UINT_PTR e INT_PTR onde apropriar-se (e se você estiver incerto se eles são necessários, não há prejudicar em usá-los apenas no caso). Faz não lançar seus ponteiros para os tipos ULONG, LONG, INT, UINT, ou DWORD.
Note que identificador é definido como um void *, de modo typecasting um valor PUNHO para um valor ULONG para teste, definir ou limpar os de baixa ordem de 2 bits é um erro em 64 bits do Windows.