PDA

View Full Version : سوال: متغیر های IntPtr چیستند و دارای چه مقادیری هستند؟



sagggad
چهارشنبه 02 بهمن 1392, 09:53 صبح
سلام دوستان
متغیر های IntPtr چیستند و دارای چه مقادیری هستند؟

Mani_rf
چهارشنبه 02 بهمن 1392, 10:20 صبح
IntPtr اشاره گری هست که کنترل شما رو به سیستم عامل معرفی میکنه و سیستم عامل پیغام ها رو از طریق این به کنترل و فرم شما میفرسته. اگر خاطرت باشه تو انجمن VB.Net یک بحثی بود که دوستی میخواست توی مدت زمان خاصی اگر کاربر با برنامه کار نکرد قفل بشه و من بهش گفتم که باید با استفاده از هندلر ها و مسیج ها این کار رو بکنی، این همون اشاره گر هندلر هست

Mani_rf
چهارشنبه 02 بهمن 1392, 10:22 صبح
فراموش کردم، مقدارش از نوع عدد صحیح (Integer) هست که پلتفرم شما مقدارش رو تعیین میکنه.

forodo
چهارشنبه 02 بهمن 1392, 11:17 صبح
سلام
در توابع API این نوع داده بسیار وجود داره ولی من همیشه اون رو به int تغییر دادم و مشکلی هم نداشته. آیا درسته این کار و اشکالی نداره؟

سوال بعدی اینکه: یعنی چی برنامه قفل میشه؟ یعنی هنگ می کنه و اگر اینطوره چطور می شه از قفل درآوردش؟
با تشکر

Mani_rf
چهارشنبه 02 بهمن 1392, 11:50 صبح
سیستم عامل روی سخت افزار یک لایه ای میکشه و به برنامه نویس اجازه میده که به طور غیر مستقیم و از طریق توابع API با اون ارتباط برقرار کنه، حالا این نوع داده ای که شما زیاد توی استفاده از توابع API میبینید به این دلیل هست که توابع API به صورت کاملا عمومی برای استفاده همه برنامه ها نوشته شده و باید مشخص بشه که وقتی که شما تابع رو صدا میزنید قراره که روی چه فرم یا کنترلی اجرا بشه. برای همین هست که تقریبا همه توابع API از شما هندلر میخوان که بدونن باید کجا اجرا بشن.
یا بعضی از توابع مثل این تابع معروف به شما هندلر برمیگردونن :
[System.Runtime.InteropServices.DllImport("user32")]
public static extern IntPtr GetForegroundWindow();

forodo
چهارشنبه 02 بهمن 1392, 11:55 صبح
در اینجا توضیحاتی داده که انگاری نباید این کار رو کرد چون توی ویندوزهای 64 بیتی قاط می زنه. حالا جالب اینجاست که سیستم من 64 بیتی هستش و مشکلی تا اینجای کار که پیش نیومده.
لطفاً سوال دومم هم جواب بدید.

2) NEVER use "int" or "integer" as lParam. Your code WILL crash on 64-bit windows. ONLY use IntPtr (http://pinvoke.net/default.aspx/user32/IntPtr.html), a "ref" structure, or an "out" structure.
3) NEVER use "bool", "int", or "integer" as the return value. Your core WILL crash on 64-bit windows. ONLY use IntPtr (http://pinvoke.net/default.aspx/user32/IntPtr.html). It's not safe to use bool - pInvoke cannot marshal an IntPtr (http://pinvoke.net/default.aspx/user32/IntPtr.html) to a boolean.
4) Use "IntPtr" as the return value, EVEN if the message says it doesn't return any useful information.

Mani_rf
چهارشنبه 02 بهمن 1392, 12:01 عصر
به نظرم نباید تفاوتی بین نسخه 32 و 64 بیت باشه، منبع مطلبی که گذاشتی رو بگذار ببینیم کجا بود. اما در هر صورت وقتی که برای این کار یک Structure در نظر گرفته شده و خودش به صورت مداوم از اون استفاده میکه حتما دلیلی داشته و بهتره که از همون استفاده کنی.
درباره قسمت دوم سوالت هم من درباره این تاپیک (http://barnamenevis.org/showthread.php?436760-%D8%A8%D8%B3%D8%AA%D9%87-%D8%B4%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-...)صحبت کردم که ایجاد کننده تاپیک در اون شرکت داشت. شما هم بخون شاید کارآمد بود

sagggad
چهارشنبه 02 بهمن 1392, 12:07 عصر
یعنی تفاوت intptr با int چیه؟

Mani_rf
چهارشنبه 02 بهمن 1392, 12:10 عصر
int نوع داده عددی اما Intptr یک Structure که به عنوان اشاره گر برای اشاره به کنترل های محیط سیستم عامل به وجود آمده است.

sagggad
چهارشنبه 02 بهمن 1392, 13:11 عصر
یعنی این نوع متغیرها فقط در توابع API کاربرد دارند؟

forodo
چهارشنبه 02 بهمن 1392, 13:20 عصر
به نظرم نباید تفاوتی بین نسخه 32 و 64 بیت باشه، منبع مطلبی که گذاشتی رو بگذار ببینیم کجا بود. اما در هر صورت وقتی که برای این کار یک Structure در نظر گرفته شده و خودش به صورت مداوم از اون استفاده میکه حتما دلیلی داشته و بهتره که از همون استفاده کنی.
درباره قسمت دوم سوالت هم من درباره این تاپیک (http://barnamenevis.org/showthread.php?436760-%D8%A8%D8%B3%D8%AA%D9%87-%D8%B4%D8%AF%D9%86-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87-...)صحبت کردم که ایجاد کننده تاپیک در اون شرکت داشت. شما هم بخون شاید کارآمد بود
این لینک (http://www.pinvoke.net/default.aspx/user32.SendMessage) می باشد

مهرداد صفا
چهارشنبه 02 بهمن 1392, 18:54 عصر
سلام.
IntPtr در پلتفرم های 64 بیتی 8 بایتی (64 بیت) است و در مورد سیستمهای 32 بیتی هم 32 بیت (یا چهار بایت) که این موضوع به تفاوت مدیریت حافظه در این سیستم عاملها بر می گردد و در واقع به همین دلیل هم استفاده از int32 به جای Intptr اشتباه است. اگر شما به جای intptr از int32 استفاده کردید و به اروری بر نخوردید، دلیل درست بودن کار شما نیست و احتمالا یا process شما به عنوان یک پروسه 32 بیتی اجرا می شو و احتمال اینکه اشتباهی در محاسبات پیش بیاید و یا اینکه به خطای AccessViolation برخورد کنید زیاد است.