مقاله ترجمه شده  api

دانشگاه فنی و حرفه ای شهید شمسی پورمقاله ترجمه شده apiنام دانشجو:طاها منتریشماره دانشجویی:97210033206018نام درس زبان تخصصینام استاد حمید علی زاده********************توضيحي مختصر درباره 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 بيتي قديمي دارد.سه فايل كه عمدتا استفاده مي شوند عبارتند از:· 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دسترسي داشته باشنددلايل استفاده از توابع API1- توابع API به دليل اينكه در فايلهاي DLL هر سيستم عامل ويندوز ميباشند و در هر مكان مانند يكديگر ميباشند پس نيازي به ارايه ي آن فايل DLL در نسخه برنامه نميباشد و در نتيجه حجم نسخه كم ميشود.2- بيشتر توابع كارهايي را انجام ميدهند كه زبان هاي برنامه نويسي قادر به انجام آن كار نيست.و چندين علت ديگر ...چند نمونه از توابع API در ويندوز:v GetSysColorكتابخانه: User32 سيستم عامل:, CE , 2000 , 98 , 95مبتني بر NTاين تابع مقدار ارزشيRBG يكي از رنگهاي سيستم را برميگرداند.رنگهاي سيستم آنهايي هستندكه يك پنجره مورد استفاده توسط آنها كشيده مي شود.براي مثال رنگ تيتر پنجره.رنگ اسكرول بار(Scrollbar) ، رنگ زمينه(DeskTop) و رنگ دور(Border) و ...&&&&&&&&&&&&&&&&&&&&&&&&&&v GetSystemMetricsكتابخانه:User32 سيستم عامل: , 32S, 98,95مبتني بر NTاين تابع اطلاعات بسيار گوناگوني از ويندوز ميدهد.بيشتر اينها با اندازه هاي اشياي گوناگون از جمله صفحه ، آيكونها، كرسر و ... سركار دارند.اين دستور اطلاعات در رابطه با سيستم را آماده مي كند.مقدار برگشتي اين تابع بستگي به مقدار nindex * دارد.همه اندازه هاي نگهداري شده(درازا و پهنا)بر حسب نقطه(pixel) ميباشد.توجه كنيد معني بعضي از اقلام سيستم متريك در ويندوز 95 و 98 با ويندوز NTكمي متفاوت است.*: nindex --< يك ايندكس كه فلگ است و نوع اطلاعات را مشخص ميكند.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetsystemMenuكتابخانه: User32 سيستم عامل: ,CE , 2000 , 98 , 95مبتني برNTاين تابع هندل منوي سيستم را برميگرداند(كه به آن كنترل منو نيز مي گويند).اين منو زماني ظاهر ميشود كه ما روي آيكون برنامه در روي تايتل بار پنجره برنامه مان كليك كنيم يا روي خود تايتل بار كليك راست را بزنيم.وقتي كه شما بتوانيد هندل منوي سيستم را پيدا كنيد، ميتوانيدبه ان آيتم اضافه يا كم كنيد.(اين نكته يعني كار بر روي منوبار سيستم بسيار مهم است).نكته مهم ديگر اين است كه با انتخاب هر آيتم از منوي سيستم يك پيام(يك كد) به WM_SYSCOMMANDارسال ميگردد.به جاي آنكه اين پيام به WM_COMMANDارسال شود.از تابع GetSystemMenuمي توان براي ذخيره مجدد(برگرداندن)آيتمهاي پيش فرض پس از تغييرات نيز استفاده نمود.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetNumberForematكتابخانه: Kernel32 سيستم عامل: CE , 2000 , NT , 98 , 95اين تابع يك عدد را براي نمايش فرمت ميكند.به صورت پيش فرض تابع فرمت عدد را با استفاده از settingمحلي انجام ميدهد.اگر چه ارجحيت با فرمت تعيين شده كاربر ميباشد.نتيجه نهايي تابع ، يك عدد براي نمايش مطابق با خواست كاربر ميباشد.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetMenuكتابخانه: User32 سيستم عامل: 2000 , NT , 98 , 95اين تابع تشخيص ميدهد كه كدام منو به يك پنجره اختصاص داده شده است.اين منو به صورت يك منوبار ظاهر مي شود.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetLogicalDrivesكتابخانه: Kernel32 سيستم عامل: 32S,NT,98,95اين تابع همه درايوهاي منطقي موجود در كامپيوتر را تعيين مي كند.درايو منطقي با يك حرف مشخص مي شود مانند a: يا c:. اين تابع براي هر درايو يك بيت برميگرداند.با استفاده از عملگر ANDشما ميتوانيد درايوها را مشخص نمايد. مثلا براي مشخص شدن وجود درايو cكافيست مقدار برگشتي را با عدد 4 تركيب AND نماييد.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetLocalTimeكتابخانه: Kernel32 سيستم عامل: NT,98,95اين تابع تاريخ و زمان سيستم را برميگرداند.تاريخ و زمان اجزاي مختلفي دارند(ماه ، روز، ساعت، دقيقه و ثانيه و ...) حتي هزارم ثانيه نيز در اين متغير پاس داده مي شود و در IpsystemTime * ذخيره مي گردد. ويندوز زمان محلي را به زمان سيستم ترجيح ميدهد.*: IpSystemTime --< متغيري كه اطلاعات تاريخ و ساعت در آن قرار دارد.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetHostNameكتابخانه: WSock32 سيستم عامل: NT,98,95,2000,CEاين تابع نام كامپيوتر ميزبان را استخراج ميكند، كه ميتواند يك نام ساده يا يك نام دومين Domain)) باشد.هر چه كه باشد با ان و تابع GetHostByName ميتوان اطلاعات مورد نياز را از شبكه استخراج نمود ، مانند IP.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetHostByNameكتابخانه: WSock32 سيستم عامل: NT,98,95,2000,CEاطلاعات كامپيوتر را بر اساس نام آن (domain) برميگرداند.اطلاعات ميزبان داخل يك استراكچر با نام HOSTENTذخيره مي شود. يك اشاره گر كه توسط اين تابع برگشت ميشود به اين استراكچر اشاره مي كند.توجه كنيد كه اين تابع، كامپيوتر ميزبان را بر اساس IP نمي تواند مشخص كند(به جاي ان از تابع GetHostByAddrاستفاده ميگردد).نكته: براي دستيابي به اطلاعات برگشتي از تابعGetMemoryبراي كپي داده و انتقال اطلاعات مي توان استفاده نمود.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetHostByAddrكتابخانه: WSock32 سيستم عامل: NT,98,95,2000,CEاطلاعاتي راجع به كامپيوتر ميزبان مي دهد.اين كامپيوتر معمولا با آدرس شبكه اي شناخته ميشود(معمولا نياز به آدرس IPنيست).اطلاعات راجع به كامپيوتر ميزبان درون يك استراكچر با نام HOSTENTذخيره ميشود ، كه اين تابع با برگرداندن يك اشاره گر به ان اشاره ميكند.نكته:براي دستيابي به اطلاعات برگشتي از تابع CopyMemoryبراي كپي داده و انتقال اطلاعات مي توان استفاده كرد.&&&&&&&&&&&&&&&&&&&&&&&&&&v CopyMemoryكتابخانه: Kernel32 سيستم عامل: CE , 2000 , NT , 98 , 95اين تابع بسيار شبيه به تابع MoveMemoryميباشد.واقعيت اين است كه هر دو اينها مشابه هم هستند.تابع فوق قسمتي از يك محل حافظه را به محل ديگرMoveميكند. و هر دو به وسيله اشاره گرهايي آدرس دهي ميشوند.پس از كپي حافظه ،مبدا با مقدار صفر پر ميشود.نكته: يك اشاره گر ميتواند خود به خود با پاس دادن خود متغير به جاي مبدا و مقصد نيز ساخته شود.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetFocusكتابخانه: User32 سيستم عامل: CE , 2000 , NT , 98 , 95هندل پنجره فعال كه سيستم روي ان متمركز شده را برميگرداند.اگر روي پنجره اي خارج از برنامه در حال اجرا (پنجره اي كه جز برنامه ما نيست )متمركز شويم ، اين تابع خطا بر ميگرداند.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetFileTimeكتابخانه: Kernel32 سيستم عامل: CE , 2000 , NT , 98 , 95اين تابع زمانها و تاريخهاي ايجاد ، اخرين دسترسي و آخرين تغييرات را بر ميگرداند.اين زمانها و تاريخ ها بر اساس سيستم UTC(مطابق زمان جهاني، زمان گرينويچ GTM) ميباشد و نه زمان محلي كامپيوتر.توجه كنيد كه نتيجه كاملا وابسته به زمان فايل و سيستم است.زيرا سيستم عامل زمانهاي ايجاد دسترسي و تغييرات را به طور كامل ذخيره نمي كند(يعني ممكن است تاريخ نمايش داده شده ، تاريخ واقعي ذخيره شده نباشد. زيرا تاريخ ذخيره شده به صورت مختصر مي باشد ولي براي نمايش آنرا بر اساس يك سري پيش فرض كامل مي كند.)&&&&&&&&&&&&&&&&&&&&&&&&&&v GetDiskFreeSpaceكتابخانه: Kernel32 سيستم عامل: CE , 2000 , NT , 98 , 95اين تابع اطلاعاتي راجع به فضاي خالي يك ديسك به ما ميدهد.اين اطلاعات شامل تعداد سكتورهاي هر كلاستر و تعداد بايت هاي يك سكتور و تعداد كلاسترهاي خالي و تعداد كل كلاسترهاست.به دليل وجود محدوديت در عدد(حداكثر 32 بيتي) اين دستور در نهايت مي تواند براي هارد ديسكهاي حداكثر 2 مگابايت پاسخگو باشد.ولي تابع GetDiskFreespaceExاين محدوديت را ندارد.&&&&&&&&&&&&&&&&&&&&&&&&&&v GetComputerNameكتابخانه: Kernel32 سيستم عامل: NT , 98 , 95نام كامپيوتر مورد استفاده را برميگرداند.اين نام در پارامتري به نام IpBufferذخيره ميگردد.اگر خطا باشد مقدار صفر و در صورت موفق بودن تابع مقدار يك را برميگرداند.نكته:اگر مي خواهيد تغيير نام را به صورت دستي انجام دهيد با استفاده از اين دستور نام كامپيوتر را پيدا كرده و آنرا در رجيستري ويندوز جستجو نماييد و در صورت نياز انرا تغيير دهيد.&&&&&&&&&&&&&&&&&&&&&&&&&&v FillMemoryكتابخانه: Kernel32 سيستم عامل: NT , 98 , 95,2000مكاني در حافظه سيستم را با يك مقدار معين پر مي كند.اين عمل با قرار دادن مقدار خواسته شده در محل حافظه مورد نظر از شروع تا پايان انجام مي شود.نحوه دسترسي به محل حافظه توسط يك اشاره گر به محل حافظه مشخص مي گردد.&&&&&&&&&&&&&&&&&&&&&&&&&&v ExitWindowsExكتابخانه: User32 سيستم عامل NT , 98 , 95اين تابع كامپيوتر را shut Down و يا ريبوت(ReBoot) و يا Log Off و ... مي كند.بايد توجه داشت با اجراي دستور بلافاصله عمليات اجرا مي گردد.پس در استفاده از ان دقت شود.در صورت موفق بودن ، مقدار 1 و ناموفق بودن تابع مقدار صفر را بر مي گرداند.&&&&&&&&&&&&&&&&&&&&&&&&&&v DeleteFileكتابخانه: Kernel32 سيستم عامل: NT , 98 , 95به طور كامل يك فايل را پاك ميكند.(به داخل سطل آشغال نمي فرستد و براي حذف كردن از شما تايد نمي خواهد.بنابراين در استفاده از تابع بايد دقت نمود.در صورت موفق بودن مقدار يك و براي ناموفق بودن(در صورت عدم وجود فايل) مقدار صفر را برمي گرداند.&&&&&&&&&&&&&&&&&&&&&&&&&&v 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()xDesiredTime < Do While GetTickCount() - TempTime'Thing Do someLoopتوسط کد بالا مي توان يک عمليات خاص را براي يک مدت زماني مشخص اجرا کرد .کد زير نشان مي دهد که چگونه مي توان دستورات خاصي را در فواصل زماني خاص اجرار کردExitFunction = FalseTempTime = GetTickCount()xDo While not(ExitFunction)xIf DesiredTime>GetTickCount() –TempTime ThenReset the temporary variable'TempTime 'Do Som Things= GetTickCount()xEnd IfLoopهمچنين از تابع GetTickCount مي توان براي benchmark برنامه ها استفاده کرد . بعبارت ديگر مي توان زمان اجراي يکسري دستورات خاص را بدست آورد .منبع:https://www.sciencedirect.com/science/article/abs/pii/S01676423203016