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.

2
  • 7
    Your making the most common mistake that causes x64 incompatibilities. Commented Feb 7, 2012 at 0:24
  • 5
    Sure, they're integer values. But no one said they have to be 32 bits... Commented Feb 7, 2012 at 0:25

4 Answers 4

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.

Sign up to request clarification or add additional context in comments.

Comments

10

Handles are pointer-sized values.

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

1 Comment

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.
4

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

Comments

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.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.