Как я могу разделить HWND между 32 и 64-битными приложениями в Win x64? - PullRequest
19 голосов
/ 01 декабря 2009

MSDN сообщает мне, что дескрипторы окон (HWND) могут совместно использоваться 32- и 64-разрядными приложениями в Межпроцессное взаимодействие (MSDN). Однако в Win32 HWND составляет 32 бита, а в 64-битной Windows - 64 бита. Так как же делиться ручками?

Полагаю, тот же вопрос применим к дескрипторам именованных объектов, таким как мьютексы, семафоры и файловые дескрипторы.

Ответы [ 5 ]

17 голосов
/ 30 апреля 2013

Как указывает Даниэль Роуз выше, документация MSDN теперь гласит:

... безопасно усекать дескриптор (при передаче его из 64-битного в 32-битный) или расширять знак (при передаче его из 32-битного в 64-битный).

Кажется, здесь все еще есть некоторая путаница, учитывая, что мне сказали, что нулевое расширение - верный путь для разработчика WOW64. Если вы пишете 64-битный модуль, который получает дескрипторы из 32-битных модулей, самым безопасным вариантом может быть сравнение только младших 32-битных дескрипторов (т.е. усечение). В противном случае вы можете быть пойманы на разнице между знаком и расширением нуля.

12 голосов
/ 02 декабря 2009

Я только что получил письмо от разработчика Microsoft WOW64, в котором подтверждается:

Дескрипторы 32-битные и могут быть безопасно обрезаны / расширены нулями. Это верно как для дескрипторов объектов ядра, так и для дескрипторов USER / GDI.

7 голосов
/ 01 декабря 2009

Не означает ли тот факт, что они могут быть общими, что в процессах Win64 используются только младшие 32 бита? Дескрипторы Windows - это указатели, а не указатели, по крайней мере, насколько я могу судить, поэтому, если MS не хочет разрешить более 2 ^ 32 окна / файла / мьютекса / и т.д. обрабатывает, нет причин использовать старшие 32 бита void* на Win64.

2 голосов
/ 26 ноября 2010

Ознакомьтесь с Руководством по портированию языка определения интерфейсов Microsoft (MIDL), стр. 12. (http://msdn.microsoft.com/en-us/library/ms810720.aspx)

Вот посмотрите, что дескрипторы USER и GDI - это 32-значные расширенные значения знака

1 голос
/ 01 декабря 2009

Я думаю, что вы правы, чтобы быть осторожным в целом. Однако MSDN, утверждая, что они могут быть разделены, является контрактом для нас, программистов. Они не могут сказать «поделись сегодня», а потом «больше не завтра», не взломав много программного обеспечения.

Аналогичным образом, для того, чтобы x64 и 32-битное программное обеспечение работало одновременно на данной машине, и чтобы все могли ладить друг с другом, HWND (и многие HANDLE) должны оставаться 32-битными и совместимыми.

Полагаю, я говорю, что это очень безопасная ставка, по крайней мере, на время существования Windows 7, и, вероятно, Windows "следующая".

...