2012-02-07 27 views
10

Khi sử dụng PInvoke, tôi nhận thấy rằng chúng tôi cần sử dụng IntPtr để tham khảo các chốt Windows. Tôi tự hỏi tại sao không chỉ sử dụng int để xử lý? Sự hiểu biết của tôi về một xử lý là nó chỉ là một giá trị số nguyên.Tại sao sử dụng IntPtr để xử lý?

+7

Việc bạn phạm sai lầm phổ biến nhất gây ra sự không tương thích x64. – SLaks

+5

Chắc chắn, chúng là giá trị số nguyên. Nhưng không ai nói rằng họ phải là 32 bit ... – Mehrdad

Trả lời

18

Tay cầm cửa sổ được định nghĩa là một số nguyên của kích thước con trỏ máy gốc. Đó là để họ có thể bí mật trở thành một con trỏ nếu họ cần. (Một tay cầm có lẽ là không phải là con trỏ, nhưng nó là được phép là một trong những hệ điều hành mà những người triển khai thực hiện cho thấy cần thiết. Chúng thường không thực sự là con trỏ vì lý do bảo mật; nếu chúng thực sự là con trỏ.)

Một int trong C# được định nghĩa là số nguyên 32 bit, sẽ quá nhỏ trên máy 64 bit. IntPtr được định nghĩa là một số nguyên có thể giữ con trỏ của kích thước máy. Đó là lý do tại sao bạn luôn sử dụng IntPtr khi tương tác với các tay cầm.

10

Xử lý là giá trị con trỏ có kích thước.

Chúng rộng 8 byte trên nền tảng 64 bit.

+1

Tôi muốn nói "pointer- * sized *" thay vì "pointer" (mặc dù tôi đoán theo nghĩa C/C++ nghiêm ngặt, điều đó không quá chính xác, vì các xử lý là 'typedef''d như một con trỏ, và' size_t' không nhất thiết phải là kích thước của một con trỏ) ... nhưng nếu chúng là các chỉ mục vào một bảng, rất có thể chúng được sử dụng như các số nguyên. Nhưng vâng, lấy đi. – Mehrdad

+1

Ý tưởng hay; ăn cắp – SLaks

2

Trình xử lý cơ bản là con trỏ mức hệ thống và con trỏ không được đúc hoàn toàn vào int. Nó là một loại của chính nó. Vì vậy, đó là lý do tại sao bạn có IntPtr trong .NET để đại diện cho loại Xử lý.

4

Kích thước của tay cầm phụ thuộc vào kiến ​​trúc máy (32/64 bit). IntPtr sẽ giải quyết vấn đề đó.

Các vấn đề liên quan