מאמר זה נועד למתקדמים שכבר יודעים כיצד ליצור רכיבי (ActiveX.Dll) COM ולשלבם בדפי ASP . המאמר ידגים כיצד ליצור רכיבים מורכבים יותר תוך שימוש בפונקציות API. למתחילים אני מציע לקרוא קודם כל את הכתבה "יצירת רכיבי COM בעזרת visual basic" שבאתר זה ולתרגל יצירת רכיבי COM.
מהו API – Application Programming interface?
ניתן להתייחס למערכת ההפעלה כאל אוסף של פונקציות ושירותים אליהם פונים היישומים השונים. למשל פונקציות המטפלות בשמירת קבצים, הצגת גרפיקה למסך, הדפסה ועוד. פונקציות אילו נקראות פונקציות API .בדרך כלל גם כמתכנתים אנו לא פונים ישירות לפונקציות ה API אלא אנו כותבים פקודות שונות בזמן הרצת הקוד מתבצעת קריאה לפונקציות ה API המתאימות , למשל אנו נכתוב את הפקודה PRINT ב VB ובזמן הריצה VB יקרא לפונקצית ה API האחראית להדפסה (או בעצם לסדרה של פונקציות).
ואולם ניתן מסביבות פיתוח התומכות באוטומציה כגון VB C או JAVA לפנות ישירות לפונקציות ה API השונות. היכולת לפנות ישירות ל API פותח בפני המתכנת עולם חדש של יישומים שלא זמינים ישירות מכלי הפתוח הרגיל, יש כיום יותר מ 5,000 פונקציות API זמינות למערכת ההפעלה חלונות 2000 !!!
יצירת תקשורת: PING, DNS, TCP/IP ,בדיקת משאבי המחשב כגון זיכרון ו CPU מדפסות כרטיסי רשת גרפיקה ועוד הם רק חלק מזערי מפונקציות API הזמינות, בעצם אפשר להגיע לכל חלק במערכת ההפעלה לקבל עליו מידע ולהפעיל אותו ( אם יודעים מה וכיצד לחפש).
יישום ה API הראשון שלנו
ביישום הראשון אנו ניצור אוביקט ActiveX DLL נשתמש בפונקצית ה API SLEEP, פונקציה פשוטה זו מקבלת כפרמטר מספר של אלפיות- שניה (M’ seconds) ועוצרת את בצוע התוכנית לאותו פרק זמן (לא להתאכזב פונקציות מרתקות יותר יגיעו בהמשך, בחרתי בפונקציה עקב פשטותה).
נעיין בקוד VB הבא ( אני מניח שאתם יודעים כצד לפתוח פרויקט BV מסוג ActiveX Dll ולהזין לתוכו את הקוד)
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Public Sub stopprog(ByVal TimeMS As Integer)
Sleep (TimeMS)
End Sub
השורה הראשונה בקוד היא הצהרה על פונקצית ה API בשם SLEEP ( הסבר מפורט בהמשך).
בעוד שהפונקציות של VB זמינות תמיד הרי שעל מנת שפונקצית API תהיה זמינה יש להצהיר עליה בתחילת הפרויקט.
לאחר מיכן יצרתי Public Sub בשם stopprog ומתוכו הפעלתי את הפונקציה SLEEP (לאחר ההצהרה היא זמינה כמו כל פונקציה אחרת).
כאשר "נהדר" את קובץ ה DLL נוכל לקרוא לו מ ASP ולהשתמש בשרות (TimeMS) STOPPROG   על מנת לעצור את קוד ה ASP שלנו לכל פרק זמן שנרצה (בשביל מה זה טוב ? נו זו רק דוגמה, למרות שתתפלאו מצאתי לזה שימוש אבל זה כבר למאמר אחר).
אז כיצד ידעתי איך מצהירים על פונקצית ה API ?
קודם כל אם ההצהרה נראת לחלק ממכם לא מובנת זה בגלל שפונקציות ה API נכתבו במקור ב C ולכן למתכנתי VB הם לא תמיד מובנות אולם בגדול אמרתי שאני רוצה לקרוא לפונקציה SLEEP הנמצאת בספריה kernel32 זו ספריה של פונקציות API המטפלות בליבת מערכת ההפעלה.
על מנת להקל עלינו בשימוש בפונקציות API מיקרוסופט מעמידה לשרותינו כלי מיוחד הנקרה API Viewer.
היכנס ל VISUAL STUDIO TOOLS שם תמצא את תוכנת API Viewer והפעל אותה. לאחר הפעלת התוכנה הכנס ל file בחר ב load text file… ובחר בקובץ WIN32API זהו קובץ טקסט שמספקת מיקרוסופט ובו כל ההצהרות והמשתנים של פונקציות ה API. בעזרת ה API Viewer אתה יכול לעין בקובץ בנוחות.
בחלון ה API Type בחר ב declares , בחלון ה available items חפש את הפונקציה SLEEP ובחר בה, בחלון declare scope בחר ב private ולחץ על הכפתור ADD, בחלון ה selected item תופעה ההצהרה וכל מה שנותר הוא להעתיק אותה לקוד שלנו. כפי שבודאי ראיתם מיקרוסופט כהרגלה מספקת לנו כלי מאוד עלוב אין אפילו הסבר קצר מה עושה כל פונקציה, מקור מעולה לקבלת אנפורמציה על פונקציות API הוא האתר http://www.allapi.net.
באתר זה תוכלו למצוא הסברים נוספים, דוגמאות קוד ובעיקר שני כלים נהדרים האחד נקרא APIViewer2001 שהוא גירסה מעודכנת של התוכנה של מיקרוסופט ( כן כן מיקרוסופט לא טורחת לעדכן את קובץ ה WIN32API ) והתוכנה השניה שהיא ממש מדהימה נקראת API Guid והיא מאגר של יותר מ 800 פונקציות API עם הסברים ודוגמאות שמתעדכן כל הזמן.
כן וזה חינם וחופשי לחלוטין בתנאי שתשלח להם גלוית תודה – אני שלחתי (- ;
מקור נוסף לדוגמאות הוא האתר http://www.vbapi.com/ref/index.html האתר כבר לא מתעדכן אבל יש בו מאגר גדול של פונקציות ודוגמאות וניתן למצוא בו מציאות
בחלק ב של המאמר נלך צעד נוסף קדימה: תוך שימוש בפונקציות API נבנה רכיב ACTIVEX DLL הבודק כל הזמן מה ניצולת הזיכרון של השרת , לאחר מכן נפעיל אותו מקובץ ASP תוך שאנו מתעדים את העומס על זיכרון המחשב.
בנית רכיב COM ע"י שימוש בפונקצית ה API GlobalMemoryStatus
פונקציה זו מאפשרת לנו לקבל נתונים על הזיכרון הפיזי והוירטואלי של השרת עליו רץ האתר , השתמשתי פעמים רבות בפונקציה זו על מנת ליצור רכיבי COM הבודקים את העומס על השרת (אני משלב גם פונקציות API נוספות הבודקות את ה CPU והתקשורת לשרת על מנת לאתר עומסים חריגים).
נבחן את הקוד הבא (הקוד מצורף גם כקובץ פרויקט VB) :
Option Explicit
חלק א הגדרת משתנים
Private Type MEMORYSTATUS
dwLength As Long
dwMemoryLoad As Long
dwTotalPhys As Long
dwAvailPhys As Long
dwTotalPageFile As Long
dwAvailPageFile As Long
dwTotalVirtual As Long
dwAvailVirtual As Long
End Type
Private memo As MEMORYSTATUS
API חלק ב הכרזה על פונקצית ה
Private Declare Sub GlobalMemoryStatus Lib "kernel32" _
(lpBuffer As MEMORYSTATUS)
חלק ג שימוש בפונקציה
Public Function memusedPhys() As String
Dim MemoP As Single
memo.dwLength = Len(memo)
Call GlobalMemoryStatus(memo)
MemoP = (memo.dwTotalPhys - memo.dwAvailPhys) / memo.dwTotalPhys
memusedPhys = Round(MemoP * 100, 2) & "%"
End Function
חילקתי את הקוד לשלושה חלקים
חלק א הגדרת משתנים
חלק ב הכרזה על פונקציה ה API
וחלק ג שימוש בפונקציה
תרשו לי להתחיל דווקא מחלק ב: אנו רואים הצהרה על פונקצית API המזכירה לנו את ההצהרה על הפונקציה SLEEP בה דנו בחלק א של המאמר אולם שימו לב לדבר מעניין:
בתוך הפונקציה נמצא את הקוד הבא lpBuffer As MEMORYSTATUS מה זה?!
ובכן הקוד אומר שהפונקציה משתמשת במשתנה בשם lpBuffer המוגדר כ סוג MEMORYSTATUS, נכון ,כמו שיש משתנה מסוג STRING לאחסון מחרוזות או LONG לאחסון מספרים יש משתנה מסוג MEMORYSTATUS לאחסון הנתונים על זיכרון המחשב. לא מוכר לכם סוג כזה של משתנה? לכן בא חלק א של הקוד ובו הצהרת Type המגדירה את סוג המשתנה MEMORYSTATUS (כאשר הפונקציה נכתבה במקור בשפת C המתכנת יצר את המבנה MEMORYSTATUS ע"י שימוש במשפט מובנה – STRUCT, אנשי VB לא הבנתם לא נורא זה לא כל כך חשוב).
הצהרת TYPE אומרת לנו שמשתנה מסוג MEMORYSTATUS יאחסן 8 מספרים מסוג LONG ובכל אחד נתון אחר על הזיכרון:
נסקור את המשתנים החשובים לנו:
המשתנה dwLength אורך המשתנה MEMORYSTATUS (הסבר בהמשך)
המשתנה dwTotalPhys סה"כ זיכרון פיזי במחשב
המשתנה dwAvailPhys זיכרון פיזי פנוי
המשתנה dwTotalVirtual סה"כ זיכרון וירטואלי במחשב
המשתנה dwAvailVirtual זיכרון וירטואלי פנוי.
חשוב הצהרת ה TYPE חיבת תמיד לבוא לפני ההצהרה על פונקצית ה API !
כיצד נקבל מידע על מבנה סוגי משתנים TYPE ?
כפי שהודגם בחלק א של המאמר על הפונקציה SLEEP, ניתן ע"י שימוש בתוכנה API Viewer לקבל את אופן ההצהרה על פונקציות ה API ובאותו אופן על הפונקציה GlobalMemoryStatus אבל לאחר עיון בקוד נראה שהפונקציה מכילה משתנה מסוג MEMORYSTATUS כיצד ידעתי את מבנה הצהרת ה TYPE שלו? הרי לא מדובר בסוג משתנה סטנדרטי?
אל דאגה API Viewer יש מידע גם על מבנים TYPE של סוגי משתנים. על מנת לקבל את המבנה של המשתנה MEMORYSTATUS יש להפעיל את תוכנת API Viewer ולטעון את קובץ הטקסט WIN32API (כפי שהוסבר בחלק א במאמר הקודם)
בחלון ה API Type בחר ב TYPES !!! , בחלון ה available items חפש את המבנה MEMORYSTATUS ובחר בו, בחלון declare scope בחר ב private ולחץ על הכפתור ADD, בחלון ה selected item תופעה הצהרת הTYPE וכל מה שנותר הוא להעתיק אותה לקוד שלנו, לפני הצהרת ה API אותה מצאנו קודם!!!.
כמובן שבאותו אופן מומלץ בחום להשתמש בשתי התוכנות הנוספות שהצגתי בחלק א במאמר הקודם.
בהמשך חלק א של הקוד שלנו הכרזתי על המשתנה memo כמשתנה מסוג MEMORYSTATUS.
בחלק ג של הקוד יצרתי פונקציה ציבורית בשם() memusedPhys פונקציה זו תיתן את אחוז הזיכרון שבשימוש.
בפונקציה נמצא את שורת הקוד הבאה memo.dwLength = Len(memo) ,שורת קוד זו מגדירה את אורך הסוג MEMO -כ 32 בתים (הסוג MEMORYSTATUS מגדיר 8 מספרים מסוג LONG בני 4 בתים כל אחד) לא הבנתם, ממש ממש לא נורא ההסבר המדויק ארוך ומיגע ולא חשוב, אם נרצה להיות תכליתיים הרי שנוכל לסכם ולומר ששורת קוד זו הכרחית לאתחול המשתנה עבור פונקצית ה API, היא לא משתנה, ותחזור הרבה פעמים גם בפונקציות API אחרות עבור המאפיין dwLength. בשורות הבאות קראתי לפונקציה GlobalMemoryStatus(memo) והצבתי בה את המשתנה memo לאחר מכן השתמשתי במשתנה המכיל את כמות הזיכרון הפיזי הכללי במחשב memo.dwTotalPhys ובמשתנה המכיל את כמות הזיכרון הפיזי הפנוי memo.dwAvailPhys לחישוב אחוז הזיכרון המנוצל, שינוי פורמט לאחוזים וגמרנו.
באותה דרך נוכל לבנות פונקציה המטפלת בזיכרון הוירטואלי של המחשב. פונקציות ציבוריות אלו יהיו זמינות לך מקוד ASP לאחר שתהדר את קובץ ה DLL .
להורדת קובץ ZIP עם הדוגמאות, לחץ כאן
בהצלחה
|