C: יצירת קשר עם device

Metheny

New member
C: יצירת קשר עם device

אני מנסה ליצור קשר עם usb interface device כלשהו. לפי מה שהבנתי, אפשר לפתוח את הקשר עם ה-device בעזרת CreateFile. הבעייה היא הפרמטר הראשון שצריך לתת ל-CreateFile , והוא שם ה-device. כדי למצוא את שם ה-device אמורים לעשות enumeration של כל ה-devices שמתאימים ל-GUID שיש לי ביד, ולבחור את ה-device המתאים מביניהם. אני מקווה שעד כאן הכל נכון. הנה הנסיון שלי לכתוב את זה בקוד: בהתחלה אני מגיד איזשהו שם (USB_MY_DEVICE) שייצג את ה-GUID.
DEFINE_GUID(USB_MY_DEVICE, 0x4D36E972, 0xE325, 0x11CE, 0xBF, 0xC1, 0x08, 0x00, 0x2B, 0xE1, 0x03, 0x18);​
אח"כ, עם הפונקציה SetupDiGetClassDevs, אני מקבל את כל האינפורמציה של כל ה-devices שעונים ל-GUID שאני רוצה. ובסוף, עם הפונקציה SetupDiEnumInterfaceDevice, אני עובר על כל ה-devices שנמצאו. הבעייה שהפונקציה SetupDiEnumInterfaceDevice מחזירה לי כישלון על הפעם הראשונה, ו-GetLastError מחזיר 0. אבל לפי מה שהבנתי, אם הפונקציה נכשלת כי אין יותר devices (אם i גדול שווה למספר ה-devices שנמצאו), אז GetLastError אמור להחזיר ERROR_NO_MORE_ITEMS. או אם הפונקציה נכשלת מסיבה אחרת, GetLastError אמור להחזיר ערך שגיאה כלשהו. מישהו יודע מה יכולה להיות הבעייה?
HDEVINFO hInfo ; hInfo = SetupDiGetClassDevs((LPGUID)&USB_MY_DEVICE,NULL,NULL,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE ) ; if (hInfo == INVALID_HANDLE_VALUE) return 1; for (DWORD i=0; ; ++i) { SP_INTERFACE_DEVICE_DATA Interface_Info; Interface_Info.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); // Enumerate device if (! SetupDiEnumInterfaceDevice(hInfo, NULL, (LPGUID)&USB_MY_DEVICE,i, &Interface_Info)) { SetupDiDestroyDeviceInfoList(hInfo); return(i); } }​
 
איפה אתה בודק כאן את GetLastError? אל תשכח ש GetLastError מחזיר את תוצאת הפעולה האחרונה שעשית. אם אתה בודק אותו מחוץ לפונקציה, אז אתה מבצע גם את SetupDiDestroyDeviceInfoList שמצליח ולכן GetLastError הוא אפס. אם אתה רוצה ערך משמעותי של Last Error אתה חייב לבדוק אותו מייד, לא לחכות עד אחרי שתעשה פעולות אחרות של מערכת ההפעלה.
 

Metheny

New member
פה לא הכללתי את הקריאות

רציתי להראות את הקוד העיקרי. אבל בקוד שלי קראתי לו מייד אחרי הפונקציות.
 

Metheny

New member
סליחה אתה צודק!

באמת קראתי לו אחרי קריאה לפונקציה אחרת. תודה! אז אני מקבל מ-GetLastError את ה- ERROR_NO_MORE_ITEMS. כלומר הוא לא מוצא שום interface device, למרות שיש לפחות אחד. רעיונות?
 
יכולות להיות כמה אפשרויות - או שה device שלך לא תקין / לא מחובר / הדרייבר שלו לא מותקן (איזה מכשיר זה בכלל?) - או ש GUID שלך לא נכון (מאיפה הבאת אותו?) - או שהוא לא מסוג DEVICEINTERFACE אני קצת מנחש פה כי אני לא כל כך מכיר את הממשק הזה, אבל למה שלא תנסה להתחיל מדוגמא מ MSDN - אל תגביל את החיפוש, תרוץ על יותר סוגי devices וככה תמצא אותו יותר בקלות. הנה לינק לדוגמא: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/displaying_the_installed_devices.asp
 

Metheny

New member
כן, בדיוק את הדוגמא הזאת ראיתי

ה-device הוא מין מכשיר טלפון USB, שהתיאור שלו (כמו שלמשל מודפס בדוגמא שהבאת לה לינק) הוא (HID (Human Interface Device, ולכן לפי מיטב הבנתי הוא אמור להופיע ב-DEVICEINTERFACE. לקחתי את ה-GUID מה פרטים שהתקבלו ע"י תוכנית הדוגמא.
 
למעלה