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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top