MSDN states:
Interprocess Communication Between 32-bit and 64-bit Applications
64-bit versions of Windows use 32-bit handles for interoperability.
When sharing a handle between 32-bit and 64-bit applications, only the
lower 32 bits are significant, so it is safe to truncate the handle
(when passing it from 64-bit to 32-bit) or sign-extend the handle
(when passing it from 32-bit to 64-bit). Handles that can be shared
include handles to user objects such as windows (HWND), handles to GDI
objects such as pens and brushes (HBRUSH and HPEN), and handles to
named objects such as mutexes, semaphores, and file handles.
It's also worth noting this comment added on that page:
The proper way to share such handles across process boundaries is by
zero-extending 32 bits handles to 64 bits, or vice versa by truncating
64 bits handles to 32 bits discarding the top bits.
Note the distinction between "sign-extending" a handle versus "zero-extending" a handle.
Edit: Judging from discussion seen in a deleted answer to this question, I suppose that the significance of sign-extending a 32-bit handle to arrive at a 64-bit handle instead of zero-extending it is to retain proper treatment of the INVALID_HANDLE_VALUE value for a handle.
HANDLE
in anint
? Sounds problematic. Consider astd::map<int, HANDLE>
. – Schnozzleint
). I'm using C, so no STL, but yes, I could create a second handle system that points to a WindowsHANDLE
, But that would be slower than a simple cast, so I am here asking. – Tirrell