Pregunta

¿Cuál es la forma correcta de convertir de un 'OLE_HANDLE' a un 'HICON' para una construcción de destino x64?

En particular con un modelo normal de C-Style, recibo esta advertencia al compilar con una configuración x64:

advertencia C4312: 'type cast': conversión de 'OLE_HANDLE' a 'HICON' de mayor tamaño

Aquí está el código ofensivo:

imgList.Add((HICON)ohIcon);

El código anterior funciona bien para mí, pero quiero deshacerme de la advertencia al compilar para x64.

¿Fue útil?

Solución

La H lo revela, en este caso, el código de la biblioteca ha creado un tipo distinto para brindarle un poco más de seguridad de tipo (en los días de las API de C antiguas).

En realidad, son ambos HANDLEs, que es un objeto del kernel que no le importa realmente cuál es el recurso, solo que tienes un "manejador". Recuerde que la API es una de C, por lo tanto, use modelos de estilo C, y cuando llegue a eliminarla, use DeleteObject ().

edit: 64 bits eh ... el problema es porque MS actualizó los Handles para que fueran de 64 bits, pero dejó el OLE por sí solo. Afortunadamente, todo lo que hicieron fue rellenar los bits adicionales con ceros.

Intente usar Rutinas de conversión de LongToHandle y vea la guía de portabilidad MIDL : desplácese aproximadamente hasta la mitad hasta el " Los identificadores USER y GDI son valores 32b extendidos de signo " sección.

Otros consejos

Suponiendo que está utilizando Microsoft Visual Studio basado en la pregunta ...

Si está desarrollando solo para objetivos de 32 bits, puede elegir deshabilitar esto (y algunas otras advertencias similares) desactivando la opción de proyecto " Detectar problemas de portabilidad de 64 bits " (Opción de compilador C ++ / Wp64).

Si también está desarrollando objetivos de 64 bits, entonces, probablemente, @Harper tiene razón y tendrá que investigar un poco más sobre la forma correcta de manejar esto. Es posible que desee leer este documento técnico como punto de partida; Vaya a la sección sobre los identificadores USER y GDI.

Hice un poco de investigación: OLE_HANDLE parece ser un largo sin firmar, y HICON es un vacío *. En Windows de 32 bits, estos son del mismo tamaño, pero en Windows x64, el vacío * es de 64 bits. No hay una forma segura de realizar este lanzamiento: los 32 bits adicionales no están definidos. Desafortunadamente, el único consejo que pude desenterrar involucrando ULONGs (OLE_HANDLEs son bestias aún más raras) dijo simplemente que "no le arrojes esto a un puntero".

Sospecho que la " correcta " responder por el " propio " La forma de elegir entre ellos es " no hagas eso " Es cierto que eso no es muy útil ... ¿de dónde viene el OLE_HANDLE en primer lugar? Parece que vas a tener que volver a escribir el código usando OLE_HANDLE para usar HICON en todas partes.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

es decir, son intercambiables.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top