|
shu さん、ご返信ありがとうございます。
ご提示いただいたサイトは既に拝見しておりました。
「STEP5: お目当てのデバイスを探せ」にあるCreateFileで
失敗する状態です。
以下、ソースですが、DuplicateHandleを試す前のものです。
HIDはマウス、キーボード、バーコードリーダーと3つが
PCとつながっており、3つとも2度目の
SetupDiGetDeviceInterfaceDetailまでは成功しますが
CreateFileでFALSEになります。
何か情報がありましたら、宜しくお願いします。
------------------------------------------------------------------
DllExport BOOL WINAPI ExportHIDList(char *file_path)
{
GUID hidGuid;
HDEVINFO devInfo;
SP_DEVICE_INTERFACE_DATA spid;
PSP_DEVICE_INTERFACE_DETAIL_DATA pdidd = NULL;
HANDLE hDevHandle;
HIDD_ATTRIBUTES Attributes;
char msg[512];
char devname[512];
//GUIDの取得
HidD_GetHidGuid(&hidGuid);
//HIDクラスのデバイスリストへのハンドルを取得
devInfo = SetupDiGetClassDevs(&hidGuid, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (devInfo == NULL) return FALSE;
//HIDクラスのデバイスの列挙
DWORD dwIndex = 0;
while (TRUE)
{
memset(&spid, 0, sizeof(spid));
spid.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
if (SetupDiEnumDeviceInterfaces(devInfo, NULL, &hidGuid, dwIndex, &spid) == TRUE)
{
//デバイス詳細用の長さを取得
DWORD dwRequiredLength = 0;
SetupDiGetDeviceInterfaceDetail(devInfo, &spid, NULL, 0, &dwRequiredLength, NULL);
//デバイス詳細用メモリ確保
pdidd = (PSP_DEVICE_INTERFACE_DETAIL_DATA)malloc(dwRequiredLength);
pdidd->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
//デバイスの詳細を取得
if (SetupDiGetDeviceInterfaceDetail(devInfo,
&spid,
pdidd,
dwRequiredLength,
&dwRequiredLength,
NULL) == TRUE)
{
//ロケール指定
setlocale(LC_ALL, "japanese");
//変換
size_t wLen = 0;
errno_t err = wcstombs_s(&wLen, devname, 512, pdidd->DevicePath, _TRUNCATE);
//HIDにアクセスするためファイルを作成しハンドルを取得
hDevHandle = CreateFile(pdidd->DevicePath,
GENERIC_READ,
0, //FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if (hDevHandle == INVALID_HANDLE_VALUE)
{
sprintf_s(msg, 512, "列挙 %d INVALID HANDLE!\n[%s]\n",
dwIndex+1,
devname);
ExportToFile(file_path, msg);
}
else
{
//デバイスのアトリビュートからベンダーID、プロダクトID、バージョンNoを取得
Attributes.Size = sizeof(Attributes);
if (HidD_GetAttributes(hDevHandle, &Attributes))
{
sprintf_s(msg, 512, "列挙 %d\nVID = %d\nPID = %d\nVsn = %d\n",
dwIndex+1,
Attributes.VendorID,
Attributes.ProductID,
Attributes.VersionNumber );
ExportToFile(file_path, msg);
}
CloseHandle(hDevHandle);
}
}
free(pdidd);
dwIndex++;
}
else
{
if( GetLastError() == ERROR_NO_MORE_ITEMS )
{
ExportToFile(file_path, "------------ END -----------\n");
break;
}
}
}
return TRUE;
}
|