全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3521
推到 Plurk!
推到 Facebook!

有關USB偵測 (IOCTL_USB_GET_NODE_INFORMATION)

缺席
brian_chen
一般會員


發表:14
回覆:20
積分:6
註冊:2007-06-26

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-07-11 18:38:04 IP:220.228.xxx.xxx 訂閱
在usbview上可以順利偵測 usb 的插拔動作
後來我把他移植到自己的程式中(原封不動,只是改成Class,方便以後使用)
可是不管怎麼樣,都會在IOCTL_USB_GET_NODE_INFORMATION這邊傳回 false
不知道是什麼原因....

希望有大大可以幫我看一下
<textarea name="code" class="cpp" rows="10" cols="60"> //取出有問題的片段 DWORD TForm1::EnumerateHostController(HANDLE HostControllerHandle) { DWORD BytesReturned; bool Success; char RootHubName[256] = "\\\\.\\"; HANDLE RootHubHandle; PUSBDEVICEINFO info; info = NULL; info = (PUSBDEVICEINFO) alloca(sizeof(USBDEVICEINFO)); info->HubInfo = (PUSB_NODE_INFORMATION)alloca(sizeof(USB_NODE_INFORMATION)); Success = DeviceIoControl(HostControllerHandle, IOCTL_GET_HCD_DRIVERKEY_NAME, &UnicodeName,sizeof(UnicodeName),&UnicodeName, sizeof(UnicodeName), &BytesReturned, NULL); //這邊執行完,原始程式跟我移植過去的 UnicodeName 有差異。之後附圖1a 跟 1b。 if(Success) { Success = DeviceIoControl(HostControllerHandle, IOCTL_USB_GET_ROOT_HUB_NAME, &UnicodeName, sizeof(UnicodeName),&UnicodeName, sizeof(UnicodeName), &BytesReturned, NULL); //這邊執行完,原始程式跟我移植過去的 UnicodeName 有差異,跟前圖一樣 //前面資料相同,後面字元都顯示亂碼,非"/0" if(Success) { WideCharToMultiByte(CP_ACP, 0, &UnicodeName.Name[0], (UnicodeName.Length)/2, &RootHubName[4], 252, NULL,NULL); RootHubHandle = CreateFile(RootHubName, GENERIC_WRITE, FILE_SHARE_WRITE, &SA, OPEN_EXISTING, 0, NULL); if(RootHubHandle != INVALID_HANDLE_VALUE) { // Root hub is open. Collect the node information Success = DeviceIoControl(RootHubHandle, IOCTL_USB_GET_NODE_INFORMATION, info->HubInfo, sizeof(USB_NODE_INFORMATION), info->HubInfo, sizeof(USB_NODE_INFORMATION), &BytesReturned, NULL); //這邊執行完:原程式的sizeof(USB_NODE_INFORMATION) = 76,移植程式的sizeof(USB_NODE_INFORMATION) = 73 //結果回傳:原程式為true,移植程式為false //之後就跳出來了@@ //問題就是,都沒改什麼,怎麼會有差異 if (!Success) return GetLastError(); else { // Get the ports and take the data GetPortData(RootHubHandle, info->HubInfo->u.HubInformation.HubDescriptor.bNumberOfPorts, 0); } } //CloseHandle(RootHubHandle); } } return 0; } </textarea> 附圖1a:原始程式執行 附圖1b:移植程式執行
編輯記錄
brian_chen 重新編輯於 2007-07-11 18:39:42, 註解 無‧
brian_chen 重新編輯於 2007-07-11 18:42:31, 註解 無‧
brian_chen 重新編輯於 2007-07-11 18:44:21, 註解 無‧
brian_chen 重新編輯於 2007-07-11 18:45:30, 註解 無‧
brian_chen 重新編輯於 2007-07-12 12:04:38, 註解 無‧
brian_chen 重新編輯於 2007-07-12 12:06:43, 註解 無‧
brian_chen
一般會員


發表:14
回覆:20
積分:6
註冊:2007-06-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-07-12 15:04:36 IP:59.120.xxx.xxx 訂閱
已經找到問題點了
http://delphi.ktop.com.tw/board.php?cid=31&fid=79&tid=57122
中 chrischung73 大大有提到

-------------------------------------------------------------------------------------------
不曉得有沒有人執行時遇到相同的問題
發生 「error 122 傳遞到系統呼叫的資料區太小」的錯誤
我將如何解決的經驗list在這裡, 希望能對其他人有幫助

這是問題是因為 sizeof(USB_NODE_INFORMATION) 計算有出入
用VC 查看size等於74, 但BCB卻是71
作下列修改即可

typedef struct _USB_NODE_INFORMATION {
// USB_HUB_NODE NodeType; /* 刪除這一行 */
short UsbHub, UsbMIParent; /* 用這一行取代 */
union {
USB_HUB_INFORMATION HubInformation;
USB_MI_PARENT_INFORMATION MiParentInformation;
} u;
} USB_NODE_INFORMATION, *PUSB_NODE_INFORMATION
;
-------------------------------------------------------------------------------------------

改完之後,真的就可以用了......
不過不知道為什麼要這麼改@@
系統時間:2024-03-29 7:25:38
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!