Как правильно преобразовать OLE_HANDLE в HICON? - PullRequest
1 голос
/ 31 декабря 2008

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

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

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

Вот код нарушения:

imgList.Add((HICON)ohIcon);

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

Ответы [ 5 ]

4 голосов
/ 31 декабря 2008

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

На самом деле они оба - РУЧКИ, то есть объект ядра, который на самом деле не заботится о том, что это за ресурс, просто у вас есть «дескриптор» к нему. Помните, что API - это язык C, поэтому используйте приведения в стиле C, а когда вы собираетесь его удалить, используйте DeleteObject ().

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

Попробуйте использовать процедуры преобразования LongToHandle и посмотрите руководство по переносу MIDL - прокрутите примерно наполовину до раздела "USER и GDI - это знаковые расширенные значения 32b".

3 голосов
/ 31 декабря 2008

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

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

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

1 голос
/ 31 декабря 2008

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

1 голос
/ 31 декабря 2008

Я немного покопался - OLE_HANDLE - длинная без знака, а HICON - пустота *. В 32-битной Windows они имеют одинаковый размер, но в Windows x64 значение void * составляет 64 бита. Не существует безопасного способа сделать это приведение - дополнительные 32 бита не определены. К сожалению, единственный совет, который мне удалось найти с участием ULONG (OLE_HANDLE - еще более редкие звери), гласил: «Не приводите это к указателю».

0 голосов
/ 31 декабря 2008
HICON hSomeIcon = (HICON) hSomeOLEHandle;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...