PDA

View Full Version : مبتدی: توابع کتابخانه ایی C



makhdoosh
پنج شنبه 21 مرداد 1389, 04:34 صبح
دارم سی یاد میگیرم یه سوالی رو کنجکاوم بدونم اینه که یک توضیح در مورد کتابخانه ها میخام. منظورم اینه که مثلا چند نوع کتابخانه داریم. یه چیزای مبهمی تو ذهنم هست که از مطالعه مقالات کلی فهمیدم، مثلا رابطه کتابخانه ها با DLL چیه؟ فرقش چیه؟

تصوری که خودم دارم اینه که بعضی از توابع که در سی استفاده می کنیم توسط پیش پردازنده قبل از کامپایل شدن به سورس برنامه ایی که نوشتیم اضافه میشن (مثل روشی که خودمون تابع تعریف می کنیم بعد از تابع main ). یا بعضی توابع هم هستند که متعلق به سیستم عامل هستند و هنگام اجرا برنامه در سیستم عامل این برنامه توابع رو از سیستم عامل میخواد و اون هم توابع رو به برنامه معرفی میکنه (فک کنم DLL همین باشه)
اینا تصور خودمه که با مطالعات پراکنده از منابع انگلیسی (انگلیسیم خیلی ضعیفه) حدس میزنم.
لطفا اگه در این زمینه اطلاعاتی دارین یه توضیح جامع در مورد ذات توابع و انواعشون و نحوه عمکردشون در پشت صحنه در کل بدید.
توجه: بنده بیشتر کنجکاو هستم نسبت به اینکه در کل کامپیوتر چگونه کار میکند! یعنی انیکه فعلا قصد برنامه نویس شدن ندارم که مثلا یه پروژه برنامه نویسی تحویل بگیرم و ... لطفا اینقد پیشنهاد ندید که بیا فلان کارو بکن و چه میدونم داری اشتباه می کنی و ...)

PC2st
پنج شنبه 21 مرداد 1389, 05:44 صبح
کتابخانه‌ها یا بصورت دینامیک (DLLها در ویندوز) یا بصورت استاتیک به برنامهٔ ما متصل می‌شوند. DLL مخفف Dynamic Link Library است یعنی اتصال کتابخانه بصورت پویا صورت می‌گیرد (قبل از اجرای برنامه).


تصوری که خودم دارم اینه که بعضی از توابع که در سی استفاده می کنیم توسط پیش پردازنده قبل از کامپایل شدن به سورس برنامه ایی که نوشتیم اضافه میشن (مثل روشی که خودمون تابع تعریف می کنیم بعد از تابع main ). یا بعضی توابع هم هستند که متعلق به سیستم عامل هستند و هنگام اجرا برنامه در سیستم عامل این برنامه توابع رو از سیستم عامل میخواد و اون هم توابع رو به برنامه معرفی میکنه (فک کنم DLL همین باشه)
اگر بخواهیم از کتابخانه بصورت استاتیک (فایلی با پسوند LIB در ویندوز و با پسوند a در گنو/لینوکس) استفاده کنیم، توابع مورد نیاز توسط لینکر به سورس برنامه‌ای که نوشته‌ایم اضافه می‌شوند.

makhdoosh
پنج شنبه 21 مرداد 1389, 06:10 صبح
تشکر
از کجا بفهمم که یک تابع در سی جزو چه دسته ایی هست؟ مثلا تابع ریاضی سینوس در سی جزو کدوم دسته از توابع هست؟
میشه در مورد نحوه عملکرد DLL ها یه توضیح (حتی اگه کپی پیست از جای دیگه باشه) بزارید.
در مورد اونی که گفتم توابع به سورس سی برنامه مون اضافه بشه از اونجایی حدس زدم که تو پیش پردازند مینویسیم
include#
یعنی بگنجان.


ببخشید، یه سوال دیگه ایی هم دارم که بهتره همینجا مطرح کنم. میخام تفاوت های میان اجرای یک برنامه بصورت مستقل و تحت ویندوز بدونم. خوب یه حالتی هست که ما سیستم عامل میخایم بنویسیم و یه فایل exe میسازیم که باید با بوت لودر اجرا بشه. یه حالت دیگه که تحت سیستم عامل اجرا میشه مثلا DOS اینا هست
با پسوند COM
با پسوند EXE
خودم فکر کنم که برنامه هایی با پسوند COM طوری هستند که برنامه نوشته شده توسط ما از خیلی از قابلیت هایی که سیستم عامل به ارائه میشه استفاده میکنه و کار برنامه نویسی رو راحت تر میکنه.
ولی میخام بدونم وقتی برنامه EXE تحت سیستم عامل اجرا میشه آیا باز هم تحت نظارت سیستم عامل هست که اجرا میشه یا نه سیستم عامل(اینجا منظورم داس هست) کاملا متوقف شده و کنترل کامپیوتر رو به برنامه ما میده؟
تصور خودم این هست که برنامه های com مثل این هست که در خود سیستم عامل جاسازی میشن یعنی انگار که برنامه نوشته شده توسط ما جزئی از سیستم عامل شده. و تصورم در مورد EXE این هست که هنگام اجرا این برنامه سیستم عامل موقتا کلا غیر فعال میشه و تمام اختیارات رو در اختیار برنامه میزاره تا اینکه از برنامه خارج بشیم و دوباره به سیستم عامل برگردیم.

البته تمام اینایی که گفتم یه سری تصورات مبهمه من از مطالعات مبتنی بر مقاله هست که ممکنه همش اشتباه باشه، میخام نظر شما رو بدونم.

PC2st
پنج شنبه 21 مرداد 1389, 06:55 صبح
از کجا بفهمم که یک تابع در سی جزو چه دسته ایی هست؟ مثلا تابع ریاضی سینوس در سی جزو کدوم دسته از توابع هست؟اگر کتابخانهٔ دینامیک سی مورد استفاده قرار می‌گیرد، پس توابع بکار رفته در برنامه (مثلا تابع printf) به سورس برنامه اضافه نمی‌شود. اگر کتابخانهٔ استاتیک سی مورد استفاده قرار گیرد، چنین توابعی در سورس برنامه اضافه می‌شود. البته نباید بگوییم که تابع به سورس اضافه می‌شود، بلکه این کد ماشین این توابع بعد از کامپایل برنامه در آن جای می‌گیرند (پس در واقع سورس برنامه تغییر نمی‌کند این کد ماشین است که به برنامهٔ نهایی (کامپایل شده) اضافه می‌شود).

پس ممکن است شما کتابخانهٔ دینامیک را مورد استفاده قرار می‌دهید و شاید هم کتابخانهٔ استاتیک را... در سیستم‌عاملهایی مثل اکثر توزیع‌های گنو/لینوکس، هر دو نوع کتابخانهٔ سی (منظورم کتابخانهٔ استاندارد است) وجود دارند هم دینامیک (فایل‌هایی با پسوند so) و هم استاتیک (فایل‌هایی با پسوند a)... اما در ویندوز تا جایی که می‌دانم فقط می‌توان از کتابخانهٔ استاندارد بصورت استاتیک استفاده کرد زیرا فایل DLL آنها وجود ندارد (برای کامپایلر ++MSVC). در گنو/لینوکس نیز چون هر دو نوع کتابخانهٔ استاندارد سی موجود است، بطور پیش‌فرض از کتابخانهٔ دینامیک استفاده می‌شود مگر اینکه برنامه‌نویس به لینکر بفهماند که می‌خواهد بصورت استاتیک از توابع استفاده کند.


در مورد اونی که گفتم توابع به سورس سی برنامه مون اضافه بشه از اونجایی حدس زدم که تو پیش پردازند مینویسیم
include#
یعنی بگنجان.در این حالت، توسط include مشخص می‌شود که چه کلاس‌ها و توابعی را می‌خواهیم استفاده کنیم. در واقع استفاده از include برای زمان کامپایلر است ولی نوع کتابخانه (دینامیک یا استاتیک) مورد استفاده را لینکر است که تعیین می‌کند تا در نهایت آیا کدهای ماشین (تابع) به برنامهٔ نهایی (کامپایل شده) اضافه شود یا خیر.


میشه در مورد نحوه عملکرد DLL ها یه توضیح (حتی اگه کپی پیست از جای دیگه باشه) بزارید.بطور کلی، DLLها یکبار در حافظه قرار می‌گیرند، سپس سایر برنامه‌ها، توابع و کدهای موجود در آن DLL را به اشتراک می‌گذارند و از آنها در زمان اجرا استفاده می‌کنند. به همین خاطر است که لینکر (linker بعد از کامپایلر) باید در مورد استفاده از کتابخانه‌های دینامیک یا استاتیک تصمیم بگیرد. اگر کتابخانه بصورت استاتیک است که هیچ... ولی اگر کتابخانه بصورت دینامیک است، آدرس توابع موجود در DLL باید توسط برنامه‌ها در زمان اجرا مورد استفاده و در دسترس قرار بگیرد.


ولی میخام بدونم وقتی برنامه EXE تحت سیستم عامل اجرا میشه آیا باز هم تحت نظارت سیستم عامل هست که اجرا میشه یا نه سیستم عامل(اینجا منظورم داس هست) کاملا متوقف شده و کنترل کامپیوتر رو به برنامه ما میده؟باز هم تحت نظارت سیستم‌عامل اینکار صورت می‌گیرد، سیستم‌عامل فایل‌های EXE معمولی را در حالت user mode اجرا می‌کند. برنامه‌ها نمی‌توانند بطور مستقیم به سخت‌افزار دسترسی داشته باشند (مگر اینکه سیستم‌عامل اجازه دهد).
برنامه‌هایی که بدون نیاز به سیستم‌عامل کار می‌کنند،‌ در واقع نه از توابع سیستم‌عامل و نه از سایر کتابخانه‌های کمکی سی (مثل ;کتابخانهٔ استاندارد سی) سود نمی‌برند. بلکه باید بطور مستقیم با جزئیات سخت‌افزار کار کنند و با آن کنار بیایند (کاری که سیستم‌عامل می‌کند).
متاسفانه من ویندوز را خوب نمی‌شناسم :لبخند:
در مورد فایل‌های com اطلاعاتی ندارم و تنها می‌توانم جستجو کنم:

The COM files are raw binary executables and are a leftover from the old CP/M
machines with 64K RAM. A COM program can only have a size of less than one
segment (64K), including code and static data since no fixups for segment
relocation or anything else is included. One method to check for a COM file is
to check if the first byte in the file could be a valid jump or call opcode, but
this is a very weak test since a COM file is not required to start with a jump
or a call. In principle, a COM file is just loaded at offset 100h in the segment
and then executed.

OFFSET Count TYPE Description
0000h 1 byte ID=0E9h
ID=0EBh
Those are not safe ways to determine wether a
file is a COM file or not, but most COM files
start with a jump.
این اطلاعاتی بود که من در این مورد داشتم، اگر احیاناً غلط بودند، ممنون می‌شوم دیگر دوستان اصلاح کنند.

khafan_bat
پنج شنبه 21 مرداد 1389, 18:32 عصر
من یه چند تا نکته میگم و بس . . . . امیدوارم مفید واقع بشه !!

کتابخانه های پویا یا Dynamic Link Library چند ویژگی مهم دارند که اون ها رو از سایر کتابخانه ها متمایز می کند :

الف ) توابع و امکاناتی که در این کتابخانه ها برای استفاده نوشته شده می توانند در یک لحظه توسط چند برنامه مورد استفاده قرار گیرند.

ب ) DLL ها رو به دو دسته ی سیستمی و غیر سیستمی میشه تقسیم کرد . سیستمی ها شامل یکسری توابع برای ارتباط با سیستم عامل یا استفاده از امکانات اون هست که برای سیستم عامل ویندوز میتونی در پوشه ی windows/system32 یه سری از اونها رو پیدا کنی !
غیر سیستمی ها هم اونهایی هستند که بتوسط برنامه نویسان یا یه سری شرکت ها نوشته میشوند و شما میتونید اون ها رو به برنامه ی خودتون اضافهخ کنید و از امکانات اونها بهره ببری

ج )برخی از DLL ها قابلیت اجرایی دارند. ( به تنهایی نمی توانند چون فایل اجرایی نیستند . نیاز به یک راه انداز دارند . برای مثال shimgvw.dll و چنین کتابخانه هایی در ویندوز توسط rundll.exe اجرا می شوند. به تصویر زیر نگاه کن ، پوشه ی سیستم 32 ویندوز من هست :


http://up.iranblog.com/Files/ce794b692ca641b88303.JPG


اگه بخوای با کتاب خانه های سیستمی ویندوز XP آشنا بشی میتونی به لینک زیر یه سر بزنی :

http://xpdll.nirsoft.net/r.html#letter_dll_links





حالا چه طور میشه از این توابع در برنامه ی خودمون استفاده کرد ؟؟ خوب برای این کار عبارت API یا API در C++‎ تو همین سایت یا گوگل جستجو کنی . برای مثال میخوای برنامه ای بنویسی که دسترسی به یک درایو مثل فلش دیسک رو محدود کنه یا سیستم رو ببره تو هایبرنت ، باید از API مربوط به هون سیستم عامل استفاده کنی ! یه سر به سایت های زیر بزن !!


http://www.relisoft.com/win32/dialog.html

http://www.pcpedia.ir/ViewArticle.aspx?ID=83

http://www.codersource.net/mfc/mfc-advanced/mfc-shutdown-timer.aspx

makhdoosh
جمعه 22 مرداد 1389, 02:27 صبح
چند تا نکته ی دیگه هم هست که بعدا بهت میگم !!
نوکرتم داداش، اطلاعات خوبی بود. بازم وقت داری توضیح بدی ما میشیم هوادارت هی زرت زرت میتشکریم ازت همه جا :لبخند:

khafan_bat
جمعه 22 مرداد 1389, 06:19 صبح
برای استفاده از توابع API در برنامه های خودت کتاب جامع و فوق العاده ی زیر رو که به زبان فارسی هم هست حتما دانلود کن و بخون :




آشنایی با Windows API


http://www.4shared.com/file/239909228/846aea3a/API__version_010_.html



About Windows.h


http://en.wikipedia.org/wiki/Windows.h