نقل قول: توابع کتابخانه ایی C
کتابخانهها یا بصورت دینامیک (DLLها در ویندوز) یا بصورت استاتیک به برنامهٔ ما متصل میشوند. DLL مخفف Dynamic Link Library است یعنی اتصال کتابخانه بصورت پویا صورت میگیرد (قبل از اجرای برنامه).
نقل قول:
تصوری که خودم دارم اینه که بعضی از توابع که در سی استفاده می کنیم توسط پیش پردازنده قبل از کامپایل شدن به سورس برنامه ایی که نوشتیم اضافه میشن (مثل روشی که خودمون تابع تعریف می کنیم بعد از تابع main ). یا بعضی توابع هم هستند که متعلق به سیستم عامل هستند و هنگام اجرا برنامه در سیستم عامل این برنامه توابع رو از سیستم عامل میخواد و اون هم توابع رو به برنامه معرفی میکنه (فک کنم DLL همین باشه)
اگر بخواهیم از کتابخانه بصورت استاتیک (فایلی با پسوند LIB در ویندوز و با پسوند a در گنو/لینوکس) استفاده کنیم، توابع مورد نیاز توسط لینکر به سورس برنامهای که نوشتهایم اضافه میشوند.
نقل قول: توابع کتابخانه ایی C
تشکر
از کجا بفهمم که یک تابع در سی جزو چه دسته ایی هست؟ مثلا تابع ریاضی سینوس در سی جزو کدوم دسته از توابع هست؟
میشه در مورد نحوه عملکرد DLL ها یه توضیح (حتی اگه کپی پیست از جای دیگه باشه) بزارید.
در مورد اونی که گفتم توابع به سورس سی برنامه مون اضافه بشه از اونجایی حدس زدم که تو پیش پردازند مینویسیم
include#
یعنی بگنجان.
ببخشید، یه سوال دیگه ایی هم دارم که بهتره همینجا مطرح کنم. میخام تفاوت های میان اجرای یک برنامه بصورت مستقل و تحت ویندوز بدونم. خوب یه حالتی هست که ما سیستم عامل میخایم بنویسیم و یه فایل exe میسازیم که باید با بوت لودر اجرا بشه. یه حالت دیگه که تحت سیستم عامل اجرا میشه مثلا DOS اینا هست- با پسوند COM
- با پسوند EXE
خودم فکر کنم که برنامه هایی با پسوند COM طوری هستند که برنامه نوشته شده توسط ما از خیلی از قابلیت هایی که سیستم عامل به ارائه میشه استفاده میکنه و کار برنامه نویسی رو راحت تر میکنه.
ولی میخام بدونم وقتی برنامه EXE تحت سیستم عامل اجرا میشه آیا باز هم تحت نظارت سیستم عامل هست که اجرا میشه یا نه سیستم عامل(اینجا منظورم داس هست) کاملا متوقف شده و کنترل کامپیوتر رو به برنامه ما میده؟
تصور خودم این هست که برنامه های com مثل این هست که در خود سیستم عامل جاسازی میشن یعنی انگار که برنامه نوشته شده توسط ما جزئی از سیستم عامل شده. و تصورم در مورد EXE این هست که هنگام اجرا این برنامه سیستم عامل موقتا کلا غیر فعال میشه و تمام اختیارات رو در اختیار برنامه میزاره تا اینکه از برنامه خارج بشیم و دوباره به سیستم عامل برگردیم.
البته تمام اینایی که گفتم یه سری تصورات مبهمه من از مطالعات مبتنی بر مقاله هست که ممکنه همش اشتباه باشه، میخام نظر شما رو بدونم.
نقل قول: توابع کتابخانه ایی C
نقل قول:
از کجا بفهمم که یک تابع در سی جزو چه دسته ایی هست؟ مثلا تابع ریاضی سینوس در سی جزو کدوم دسته از توابع هست؟
اگر کتابخانهٔ دینامیک سی مورد استفاده قرار میگیرد، پس توابع بکار رفته در برنامه (مثلا تابع 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.
این اطلاعاتی بود که من در این مورد داشتم، اگر احیاناً غلط بودند، ممنون میشوم دیگر دوستان اصلاح کنند.
نقل قول: توابع کتابخانه ایی C
من یه چند تا نکته میگم و بس . . . . امیدوارم مفید واقع بشه !!
کتابخانه های پویا یا Dynamic Link Library چند ویژگی مهم دارند که اون ها رو از سایر کتابخانه ها متمایز می کند :
الف ) توابع و امکاناتی که در این کتابخانه ها برای استفاده نوشته شده می توانند در یک لحظه توسط چند برنامه مورد استفاده قرار گیرند.
ب ) DLL ها رو به دو دسته ی سیستمی و غیر سیستمی میشه تقسیم کرد . سیستمی ها شامل یکسری توابع برای ارتباط با سیستم عامل یا استفاده از امکانات اون هست که برای سیستم عامل ویندوز میتونی در پوشه ی windows/system32 یه سری از اونها رو پیدا کنی !
غیر سیستمی ها هم اونهایی هستند که بتوسط برنامه نویسان یا یه سری شرکت ها نوشته میشوند و شما میتونید اون ها رو به برنامه ی خودتون اضافهخ کنید و از امکانات اونها بهره ببری
ج )برخی از DLL ها قابلیت اجرایی دارند. ( به تنهایی نمی توانند چون فایل اجرایی نیستند . نیاز به یک راه انداز دارند . برای مثال shimgvw.dll و چنین کتابخانه هایی در ویندوز توسط rundll.exe اجرا می شوند. به تصویر زیر نگاه کن ، پوشه ی سیستم 32 ویندوز من هست :
حالا چه طور میشه از این توابع در برنامه ی خودمون استفاده کرد ؟؟ خوب برای این کار عبارت API یا API در C++ تو همین سایت یا گوگل جستجو کنی . برای مثال میخوای برنامه ای بنویسی که دسترسی به یک درایو مثل فلش دیسک رو محدود کنه یا سیستم رو ببره تو هایبرنت ، باید از API مربوط به هون سیستم عامل استفاده کنی ! یه سر به سایت های زیر بزن !!
نقل قول: توابع کتابخانه ایی C
چند تا نکته ی دیگه هم هست که بعدا بهت میگم !!
نوکرتم داداش، اطلاعات خوبی بود. بازم وقت داری توضیح بدی ما میشیم هوادارت هی زرت زرت میتشکریم ازت همه جا :لبخند:
نقل قول: توابع کتابخانه ایی C
برای استفاده از توابع API در برنامه های خودت کتاب جامع و فوق العاده ی زیر رو که به زبان فارسی هم هست حتما دانلود کن و بخون :