Каков правильный способ приведения из 'OLE_HANDLE' в 'HICON'?

StackOverflow https://stackoverflow.com/questions/401812

Вопрос

Каков правильный способ приведения из 'OLE_HANDLE' в 'HICON' для целевой сборки x64?

В частности, при обычном приведении в стиле C я получаю это предупреждение при компиляции с конфигурацией x64:

предупреждение C4312:"приведение типа" :преобразование из 'OLE_HANDLE' в 'HICON' большего размера

Вот оскорбительный код:

imgList.Add((HICON)ohIcon);

Приведенный выше код отлично работает для меня, но я хочу избавиться от предупреждения при сборке для x64.

Это было полезно?

Решение

H выдает это, в данном случае библиотечный код создал отдельный тип, чтобы обеспечить вам немного больше безопасности типов (во времена старых C API).

На самом деле это оба дескриптора, то есть объект ядра, которому на самом деле все равно, что это за ресурс, просто у вас есть для него "дескриптор".Помните, что API написан на C, поэтому используйте приведения в стиле C, а когда вы захотите его удалить, используйте DeleteObject() .

Редактировать:64 бита, да...проблема в том, что MS обновила дескрипторы до 64 бит, но оставила материал OLE в покое.К счастью, все, что они сделали, это дополнили лишние биты нулями.

Попробуйте использовать Процедуры преобразования длинных дескрипторов и увидеть, как Руководство по переносу MIDL - прокрутите страницу примерно наполовину вниз до раздела "ПОЛЬЗОВАТЕЛЬСКИЕ дескрипторы и GDI имеют расширенные значения 32b".

Другие советы

Предполагая, что вы используете Microsoft Visual Studio, исходя из вопроса...

Если вы разрабатываете только для 32-разрядных целей, вы можете отключить это (и некоторые другие подобные предупреждения), отключив опцию project "Обнаружение проблем с переносимостью 64-разрядной версии" (опция компилятора C ++ / Wp64).

Если вы разрабатываете и для 64-разрядных целей, то @Harper, вероятно, прав, и вам нужно будет еще немного покопаться в том, как правильно с этим справиться.Возможно, вы захотите почитать эта белая книга в качестве отправной точки;перейдите в раздел о дескрипторах USER и GDI.

Я немного покопался - OLE_HANDLE, похоже, является беззнаковым long, а HICON - это void * .В 32-разрядной версии Windows они имеют одинаковый размер, но в Windows x64 значение void * равно 64 битам.Безопасного способа выполнить это приведение не существует - дополнительные 32 бита не определены.К сожалению, единственный совет, который я смог откопать, связанный с ULONGs (OLE_HANDLEs - еще более редкие звери), гласил просто "не приводите это к указателю".

Я подозреваю, что "правильный" ответ на "правильный" способ приведения между ними - "не делай этого".По общему признанию , это не очень помогает ...откуда вообще берется OLE_HANDLE?Похоже, вам придется переписать код, используя OLE_HANDLE, чтобы использовать HICON везде.

HICON hSomeIcon = (HICON) hSomeOLEHandle;

т. е.они взаимозаменяемы.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top