Why using IntPtr for handle?
Asked Answered
M

4

10

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.

Meza answered 7/2, 2012 at 0:22 Comment(2)
Your making the most common mistake that causes x64 incompatibilities.Stunner
Sure, they're integer values. But no one said they have to be 32 bits...Cahilly
S
18

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.

Supernumerary answered 7/2, 2012 at 0:25 Comment(0)
S
10

Handles are pointer-sized values.

They're 8 bytes wide on 64-bit platforms.

Stunner answered 7/2, 2012 at 0:24 Comment(1)
I'd say "pointer-sized" instead of "pointer" (even though I guess in the strict C/C++ sense, that isn't too accurate, since handles are 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.Cahilly
H
4

The size of a handle is dependant on the machine architecture (32/64 bit). IntPtr will take care of that.

Hitoshi answered 7/2, 2012 at 0:24 Comment(0)
A
2

A handle is essentially a system level pointer, and a pointer does not implicitly cast to an int. It is a type by itself. So that's why you have IntPtr in .NET to represent the Handle type.

Anthropophagi answered 7/2, 2012 at 0:24 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.