توضیحی مختصر درباره API
قلب ویندوز یعنی چیزی که اساس سیستم عامل ویندوز است، چیزی نیست بجز توابع API .
API مخفف کلمه Aplication programming interface میباشد که به معنای رابط برنامه سازی کاربردی است.
که از آن به نام های Aplication programming Interface و Application Programmers Interface نیز یاد شده است.
نام API به توابعی اطلاق میشود که در فایل های مختلف ویندوز مانند advapi32.DLL و userDLL32.DLL و ole32.DLL و ...
وجود دارند.
هر کاری که در ویندوز روی می دهد و هر اتفاقی که می افتد با استفاده از این توابع صورت می گیرد.
در حقیقت نوشتن برنامه برای ویندوز از صدا کردن توابع API تشکیل می شود.
API بخشی از خود ویندوز است.
لذا تمام برنامهای کاربردی ویندوز به همان توابعی دسترسی دارند که برنامه های دیگر دارند.
در محیط چند وظیفه ای ویندوز ضروری است که تمام برنامه ها در روش تعریف شده دقیق عمل کنند .
با استفاده از توابع API که در تمامی برنامه های کاربردی استفاده می شود این سازگاری بوجود می آید.
شاید شما ندانسته تا حالا بارها با API کار کرده باشید.
وقتی شما در محیط یک زبان برنامه نویسی مثل Delphi یا Visual Basic یا هر محیط دیگری پروژه جدیدی را آغاز می کنید و فرم اولیه را روی صفحه آورده و آماده طراحی می شوید در واقع استفاده از توابع API را آغاز کرده اید .
در حقیقت در همان لحظه تابع Create Window فراخوانده شده است و فرم مزبور در مقابل شما قرار می گیرد که خود این تابع یکی از توابع API است.
از نظر برنامه نویس API شامل یک سری زیر برنامه ی آماده و کاملا سالم می باشد که در اختیار برنامه نویسان محیط ویندوز قرار می گیرد.
مشخصات توابع API
اگر بخواهیم توابع API را تقسیم بندی کنیم به دو دسته 16 بیتی و 32 بیتی تبدیل میشوند که دسته 16 بیتی دارای 730 تابع و دسته 32 بیتی دارای 6500 تابع میباشد.این روالها درون فایلهایی وجود دارند که در پوشه های Windows و Windows\System ذخیره شده اند.
در توابع API مانند هر زبان برنامه نویسی متغیر های ورودی و خروجی وجود دارد.
این متغیر ها میتوانند از نوع long , integer , string , byte و ...
باشند.
برخی از این توابع میتوانند فقط مقدار ثابت تعریف شده ای را بگیرند.
در تعدادی از توابع متغیر های ورودی و خروجی یه یک ساختار TYPE اشاره دارند که فیلدهای این ساختار اطلاعات ورودی یا برگشتی تابع را در خود نگهداری میکنند.
توابع API در کجا قرار می گیرند؟
حتما این سوال برای شما پیش آمده که این توابع قدرتمند در کجا قرار دارند؟
یا اینکه این توابع کجا هستند که می توانند به طور اشتراکی در چند برنامه و حتی خود ویندوز مورد استفاده قرار گیرند؟
ابتدا باید مطالبی در مورد فایل های DLL بیاموزید.
DLL چیست؟
در حقیقت DLL ها هم مانند API ابزاری هستند که شما از آنها استفاده کرده اید ولی شاید نمی دانستید.
اگر نگاهی به دایرکتوری system یا windows یا System32 بیندازید تعداد زیادی از این فایل های DLL می بینید!
Dynamic Linked Library (DLL): به معنای کتابخانه پیوندی پویا می باشد که می تواند شامل انواع داده یا کد باشد.
درون DLL میتوان انواع داده ها همانند کد - تصویر - صوت و غیره را قرار داد.
فایلهای DLL در دسترس برنامه هایی که به زبان ویژوال بیسیک و زبانهای دیگری(که از DLL پشتیبانی می کنند) نوشته شده اند می باشد.
نکته جالب فایل های DLL خاصیت مستقل از زبان برنامه نویسی این فایل ها می باشد.
یعنی اگر DLL با استفاده از Delphi ایجاد شده باشد می تواند Visual Basic یا Visual C++ از آن استفاده کرد.
نکته دیگر DLL ها صرفه جویی در مصرف حافظه می باشد که به همین دلیل نام Dynamic را به همراه خود دارند.
در واقع هر قسمت از DLL که فراخوانی می شود همان قسمت به حافظه بار می شود و در صورت عدم نیاز هم از حافظه خارج می شود.
در واقع دلایل استفاده از DLL را موارد زیر را می توان نام برد:
• توانایی اشتراکی کردن کد بین چند برنامه و حتی خود ویندوز
• استفاده مجدد از کد های نوشته شده.
• استفاده بهینه از منابع ویندوز و منابع سیستم.
• جدا کردن کد های مختلف از هم.
لازم به ذکر است که DLL ها را می توان به زبان هایی مانند Delphi و Visual C++ تولید کرد.
حالا می توانیم به سوال قبلی پاسخ دهیم .
API درون فایلهایی وجود دارند که در پوشه های Windows و Windows\System ذخیره شده اند.
هنگام نصب ویندوز فایلهای DLL نیز ذخیره می شوند ، پس به طور اتوماتیک به این کتابخانه ها دسترسی دارید.
مهمترین DLL ها که بیشترین API ها را در خود جا داده اند عبارتند از Kernel32.DLL و User32.DLL و Shell32.DLL و ...
البته DLL های دیگری هم وجود دارند!
اکثر فایلهای DLL پسوند .DLL یا .EXE دارند.هربرنامه ای که می نویسید به این فایلها دسترسی دارد.این فایلهای DLL در ویرایش های قدیمی تر ویندوز (قبل از 95) هم وجود داشتند ، منتها این فایلها شماره 32 را (که نشان دهنده سازگار 32 بیتی است)در نام خود نداشتند.ویرایشهای قبل از ویندوز 95 سیستمهای 16 بیتی بودند ، بدین معنی که انتقال اطلاعات با نرخ 16 بیت یا دو بایت انجام می شد.برنامه نویسی در محیط های 32 بیتی ، انعطاف بیشتر ، سرعت زیادتر و کارایی بالاتر را در مقایسه با یک محیط 16 بیتی قدیمی دارد.
اکثر فایلهای DLL پسوند .DLL یا .EXE دارند.هربرنامه ای که می نویسید به این فایلها دسترسی دارد.این فایلهای DLL در ویرایش های قدیمی تر ویندوز (قبل از 95) هم وجود داشتند ، منتها این فایلها شماره 32 را (که نشان دهنده سازگار 32 بیتی است)در نام خود نداشتند.ویرایشهای قبل از ویندوز 95 سیستمهای 16 بیتی بودند ، بدین معنی که انتقال اطلاعات با نرخ 16 بیت یا دو بایت انجام می شد.برنامه نویسی در محیط های 32 بیتی ، انعطاف بیشتر ، سرعت زیادتر و کارایی بالاتر را در مقایسه با یک محیط 16 بیتی قدیمی دارد.
سه فایل که عمدتا استفاده می شوند عبارتند از: Usre32.DLL: شامل توابعی است که محیط ویندوز و واسط کاربر مثل مکان نماها ، منوها و پنجره ها را کنترل می کند .
Gdi32.DLL: شامل توابعی است که خروجی برنامه به صفحه تصویر و ابزارهای دیگر را کنترل می کنند.
Kernel32.DLL: شامل توابعی است که سخت افزار و واسط نرم افزار داخلی ویندوز را کنترل می کنند.اکثر روالهای مربوط به حافظه ، فایل و دایرکتوری درون Kernel32.DLL قرار دارند.
توجه: ویندوز یک سیستم عامل است که از چند لایه تشکیل شده است.شروع این لایه ها با واسط گرافیکی کاربر یا GUI(Grapical User Interface) است که کاربر می بیند و ختم آنها با نزدیک ترین لایه به سخت افزار است که جریان داده ها بین برنامه و سخت افزار را کنترل می کند.
این پایین ترین سطح سیستم عامل را هسته اصلی (Kernel) می گویند.
بنابراین نام Kernel32.DLL مربوط به کتابخانه ای است که تعدادی روال بر مبنای هسته اصلی را دارد.
این سه فایل بیشتر روالها یا توابع API را نگه می دارند.با یک نگاه کوتاه به پوشه های Windows و Windows \ system چند کتابخانه پیوند دینامیکی دیگر را نیز می بینید مثل COMDLG.DLL,MAPI32.DLL,NETAPI32.DLLوWINMM.DLL .
همچنانکه مایکروسافت قابلیتهایی را به سیستم عامل اضافه می کند، فایلهای جدید DLL هم ظاهر می شوند.
فایلهای DLL فقط قسمتی از ویندوز نمی باشند .
وقتی یک برنامه جدید را به سیستم خودتان اضافه می کنید.این برنامهDLL خاص خودش را فراهم می کند.بنابراین در طول زمان تعداد زیادی فایل DLL روی سیستم خودتان خواهید داشت.
ماهیت فایلهای DLL: اصطلاح پیوند دینامیکی معانی خاصی برای برنامه نویسان دارد.وقتی گفته میشود که یک روال با یک برنامه پیوند دینامیکی دارد بدین معناست که این روال(سابروتین یا تابع) تا قبل از ترجمه برنامه به آن متصل نمی شود .این تابع فقط در زمان اجرا در دسترس برنامه می باشد.توابعی که درون پنجره کد می نویسید دارای پیوند استاتیکی میباشند،یعنی هر وقت برنامه را ترجمه می کنید این توابع با بقیه کد اصلی ترکیب می شوند.اما فایلهای DLL برنامه ترکیب نمی شوند.
برنامه شما به این روالها در زمان اجرا دسترسی دارداما فایل EXE برنامه شامل روالهای واقعی DLL نمی باشد.
این توابع زمانی با ارزش است که می خواهید توابع را به عنوان کتابخانه های پیوند دینامیکی استفاده کنید، زیرا کتابخانه یا توابعی که برنامه شما احضار می کند هیچوقت قسمتی از برنامه شما نیستند.توابع API اندازه فایلهای برنامه شما را زیاد نمی کنند.حین اجرای برنامه این روالها در مواقع ضروری بار می شوند ، در ادامه چنانچه دیگر نیازی به آنها نباشد سیستم عامل ویندوز می تواند منابع را آزاد کندتا حافظه و وقت CPU صرف روالهای جدید شود.
اما مزیت عمده پیوند دینامیکی این نیست که موجب افزایش راندمان منابع می گردند.چنانچه ویندوز تغییر کند این فایلهای DLL با ویرایشهای جدید DLL باید جایگزین شوند.بنابراین برنامه شما قادر است تا از قابلیتهای جدید ویندوز استفاده کند بدون آنکه مجبور باشید همه برنامه هایی را که از API ویندوز استفاده میکنند مجددا ترجمه کنید.به عنوان مثال در ویندوز 95 ظاهر پنجره ها تغییر کرد.شمایلهای موجود در گوشه بالا و سمت راست یک پنجره نسبت به ویندوز 11.3 تفاوت دارند.اما هر برنامه ویژوال بیسیک که برای نمایش پنجره یک تابع API ویندوز را احضار می کند در همه محیطهای ویندوز اینگونه عمل می کند.
یعنی این برنامه وقتی در محیط ویندوز11.3 اجرا میشود شمایلهای قدیمی را نشان میدهد با وجودی که برنامه را تغییر نداده اید.
در نتیجه در اکثر مواقع وقتی از ویرایشهای مختلف ویندوز استفاده میکنید، برنامه های شما که به API ویندوز دسترسی دارند به هیچ تغییری نیاز ندارند.
نکته1: ویندوز فقط یک برنامه بزرگ نیست ، بلکه مجموعه ای از تعداد زیادی برنامه است که برخی از آنها درون فایلهای DLL قرار دارند .شاید ویندوز خودش بزرگترین استفاده کننده از فایلهای DLL باشد.
نکته2:مزیت استفاده از روالهای DLL آن است که چند برنامه اجرایی تحت ویندوز میتوانند به یک روال از فایل DLL دسترسی داشته باشند دلایل استفاده از توابع API توابع API به دلیل اینکه در فایلهای DLL هر سیستم عامل ویندوز میباشند و در هر مکان مانند یکدیگر میباشند پس نیازی به ارایه ی آن فایل DLL در نسخه برنامه نمیباشد و در نتیجه حجم نسخه کم میشود.
بیشتر توابع کارهایی را انجام میدهند که زبان های برنامه نویسی قادر به انجام آن کار نیست.
و چندین علت دیگر ...
چند نمونه از توابع API در ویندوز: GetSysColor کتابخانه: User32 سیستم عامل:, CE , 2000 , 98 , 95 مبتنی بر NT این تابع مقدار ارزشیRBG یکی از رنگهای سیستم را برمیگرداند.رنگهای سیستم آنهایی هستندکه یک پنجره مورد استفاده توسط آنها کشیده می شود.برای مثال رنگ تیتر پنجره.رنگ اسکرول بار(Scrollbar) ، رنگ زمینه(DeskTop) و رنگ دور(Border) و ...
&&&&&&&&&&&&&&&&&&&&&&&&&& GetSystemMetrics کتابخانه:User32 سیستم عامل: , 32S, 98,95مبتنی بر NT این تابع اطلاعات بسیار گوناگونی از ویندوز میدهد.بیشتر اینها با اندازه های اشیای گوناگون از جمله صفحه ، آیکونها، کرسر و ...
سرکار دارند.این دستور اطلاعات در رابطه با سیستم را آماده می کند.
مقدار برگشتی این تابع بستگی به مقدار nindex * دارد.همه اندازه های نگهداری شده(درازا و پهنا)بر حسب نقطه(pixel) میباشد.توجه کنید معنی بعضی از اقلام سیستم متریک در ویندوز 95 و 98 با ویندوز NT کمی متفاوت است.
*: nindex -- &&&&&&&&&&&&&&&&&&&&&&&&&& GetsystemMenu کتابخانه: User32 سیستم عامل: ,CE , 2000 , 98 , 95مبتنی برNT این تابع هندل منوی سیستم را برمیگرداند(که به آن کنترل منو نیز می گویند).این منو زمانی ظاهر میشود که ما روی آیکون برنامه در روی تایتل بار پنجره برنامه مان کلیک کنیم یا روی خود تایتل بار کلیک راست را بزنیم.وقتی که شما بتوانید هندل منوی سیستم را پیدا کنید، میتوانیدبه ان آیتم اضافه یا کم کنید.(این نکته یعنی کار بر روی منوبار سیستم بسیار مهم است).نکته مهم دیگر این است که با انتخاب هر آیتم از منوی سیستم یک پیام(یک کد) به WM_SYSCOMMAND ارسال میگردد.به جای آنکه این پیام به WM_COMMAND ارسال شود.از تابع GetSystemMenu می توان برای ذخیره مجدد(برگرداندن)آیتمهای پیش فرض پس از تغییرات نیز استفاده نمود.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetNumberForemat کتابخانه: Kernel32 سیستم عامل: CE , 2000 , NT , 98 , 95 این تابع یک عدد را برای نمایش فرمت میکند.به صورت پیش فرض تابع فرمت عدد را با استفاده از setting محلی انجام میدهد.اگر چه ارجحیت با فرمت تعیین شده کاربر میباشد.نتیجه نهایی تابع ، یک عدد برای نمایش مطابق با خواست کاربر میباشد.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetMenu کتابخانه: User32 سیستم عامل: 2000 , NT , 98 , 95 این تابع تشخیص میدهد که کدام منو به یک پنجره اختصاص داده شده است.این منو به صورت یک منوبار ظاهر می شود.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetLogicalDrives کتابخانه: Kernel32 سیستم عامل: 32S,NT,98,95 این تابع همه درایوهای منطقی موجود در کامپیوتر را تعیین می کند.درایو منطقی با یک حرف مشخص می شود مانند a: یا c:.
این تابع برای هر درایو یک بیت برمیگرداند.با استفاده از عملگر AND شما میتوانید درایوها را مشخص نماید.
مثلا برای مشخص شدن وجود درایو c کافیست مقدار برگشتی را با عدد 4 ترکیب AND نمایید.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetLocalTime کتابخانه: Kernel32 سیستم عامل: NT,98,95 این تابع تاریخ و زمان سیستم را برمیگرداند.تاریخ و زمان اجزای مختلفی دارند(ماه ، روز، ساعت، دقیقه و ثانیه و ...) حتی هزارم ثانیه نیز در این متغیر پاس داده می شود و در IpsystemTime * ذخیره می گردد.
ویندوز زمان محلی را به زمان سیستم ترجیح میدهد.
*: IpSystemTime -- &&&&&&&&&&&&&&&&&&&&&&&&&& GetHostName کتابخانه: WSock32 سیستم عامل: NT,98,95,2000,CE این تابع نام کامپیوتر میزبان را استخراج میکند، که میتواند یک نام ساده یا یک نام دومین Domain)) باشد.هر چه که باشد با ان و تابع GetHostByName میتوان اطلاعات مورد نیاز را از شبکه استخراج نمود ، مانند IP.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetHostByName کتابخانه: WSock32 سیستم عامل: NT,98,95,2000,CE اطلاعات کامپیوتر را بر اساس نام آن (domain) برمیگرداند.اطلاعات میزبان داخل یک استراکچر با نام HOSTENT ذخیره می شود.
یک اشاره گر که توسط این تابع برگشت میشود به این استراکچر اشاره می کند.توجه کنید که این تابع، کامپیوتر میزبان را بر اساس IP نمی تواند مشخص کند(به جای ان از تابع GetHostByAddr استفاده میگردد).
نکته: برای دستیابی به اطلاعات برگشتی از تابعGetMemory برای کپی داده و انتقال اطلاعات می توان استفاده نمود.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetHostByAddr کتابخانه: WSock32 سیستم عامل: NT,98,95,2000,CE اطلاعاتی راجع به کامپیوتر میزبان می دهد.این کامپیوتر معمولا با آدرس شبکه ای شناخته میشود(معمولا نیاز به آدرس IP نیست).اطلاعات راجع به کامپیوتر میزبان درون یک استراکچر با نام HOSTENT ذخیره میشود ، که این تابع با برگرداندن یک اشاره گر به ان اشاره میکند.
نکته:برای دستیابی به اطلاعات برگشتی از تابع CopyMemory برای کپی داده و انتقال اطلاعات می توان استفاده کرد.
&&&&&&&&&&&&&&&&&&&&&&&&&& CopyMemory کتابخانه: Kernel32 سیستم عامل: CE , 2000 , NT , 98 , 95 این تابع بسیار شبیه به تابع MoveMemory میباشد.واقعیت این است که هر دو اینها مشابه هم هستند.تابع فوق قسمتی از یک محل حافظه را به محل دیگرMove میکند.
و هر دو به وسیله اشاره گرهایی آدرس دهی میشوند.پس از کپی حافظه ،مبدا با مقدار صفر پر میشود.
نکته: یک اشاره گر میتواند خود به خود با پاس دادن خود متغیر به جای مبدا و مقصد نیز ساخته شود.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetFocus کتابخانه: User32 سیستم عامل: CE , 2000 , NT , 98 , 95 هندل پنجره فعال که سیستم روی ان متمرکز شده را برمیگرداند.اگر روی پنجره ای خارج از برنامه در حال اجرا (پنجره ای که جز برنامه ما نیست )متمرکز شویم ، این تابع خطا بر میگرداند.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetFileTime کتابخانه: Kernel32 سیستم عامل: CE , 2000 , NT , 98 , 95 این تابع زمانها و تاریخهای ایجاد ، اخرین دسترسی و آخرین تغییرات را بر میگرداند.این زمانها و تاریخ ها بر اساس سیستم UTC (مطابق زمان جهانی، زمان گرینویچ GTM) میباشد و نه زمان محلی کامپیوتر.
توجه کنید که نتیجه کاملا وابسته به زمان فایل و سیستم است.زیرا سیستم عامل زمانهای ایجاد دسترسی و تغییرات را به طور کامل ذخیره نمی کند(یعنی ممکن است تاریخ نمایش داده شده ، تاریخ واقعی ذخیره شده نباشد.
زیرا تاریخ ذخیره شده به صورت مختصر می باشد ولی برای نمایش آنرا بر اساس یک سری پیش فرض کامل می کند.) &&&&&&&&&&&&&&&&&&&&&&&&&& GetDiskFreeSpace کتابخانه: Kernel32 سیستم عامل: CE , 2000 , NT , 98 , 95 این تابع اطلاعاتی راجع به فضای خالی یک دیسک به ما میدهد.این اطلاعات شامل تعداد سکتورهای هر کلاستر و تعداد بایت های یک سکتور و تعداد کلاسترهای خالی و تعداد کل کلاسترهاست.به دلیل وجود محدودیت در عدد(حداکثر 32 بیتی) این دستور در نهایت می تواند برای هارد دیسکهای حداکثر 2 مگابایت پاسخگو باشد.ولی تابع GetDiskFreespaceEx این محدودیت را ندارد.
&&&&&&&&&&&&&&&&&&&&&&&&&& GetComputerName کتابخانه: Kernel32 سیستم عامل: NT , 98 , 95 نام کامپیوتر مورد استفاده را برمیگرداند.این نام در پارامتری به نام IpBuffer ذخیره میگردد.اگر خطا باشد مقدار صفر و در صورت موفق بودن تابع مقدار یک را برمیگرداند.
نکته:اگر می خواهید تغییر نام را به صورت دستی انجام دهید با استفاده از این دستور نام کامپیوتر را پیدا کرده و آنرا در رجیستری ویندوز جستجو نمایید و در صورت نیاز انرا تغییر دهید.
&&&&&&&&&&&&&&&&&&&&&&&&&& FillMemory کتابخانه: Kernel32 سیستم عامل: NT , 98 , 95,2000 مکانی در حافظه سیستم را با یک مقدار معین پر می کند.این عمل با قرار دادن مقدار خواسته شده در محل حافظه مورد نظر از شروع تا پایان انجام می شود.نحوه دسترسی به محل حافظه توسط یک اشاره گر به محل حافظه مشخص می گردد.
&&&&&&&&&&&&&&&&&&&&&&&&&& ExitWindowsEx کتابخانه: User32 سیستم عامل NT , 98 , 95 این تابع کامپیوتر را shut Down و یا ریبوت(ReBoot) و یا Log Off و ...
می کند.باید توجه داشت با اجرای دستور بلافاصله عملیات اجرا می گردد.پس در استفاده از ان دقت شود.در صورت موفق بودن ، مقدار 1 و ناموفق بودن تابع مقدار صفر را بر می گرداند.
&&&&&&&&&&&&&&&&&&&&&&&&&& DeleteFile کتابخانه: Kernel32 سیستم عامل: NT , 98 , 95 به طور کامل یک فایل را پاک میکند.(به داخل سطل آشغال نمی فرستد و برای حذف کردن از شما تاید نمی خواهد.بنابراین در استفاده از تابع باید دقت نمود.در صورت موفق بودن مقدار یک و برای ناموفق بودن(در صورت عدم وجود فایل) مقدار صفر را برمی گرداند.
&&&&&&&&&&&&&&&&&&&&&&&&&& Beep کتابخانه: Kernel32 سیستم عامل: NT , 98 , 95,2000 این تابع یک صدای خاص را اجرا می کند ، اما رفتار کاملا متفاوتی در سیستم عامل های مختلفی دارد .
تابع ویندوز همواره صدای پیش فرض(منظور از صدا فرکانس صدا می باشد) سیستم را می نوازد.
صرف نظر از این که مقدار و پارامتر به تابع فرستاده شود یا نه.
در ویندوز NT این تابع یک تون را با یک فرکانس خواص برای مدت معینی می نوازد.
&&&&&&&&&&&&&&&&&&&&&&&&&& API و ویژوال بیسیک: توابع API قابل فراخوانی در زبانهای برنامه نویسی گوناگونی هستند که ما در اینجا به چند نمونه از فراخوانی این توابع در ویژوال بیسیک اشاره می کنیم: یک برنامه نویس با استفاده از توابع و اشیاء ذاتی ویژوال بیسیک ، تنها به بخشی از سیستم عامل دسترسی و کنترل خواهد داشت.
اما همین برنامه نویس با استفاده از توابع API ویندوز قادر به کنترل ریزتزین بخش های سیستم عامل خواهد بود.
توجه: فراخوانی توابع API و سایر توابع DLL می تواند برای سلامت برنامه شما خطرناک باشد.وقتی یک تابع DLL را مستقیما از روی کد برنامه فراخوانی می کنید، در واقع یکسری از مکانیسم های مطمئنی که ویژوال بیسیک به طور معمول برای شما فراهم میکند را دور می زنید.اگر شما در تعریف یا فراخوانی یک تابع DLL اشتباه کنید باعث ایجاد یک خطا در برنامه می شوید که آن را GPF(General Protection Fault) نیز می نامند.بهترین کار برای اجرای این توابع ، ذخیره کردن برنامه قبل از اجرای آن است .
همچنین قبل از بکارگیری یک تابع DLL باید مطمئن باشید کاملا قواعد آنرا درک کرده اید.
دستورDeclare برای تعریف توابع API: قبل از فراخوانی یک تابع DLL باید اطلاعاتی راجع به مکان فایل DLL و آرگومانهای مورد نیاز آن تابع در اختیار ویژوال بیسیک قرار دهید.
برای این کار دو راه وجود دارد: 1-قرار دادن DLL در لیست Reference پروژه ( ارجاع به Type Library آن DLL) 2-استفاده از دستور Declare در یک ماژول راه اول آسانترین راه موجود برای توابع DLL است.وقتی مرجع را مشخص می کنید ، می توانید تابع را چنان فراخوانی کنید که گویی جزئی داخلی در پروژه شماست.البته دو اشکال همراه این روش وجود دارد.اول آنکه ارجاع به چند Type Library بر کارایی برنامه تاثیر منفی میگذارد و دوم آنکه همه DLLها Type Library ندارند.اگر چه می توان یک ارجاع به این نوع DLLها هم تنظیم کرد اما نمی توان آنها را آنچنان که عضوی از برنامه باشند، فراخوانی کرد.
توجه: هیچیک از DLLهایی که API ویندوز را تشکیل می دهند Type Library ندارند.بنابراین برای فراخوانی آنها باید از دستور Declare در بخش تعریف ماژول (Declarations)استفاده کرد ساده ترین راه برای اضافه کردن یک عبارت Declare به کد برنامه استفاده از برنامه API Viewer است که شامل تعریف بسیاری از توابع API ویندوز به همراه تعریف ثابت ها و نوع داده مورد نیاز برای ان توابع است.
در اینجا مثالی از نحوه تعریف تابع GetTempPath که مسیر پوشه Temporary ویندوز را بر میگرداند(معمولا C:\windows\Temp است) آورده شده است: ِPrivate Declare Function GetTempPath Lib "Kernel32" _ Alias "GetTempPath" (ByVal nBufferLenght As Long, _ ByVal IpBuffer As String) As Long کلمه Declare به ویژوال بیسیک اعلام می کند شما قصد تعریف یک تابع DLL دارید.در یک ماژول استاندارد عبارت Declare می تواند به صورت Public یا Private تعریف شود ، بسته به اینکه شما بخواهید از آن تابع تنها در همان ماژول یا در کل پروژه تان استفاده کنید.
در یک ماژول کلاس، عبارت Declare تنها به صورت Private تعریف می شود.
نامی که بعد از کلمه کلیدی Function قرار می گیرد، نام تابع است (البته نامی که شما در پروژه تان برای فراخوانی تابع استفاده می کنید).
این نام می تواند کاملا مشابه نام خود API (همان نامی که در فایل DLL برای ان در نظر گرفته شده است) باشد.
اگر بخواهید از نام متفاو ت استفاده کنید باید نام حقیقی تابع را بعداز کلمه کلیدی Alias بیاورید.
در مثال فوق ، نام تابع API در فایلDLL ، GetTempPathA و نامی که شما می توانید تابع را در برنامه تان فراخوانی کنید GetTempPath است.
توجه داشته باشید با مشخص شدن نام حقیقی تابع از هر نام مجازی که بخواهید می توانید استفاده کنید.
بنابراین می توانید نام هایی که API Viewer به طور پیش فرض برای توابع در نظر می گیرد را به دلخواه تغیر دهید.
دو تابع پر استفاده دیگر که به کرات مورد استفاده قرار میگیرد در زیر آورده شده است: پخش فایلهای Wav : تابعی که برای پخش فایلهای Wav استفاده می شود تابع SndPlaySound است Declare Function sndPlaySound Lib "winmm.DLL" _ Alias "sndPlaySoundA" (ByVal lpszSoundName As String, _ ByVal uFlags As Long) As Long همانطور که می بینید مثال فوق یک Declare از تابع SndPlaySound می باشد که این تابع در کتابخانه Winmm.DLL موجود است .
کلمه Alias نشان می دهد که این تابع نام دیگری در DLL دارد .
سایر بخشها مربوط به تعریف پارامترهای تابع می باشند که در مورد مثال فوق ، این تابع دو پارامتر ورودی و یک خروجی از نوع Long دارد .
پارامتر lpzSoundName نام و مسیر فایل Wavو پارامتر uFlags چگونگی پخش فایل را مشخص می کند .
مقادیر ممکن این پارامتر عبارتند از : * SND_ASYNC : اجازه می دهد طوری فایل Wav پخش شود که آنرا بتوان وقفه داد .
بعبارت دیگر قادر خواهید بود فایل Wav تان را هر زمان که بخواهید پخش کنید و مطمئن باشید که حتماً شنیده می شود .
* SND_LOOP : فایل Wav را بطور ممتد پخش می کند .
* SND_NODEFAULT : اگر فایل Wav پیدا نشود صدای دیگری پخش نخواهد شد ( مثلاً برخی صداهای Default ویندوز ) * SND_SYNC : در طول پخش فایل Wav کنترل به برنامه داده نمی شود .
این پارامتر در زمانیکه می خواهید فایل Wav ای را در پس زمینه برنامه تان پخش کنید مناسب نمی باشد .
* SND_NOSTOP : اگر فایل Wav ای قبلاً در حال پخش باشد ، فایل Wav شما آنرا دچار وقفه نمی کند .
از این پارامتر زمانی استفاده می شود که بخواهیم فایل Wav مان هیچوقت در وسط کار قطع نشود .
نکته 1:اگر بخواهید از بیش از یکی از این پارامترها استفاده کنید توسط Or آنها را ترکیب نمائید مثال : sndPlaySound App.path & "\ding.wav", SND_ASYNC or SND_LOOP نکته2 : برای استفاده از توابع صوتی پیچیده تر بایستی از DirectSound که یکی از اجزای DirectX می باشد استفاده کنید .
در مورد DirectSound بعداً صحبت خواهم کرد .
ساخت یک تایمر با دقت بالا : شاید تا بحال از کنترل تایمر موجود در نوار ابزار ویژوال بیسیک استفاده کرده باشید .
این تایمر دارای دقت حدود ۵۵ میلی ثانیه است .
برای دستیابی به زمانهای با دقت بالاتر این کنترل مفید نخواهد بود .
تابع GetTickCount یک API موجود در کتابخانه Kernel32.DLL است .
این تابع طول زمانی را که سیستم شروع به کار کرده است را برحسب میلی ثانیه برمی گرداند : Private Declare Function GetTickCount Lib "kernel32" ( ) As Long برای بررسی طی شدن یک مدت زمانی خاص شما ابتدا باید مقدار این تابع را در یک متغیر کمکی مثل TempTime قرار دهید سپس در یک حلقه Do-Loop باید اختلاف زمان GetTickCount جدید و زمان TempTime را با مقدار زمانی که می خواهید سپری شود مقایسه کنید : TempTime = GetTickCount()x DesiredTime 'Thing Do some توسط کد بالا می توان یک عملیات خاص را برای یک مدت زمانی مشخص اجرا کرد .
کد زیر نشان می دهد که چگونه می توان دستورات خاصی را در فواصل زمانی خاص اجرار کرد ExitFunction = False TempTime = GetTickCount()x Do While not(ExitFunction)x If DesiredTime>GetTickCount() –TempTime Then Reset the temporary variable' TempTime 'Do Som Things = GetTickCount()x End If همچنین از تابع GetTickCount می توان برای benchmark برنامه ها استفاده کرد .
بعبارت دیگر می توان زمان اجرای یکسری دستورات خاص را بدست آورد .
منابع: آموزش گام به گام ویژوال بیسیک 6 ، نویسنده:گرگ پری مترجمین: مهندس فرهاد غنی زاده فر،مهندس سهیلا سرهنگی و سایتهای: www.Dev.ir www.iranvig.com www.com2.ir راحله رحیمی – الهام کامرانی تمیرداش ترم5- ناپیوسته کامپیوتر