Как правильно преобразовать OLE_HANDLE в HICON для целевой сборки x64?
В частности, с обычным приведением C-Style я получаю это предупреждение при компиляции с конфигурацией x64:
предупреждение C4312: 'приведение типа': преобразование из 'OLE_HANDLE' в 'HICON' большего размера
Вот оскорбительный код:
imgList.Add((HICON)ohIcon);
Приведенный выше код мне подходит, но я хочу избавиться от предупреждения при сборке для x64.





HICON hSomeIcon = (HICON) hSomeOLEHandle;
т.е. они взаимозаменяемы.
H выдает это, в этом случае код библиотеки создал отдельный тип, чтобы дать вам немного больше безопасности типа (во времена старых API-интерфейсов C).
На самом деле они оба являются HANDLE, то есть объектом ядра, которому на самом деле все равно, что это за ресурс, просто то, что у вас есть его «дескриптор». Помните, что это API C, поэтому используйте приведение в стиле C, а когда вы придете его удалить, используйте DeleteObject ().
редактировать: 64 бита, да ... проблема в том, что MS обновила дескрипторы до 64 бита, но оставила материал OLE в покое. К счастью, все, что они сделали, это добавили в лишние биты нули.
Попробуйте использовать Процедуры преобразования LongToHandle и посмотрите Руководство по портированию MIDL - прокрутите примерно наполовину вниз до раздела «USER и GDI - расширенные значения 32b».
Хорошая находка - я не мог найти информацию, в которой прямо говорилось, как перейти от одного к другому.
Я немного покопался - OLE_HANDLE выглядит беззнаковым длинным, а HICON - пустым *. В 32-битной Windows они того же размера, но в Windows x64 void * составляет 64 бита. Нет безопасного способа сделать это приведение - дополнительные 32 бита не определены. К сожалению, единственный совет, который я смог выкопать, касающийся ULONG (OLE_HANDLEs - еще более редкие звери), гласил просто «не преобразовывайте это в указатель».
Предполагая, что вы используете Microsoft Visual Studio на основе вопроса ...
Если вы разрабатываете только для 32-битных целей, вы можете отключить это (и некоторые другие подобные предупреждения), отключив параметр проекта «Обнаружение проблем с переносимостью 64-битной версии» (параметр компилятора C++ / Wp64).
Если вы также разрабатываете для 64-битных целей, то @Harper, вероятно, прав, и вам нужно будет еще немного покопаться, чтобы найти правильный способ справиться с этим. Возможно, вы захотите прочитать этот технический документ как отправную точку; перейдите в раздел о дескрипторах USER и GDI.
Я подозреваю, что «правильный» ответ на «правильный» способ передачи между ними - «не делай этого». По общему признанию, это не очень полезно ... откуда вообще берется OLE_HANDLE? Похоже, вам придется переписать код, используя OLE_HANDLE, чтобы использовать HICON везде.
посмотрите мои новые комментарии, почему это не то, что я ищу