線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2147
推到 Plurk!
推到 Facebook!

二問 DevicePath 取得問題

缺席
HUNK999
初階會員


發表:9
回覆:35
積分:28
註冊:2009-07-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-08-03 18:45:13 IP:220.130.xxx.xxx 未訂閱
  請問如何得到DevicePath ? 


[code cpp]
interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); // cbSize=28 正確!
int ErrorCode00 = GetLastError(); //0 : 顯示沒錯誤

//------------------------------------------------------------------------
//Get interface
if(!SetupDiEnumDeviceInterfaces(hDev, NULL, &guid, dwDevice, &interfaceDev)||
SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, NULL, 0, &dwSize, NULL))
{
return INVALID_HANDLE_VALUE;
}
//------------------------------------------------------------------------
//Create buffer

//DeviceDetail = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA,DevicePath) sizeof(TCHAR) 1; // <-- 網路上有人提供此方法 , 但他不是我要的指標型態(pDevice) , 如何修改此行呢 ???

pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(dwSize); // 我得到是dwSize = 170

int ErrorCode0 = GetLastError(); //錯誤碼 = 122 : 上行執行後 , 顯示傳遞到系統調用的數據區太小
pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); //cbSize得到是6 , 改5也沒用!?

int ErrorCode = GetLastError(); //錯誤碼 = 122 : 也是顯示傳遞到系統調用的數據區太小

Why ?????

[/code]
編輯記錄
HUNK999 重新編輯於 2009-08-03 18:58:28, 註解 無‧
HUNK999
初階會員


發表:9
回覆:35
積分:28
註冊:2009-07-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-08-04 18:07:35 IP:220.130.xxx.xxx 未訂閱

DevicePath 已成功取得!

[code cpp]
HDEVINFO info = SetupDiGetClassDevs(pGuid,NULL,NULL,DIGCF_PRESENT|DIGCF_INTERFACEDEVICE); //再次取得目前HID裝置的資訊
if(info == INVALID_HANDLE_VALUE) //判斷是否資訊取得成功\par {
fprintf(fp1,"No available for this GUID !\n");
return NULL; //如果失敗, Handle = NULL
}

SP_DEVICE_INTERFACE_DATA ifdata; //宣告界面的資料
ifdata.cbSize = sizeof(ifdata); //宣告界面資料的大小, 要設成一個Byte Alignment (正確值為) by C 程式碼產生

int ErrorCode1 = GetLastError(); //檢查介面大小是否為
if(!SetupDiEnumDeviceInterfaces(info, NULL, pGuid, instance, &ifdata)) //列舉裝置
{
fprintf(fp1,"SetupDiEnumDeviceInterfaces Error ! 第%d個instance , 沒找到HID裝置! \n",instance);
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

int ErrorCode2 = GetLastError(); //檢查列舉是否成功

DWORD ReqLen;

SetupDiGetDeviceInterfaceDetail(info, &ifdata, NULL, NULL, &ReqLen, NULL); //第一次調用InterfaceDetail , 得到ReqLen大小, 返回錯誤

DWORD TrueLen = ReqLen; //= 182

PSP_DEVICE_INTERFACE_DETAIL_DATA ifDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(TrueLen);

int ErrorCode3 = GetLastError(); //檢查細節資料是否正確 122代表緩衝區過小

if(ifDetail==NULL)
{
fprintf(fp1,"ifDetail == NULL !\n");
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

ifDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); //6

int ErrorCode4 = GetLastError(); //再檢查細節資料是否正確

if(!SetupDiGetDeviceInterfaceDetail(info, &ifdata, ifDetail, TrueLen, &ReqLen, NULL)) //第二次調用InterfaceDetail
{
fprintf(fp1,"SetupDiGetDeviceInterfaceDetail Error !\n");
delete ifDetail;
SetupDiDestroyDeviceInfoList(info);
return NULL;
}

int ErrorCode5 = GetLastError(); //檢查設定細節資料是否執行正確

HANDLE pDevice = CreateFile(ifDetail->DevicePath,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,//FILE_ATTRIBUTE_NORMAL,
NULL);

int ErrorCode6 = GetLastError(); //開設備是否成功 [/code]

===================引 用 HUNK999 文 章===================
請問如何得到DevicePath ?


[code cpp]
interfaceDev.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA); // cbSize=28 正確!
int ErrorCode00 = GetLastError(); //0 : 顯示沒錯誤

//------------------------------------------------------------------------
//Get interface
if(!SetupDiEnumDeviceInterfaces(hDev, NULL, &guid, dwDevice, &interfaceDev)||
SetupDiGetDeviceInterfaceDetail(hDev, &interfaceDev, NULL, 0, &dwSize, NULL))
{
return INVALID_HANDLE_VALUE;
}
//------------------------------------------------------------------------
//Create buffer

//DeviceDetail = offsetof(SP_DEVICE_INTERFACE_DETAIL_DATA,DevicePath) sizeof(TCHAR) 1; // <-- 網路上有人提供此方法 , 但他不是我要的指標型態(pDevice) , 如何修改此行呢 ???

pDeviceDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*)malloc(dwSize); // 我得到是dwSize = 170

int ErrorCode0 = GetLastError(); //錯誤碼 = 122 : 上行執行後 , 顯示傳遞到系統調用的數據區太小
pDeviceDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA); //cbSize得到是6 , 改5也沒用!?

int ErrorCode = GetLastError(); //錯誤碼 = 122 : 也是顯示傳遞到系統調用的數據區太小

Why ?????

[/code]
系統時間:2017-10-18 11:55:08
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!