ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

آشنایی با API

 
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET
View previous topic :: View next topic  
Author Message
unknown
مدير بخش ويژوال بيسيك
مدير بخش ويژوال بيسيك


Joined: 05 Dec 2004
Posts: 439
Location: Tehran

PostPosted: Sat Mar 12, 2005 1:28 pm    Post subject: آشنایی با API Reply with quote

آشنائی با Windows API-----Application Programming Interface

وقتی مایکروسافت ویندوز را نوشت مقدار عظیمی از کد را درون کتابخانه هایی در ویندوز قرار داد که برنامه نویسان می توانند به آنها دسترسی پیدا کنند. این که شما از چه برنامه ای (VB,C++,…) استفاده می کنید مهم نیست چون به راحتی می توانید از این کدها برای قدرتمندتر کردن برنامه هایتان استفاده کنید.در بسیاری از برنامه های تحت ویندوز همیشه فایل اجرائی (.EXE) حاوی تمام کد برنامه نیست. استفاده از این کدهای از پیش نوشته شده باعث قدرت و کم شدن حجم برنامه هایمان می شود. این کدها درون فایل هایی با پسوند .dll نوشته شده اند و ما به راحتی برنامه هایمان را به این فایل ها پیوند می دهیم (Link می کنیم) بنابراین این نکته مهم است که از این به بعد (اگر از dll استفاده می کنید) حتما برای اجرای برنامه به آن فایل کتابخانه ای احتیاج دارید. البته این قضیه ویژگی قابل حمل بودن برنامه ها را تحت تاثیر خود قرار می دهد.(یعنی نمی توانید مطمئن باشید که آن فایل dll هم موقع اجرای فایل در دیگر کامپیوتر ها موجود باشد).و بدین سان برنامه های Setup ایجاد شدند که تمامی فایل های مورد نیاز برنامه را روی کامپیوتر مقصد کپی می کند. شاید بگوئیداین فایل ها که در تمام ویندوزها هستند پس چرا...
درست است ولی ممکن است برنامه نویسان کدهای مورد نیاز خود را که در dll های ویندوز نیستند برای استفاده های بعدی خود درون فایل های dll قرار دهند.
dll مخفف Dynamic Link Library به معنی کتابخانهء پیوندی پویا می باشد.
خود برنامه های ویندوز هم از این فایل ها استفاده می کنند. این فایل ها در ویندوز xp در آدرس \WINDOWS\SYSTEM32 و در دیگر ویندوز ها در آدرس \WINDOWS\SYSTEM قرار دارند.
این فایل ها بسیار زیادند ولی سه تا از پر کاربردترین آنها در زیر آمده است.

User32.dll
توابع کنترل محیط و واسط گرافیکی ویندوز از قبیل منوها، کرسرها و... در این فایل می باشد.

GDI32.dll
خانهء بیشتر APIهای مربوط به گرافیک و توابع کنترل خروجی های ویندوز از قبیل صفحهء نمایش و یا ادوات دیگر مثل پرینتر می باشد.

Kernel32.dll
دسترسی به کارهای سطح پائین سیستم عامل در زمینهء سخت افزار و نرم افزار را فراهم می کند.

البته فایل های دیگری هم هستند.مثل:

Advapi32.dll
یکسری از سرویس های پیشرفتهء API شامل تعداد زیادی از توابع Registry و Security.

Comdlg32.dll
کتابخانهء API برای Common dialog
با Common dialog بیشتر آشنا می شوید.

Lz32.dll
روتین های فشرده سازی 32 بیتی

Mpr.dll
کتابخانهء API برای Multiple Provider Router

Netapi32.dll
کتابخانهء 32 بیتی برای شبکه

Shell32.dll
کتابخانهء 32 بیتی برای Shell API

Version.dll
کتابخانهء نسخه یا Version

Winmm.dll
کتابخانهء مالتی مدیا برای ویندوز

Winspool.drv
کتابخانه برای Print Spooler Interface

بعضی اوقات ممکن است اسناد API را به زبان c++ ببینید. برای تبدیل آن ها به API در ویژوال بیسیک باید یکسری تبدیلات انجام دهید. زیاد نترسید اینها را فقط برای اطلاعات عمومی تان می گم.

ATOM        ByVal variable as Integer 
BOOL        ByVal variable as Long 
BYTE        ByVal variable as Byte 
CHAR        ByVal variable as Byte 
COLORREF     ByVal variable as Long 
DWORD        ByVal variable as Long 
HWND        ByVal variable as Long 
HDC        ByVal variable as Long 
HMENU        ByVal variable as Long 
INT        ByVal variable as Long 
UINT        ByVal variable as Long 
LONG        ByVal variable as Long 
LPARAM        ByVal variable as Long 
LPDWORD     variable as Long 
LPINT        variable as Long 
LPUINT        variable as Long 
LPRECT        variable as Type any variable of that User Type 
LPSTR        ByVal variable as String 
LPCSTR        ByVal variable as String 
LPVOID        variable As Any use ByVal when passing a string 
LPWORD        variable as Integer 
LPRESULT      ByVal variable as Long 
NULL         ByVal Nothing or ByVal 0& or vbNullString 
SHORT        ByVal variable as Integer 
VOID        Sub Procecure not applicable 
WORD        ByVal variable as Integer 
WPARAM        ByVal variable as Long


قبل از کار با API لازم است چیزهای دیگری نیز بدانید:

Version Compatibility
مایکروسافت عادت بدی دارد که در نسخه های جدیدتر ویندوز ممکن است این فایل ها را Update کند ولی در هیچ جا به تغییرات احتمالی نمی پردازد. بنابراین ممکن است برنامه نویس این تغییرات را با Crash برنامه های خود و یا حتی سیستم خود متوجه شود.
File Size
یکی از بزرگترین نقاط منفی استفاده از API حجم بالای این فایل ها می باشد. ممکن است برخی اوقات از چند فایل کتابخانه ای در برنامهء خود استفاده کنید که از هرکدام فقط یک یا دو تابع آنها را لازم دارید. و این یک مشکل بزرگ در زمان بارگزاری (Load Time) شد. که این زمان می تواند چند ثانیه برای بارگزاری هر کدام باشد. و دیگر این که شما باید آنها را در Setup برنامهء خود قرار دهید که ممکن است Setup برنامهء شما چند مگابایت شود و این در حالی است که خود برنامه تان ممکن ایت حتی به یک مگابایت هم نرسد. این بزرگترین مشکل در توزیع برنامه در شبکه می باشد.
Documentation
کشف این که چرا رویه ها در فایل های dll هستند و چگونگی استفاده از آنها خیلی سخت است. شما در این قسمت چگونگی استفاده از چندین فایل و رویه را یاد می گیرید ولی تعداد این فایل ها بسیار زیاد است مثلا من چند هزار فایل dll دارم. چگونگی استفاده، در بسیاری از این فایل ها بدون کمک نویسندهء آن ها بسیار سخت است.

با وجود این مشکلات قدرت جادوئی API این است که آنها کدهایی هستند که شما احتیاجی به نوشتن دوبارهء آنها ندارید.
کار با API در vb از آنچه فکر می کنید بسیار ساده تر است. فقط قبل از همه چیز باید به vb بفهمانید آن رویه یا تابعی را که می خواهید استفاده کنید در کدام فایل dll وجود دارد.

نحوهء فرا خوانی dll ها در vb :
فرا خوانی dll ها در vb با استفاده از دستور Declare می باشد. Dll ها را باید در قسمت تعریف (Declaration) برنامه تعریف کنید(در بالای برنامه قبل از هر رویه یا تابعی)

[Private/Public] Declare Function/Sub Ex_name Lib “Dll name” [Alias “In_name”] (Parameters list & Type) As DataType

در دستور بالا همانند تعریف توابع نوشتن Private یا Public اختیاری می باشد. هر کدام از این زیر برنامه ها یا تابع اند یا رویه. پس باید یکی از Function/Sub را بنویسید. Ex_name نام خارجی تابع یا رویه را مشخص می کند. “Dll name” اسم فایل dll ای می باشد که داریم از آن استفاده میکنیم که حتما باید درون دو علامت نقل قول باشد. توابع یا رویه ها می توانند دارای اسم مستعار یا اسم داخلی باشند که با Alias مشخص می شوند. در آخر هم لیست نام و نوع پارامترها و نوع خروجی تابع را باید مشخص کنید.مثال:

Public Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long

شاید بگوئید ما از کجا باید نحوهء نوشتن این توابع را بدانیم؟
درست است ولی شما به این کار احتیاجی ندارید چون vb تمام این کارها را خود برایتان انجام می دهد. شما فقط کافی است نام تابع یا رویهء مورد نیازتان را بدانید فقط همین...
در vb یکسری برنامه های جانبی یا Add-Ins برای راحتی کار برنامه نویسان تعبیه شده. یکی از این برنامه ها برنامهء API Viewer می باشد که منبع بزرگی از توابع API می باشد.
برای استفاده از این برنامه در vb از منوی Add-Ins گزینهء Add-In Manager زا انتخاب کنید. در این پنجره لیستی از برنامه های جانبی را می بینید. روی گزینهء VB 6 API Viewer دو بار کلیک کنید و گزینهء Load On Startup را هم در قسمت راست پائین پنجره تیک بزنید.
حالا دکمهء Ok را کلیک کنید. خوب حالا دوباره به منوی Add-Ins بروید و گزینهء API Viewer را انتخاب کنید. در این برنامه منوی فایل را باز کنید و اولین گزینه یعنی Load Text File را انتخاب کنید و از پنجرهء باز شونده فایل متنی WIN32API.txt را باز کنید. خوب حالا با جستجوی تابع مورد نظر و دو بار کلیک بر روی هر کدام می توانید به Syntax آن تابع به راحتی دسترسی داشته باشید و همچنین می توانید آن تابع را به vb کپی کنید.

هنوز کاملا برای کار با API آماده نیستید. به این نکات خوب توجه کنید:

Declare
1.حالت پیش فرض Declareها در ماجول ها به صورت Public یا عمومی می باشد و می توان از آنها در تمام برنامه (پروژه) استفاده کرد.
2.تعریف Declareها در دیگر قسمت ها مثل فرم ها فقط می تواند به صورت شخصی یا Private انجام گیرد.

ALIAS
3.اگر API از رشته استفاده می کند باید ALIAS را با حرف A در پایان اسم داخلی آن استفاده کنید.A=ANSI , W=UNICODE
4.فقط ویندوز های NT نوع W را پشتیبانی می کنند.
5.بعضی از dll ها اسامی غیر مجازی در vb دارند و باید از ALIAS استفاده کرد.

Variable Type
6. تعداد خیلی کمی از dll ها نوع Variant را تشخیص می دهند.
7. ByRef پیش فرض vb می باشد.
8. AS ANY را هم می توانید به عنوان نوع به کار ببرید ولی تمام برسی های نوغ را از کار می اندازد.

Strings
9. API معمولا رشته هایی با طول ثابت نیاز دارد.
10. پاس کردن رشته به صورت ByVal به معنی پاس کردن اشاری گری به اولین بایت آن رشته می باشد.
11. پاس کردن رشته به صورت ByRef به معنی پاس کردن آدرس حافظه به آدرس حافظه ای است به اولین بایت داده در رشته برمی گردد.
12. معمولا رشته ها در vb به صورت ByVal به API پاس داده می شوند.
13. معمولا vb بافرهای بیشتر از 255 کاراکتر را انتظار ندارد.

Arrays
14. پاس کردن کل آرایه به API به صورت پاس کردن اولین المان آرایه با ByRef انجام می پذیرد.

Callback Function
15. از AddressOf برای پاس کردن تابع تعریف شده توسط خودتان استفاده کنید.
16. این Procedures باید در یک ماجول .bas باشند.

Passing a null value
17. برای پاس کردن null رشته با طول صفر (“”) کار نمی کند.
18. برای این کار از ثابت vbNullString در vb استفاده کنید.
19. برای پاس کردن null می توانید نوع را به Long تبدیل کنید و از 0& استفاده کنید.

Window Handle
20. یک Handle شماره ای است که توسط ویندوز به هر پنجره اختصاص داده می شود.
21. در vb یک Handle با خاصیت hWnd برابر است.
22. Handles همیشه از نوع Long می باشند.

Callbacks
23. بعضی از API ها می توانند یکی از توابع شخصی شما را اجرا کنند. این توابع Callbacks نامیده می شود.
24. vb از callbacks با استفاده از تابع AddressOf استفاده می کند که محل تابع را برای اجرا به API می دهد.
25. توابع Callback باید حتما در ماجول نوشته شوند.

Subclassing
26. تمام پنجره ها در ویندوز با پردازش پیغام ها به وسیله سیستم عامل کار می کنند.
27. شما می توانید چگونگی پاسخ دهی یک پنجره به یک پیغام را تغییر دهید.
28. برای جلوگیری از یک پیغام از SetWindowsLong استفاده کنید.

Miscellaneous
29. خواص کنترل ها باید با ByVal پاس شوند.
30. Handles همیشه با ByVal Long پاس می شوند.

توجه به این 30 نکته الزامی است.وقتی API راتعریف کردید همانند توابع و رویه های قبلی می توانید از آنها استفاده کنید.

خوب حالا کاملا برای استفاده از APIها آماده اید
یک مثال کاربردی در این زمینه.

پخش فایل های Wave در vb:
یک پروژهء vb را باز کنید و یک دکمه روی آن قرار دهید. سپس این کد را برای فرمتان بنویسید.

Option Explicit
'Declares
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal lpszSoundName As String, ByVal uFlags As Long) As Long
Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long
'Constants
Const SND_SYNC = &H0 'just after the sound is ended exit function
Const SND_ASYNC = &H1 'just after the beginning of the sound exit function
Const SND_NODEFAULT = &H2 'if the sound cannot be found no error message
Const SND_LOOP = &H8 'repeat the sound until the function is called again
Const SND_NOSTOP = &H10 'if currently a sound is played the function will return without playing the selected sound
Const Flags& = SND_ASYNC Or SND_NODEFAULT

Private Sub Command1_Click()
Dim i As Long
Const SoundFileName As String = "D:\Music\Persian\MARYAM\1.wav"

i = waveOutGetNumDevs()
If i > 0 Then 'There is at least one sound device.
    i& = sndPlaySound(SoundFileName, Flags&)
Else
    MsgBox "You don't have a sound card to play sounds!", vbCritical, "Error"
End If
End Sub

در این برنامه اول با استفاده از تابع waveOutGetNumDevs چک می شود که کاربر کارت صدا دارد یا نه. اگر داشت با استفاده از تابع sndPlaySound آن فایل که آدرس آن در ثابت SoundFileName ذکر شده است پخش می شود. برای اجرای کد در کامپیوترتان فقط نام فایل را به نام فایل دلخواهتان تغییر دهید.


اکثر اوقات نیاز دارید بدانید ویندوز در چه آدرسی در کامپیوتر کاربر نصب شده. برنامهء زیر آن را به صورت پیغام به شما نشان می دهد.

Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Private Function Winfolder() As String
Dim strsave As String
strsave = String(255, Chr$(0))
Winfolder = Left$(strsave, GetWindowsDirectory(strsave, Len(strsave)))
End Function

Private Sub Form_Load()
MsgBox Winfolder
End Sub

خوب فکر کنم تا همین جا کافی است. بعدا مثال های جالب تری با API برایتان می زنم.


مولف:
امیر مرادآبادی (amirmoradabadi@yahoo.com)
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum