Qual é a maneira correta de lançar de um 'ole_handle' para um 'hicon'?
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.
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.