Pergunta

Qual é a maneira correta de lançar de um 'ole_handle' para um 'hicon' para uma construção de destino X64?

Em particular com um elenco normal de estilo C, recebo esse aviso ao compilar com uma configuração X64:

Aviso C4312: 'Tipo Cast': Conversão de 'ole_handle' para 'hicon' de maior tamanho

Aqui está o código ofensivo:

imgList.Add((HICON)ohIcon);

O código acima funciona bem para mim, mas quero me livrar do aviso ao construir para x64.

Foi útil?

Solução

O H entrega, nesse caso, o código da biblioteca criou um tipo distinto para oferecer um pouco mais de segurança do tipo (nos dias das APIs C Antigas).

Na verdade, ambos são alças, que é um objeto de kernel que realmente não se importa com o que é o recurso, apenas que você tem uma 'alça'. Lembre -se de que a API é C One, então use os elencos de estilo C e, quando você a excluir, use DeleteObject ().

EDIT: 64 bits eh ... o problema é porque o MS atualizado alças para 64 bits, mas deixou o material sozinho. Felizmente, tudo o que eles fizeram foi picar os pedaços extras com Zeros.

Tente usar o Rotinas de conversão LongtoHandle e veja o Guia de portamento MIDL - Role na metade da seção "Usuário e as alças GDI são a seção Sign estendida 32b Values".

Outras dicas

Supondo que você esteja usando o Microsoft Visual Studio com base na pergunta ...

Se você estiver desenvolvendo apenas para alvos de 32 bits, poderá desativar isso (e alguns outros avisos semelhantes) desativando a opção do projeto "Detectar problemas de portabilidade de 64 bits" (opção C ++ Compiler /WP64).

Se você também está desenvolvendo alvos de 64 bits, o @Harper provavelmente está certo e você precisará fazer um pouco mais de escavação na maneira certa para lidar com isso. Você pode querer ler Este papel branco como ponto de partida; Vá para a seção sobre o usuário e as manipulares do GDI.

Eu fiz um pouco de escavação - Ole_Handle parece ser um longo tempo não assinado e Hicon é um vazio*. Em janelas de 32 bits, estes têm o mesmo tamanho, mas no Windows X64, o vazio* é de 64 bits. Não há uma maneira segura de fazer esse elenco - os 32 bits extras são indefinidos. Infelizmente, o único conselho que pude desenterrar envolvendo ulongs (as mãos de ole_ são bestas ainda mais raras) disse simplesmente "não escreva isso para um ponteiro".

Eu suspeito que a resposta "correta" para a maneira "adequada" de lançar entre eles é "não faça isso". É certo que isso não é muito útil ... de onde vem o Ole_Handle em primeiro lugar? Parece que você terá que reescrever o código usando Ole_Handle para usar o Hicon em todos os lugares.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

ou seja, eles são intercambiáveis.

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