When using PInvoke, I noticed that we need to use IntPtr to refer to Windows handles. I am wondering why not just use int for the handle? My understanding of a handle is that it is just an integer value.
-
7Your making the most common mistake that causes x64 incompatibilities.SLaks– SLaks2012-02-07 00:24:41 +00:00Commented Feb 7, 2012 at 0:24
-
5Sure, they're integer values. But no one said they have to be 32 bits...user541686– user5416862012-02-07 00:25:48 +00:00Commented Feb 7, 2012 at 0:25
4 Answers
A windows handle is defined as an integer of the native machine pointer size. That's so that they can secretly be a pointer if they need to be. (A handle probably is not a pointer, but it is permitted to be one if the operating system implementers deem it necessary. They typically are not actually pointers for security reasons; it makes it too easy for people to abuse the system if they are actually pointers.)
An int in C# defined as a 32 bit integer, which will be too small on a 64 bit machine. An IntPtr is defined as an integer that can hold a pointer of the machine size. That's why you always use IntPtr when interoperating with handles.
Comments
Handles are pointer-sized values.
They're 8 bytes wide on 64-bit platforms.
1 Comment
typedef'd as a pointer all right, and size_t isn't necessarily the size of a pointer)... but if they're indices into a table, chances are they're used as integers. But yeah, point taken.