一个小白问题,如何获得USB设备名?

fengyufei 2010-08-03 04:35:18
我想让PC机和一个USB接口的智能卡Reader进行通讯,使用CreatFile打开设备:

Handle hCom = CreatFile(
m_strPath, //指定打开设备名
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL );

可是不知道要怎样才能获取智能卡Reader的设备名,故来求问各位大虾! 谢谢!
...全文
806 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fengyufei 2010-08-04
  • 打赏
  • 举报
回复
非常感谢你:)
浅蓝马 2010-08-03
  • 打赏
  • 举报
回复
上面的函数使用的是setupapi,记得要包含相应的头文件和库文件。

还有,
SetupDiGetDeviceRegistryProperty 可以取得设备相关属性,例如设备名

可以参考以下一个例子,需要改动一些地方。




#include <setupapi.h>
#pragma comment(lib, "setupapi.lib")

const GUID GUID_DEVINTERFACE_DISPLAY_ADAPTER = { 0x5b45201d, 0xf2f2, 0x4f3b, { 0x85, 0xbb, 0x30, 0xff, 0x1f, 0x95, 0x35, 0x99 } };



long GetDisplayDeviceInfo(unsigned long nAdapterIndex, tagI2CDeviceStruct* pobjI2CDevice)
{
pobjI2CDevice->nDisplayDeviceLength = 0;

HDEVINFO hDevInfoX = SetupDiGetClassDevs(&GUID_DEVINTERFACE_DISPLAY_ADAPTER, NULL, 0, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfoX == INVALID_HANDLE_VALUE)
{
//printf("Failed to get device handle. Error[%d]", GetLastError());
return DVDC_ERR_GET_CLASS_DEV;
}


SP_DEVINFO_DATA DeviceInfoData;
//DWORD dwDeviceIndex;

// Enumerate through all devices in Set.
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiEnumDeviceInfo(hDevInfoX, nAdapterIndex, &DeviceInfoData))
{
SetupDiDestroyDeviceInfoList(hDevInfoX);
if (GetLastError() == ERROR_NO_MORE_ITEMS)
return DVDC_ERR_NOT_FOUND_DISPLAY_ADAPTER;
else
return DVDC_ERR_FIND_DISPLAY_ADAPTER;
}

DWORD DataT = 0;
DWORD buffersize = 0;
LPTSTR buffer = NULL;

while(!SetupDiGetDeviceRegistryProperty(
hDevInfoX,
&DeviceInfoData,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME,
&DataT,
(PBYTE)buffer,
buffersize,
&buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
// Change the buffer size.
if (buffer)
LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR,buffersize);
}
else
{
printf("Failed to get device guid. Error[%d] \n", GetLastError());
break;
}
}

if (buffer)
{
#ifdef _UNICODE
int iMultiBytesLength = WideCharToMultiByte (
CP_ACP, // ANSI 代码页
WC_COMPOSITECHECK, // 检查重音字符
buffer, // 原Unicode 串
-1, // -1 意思是串以0x00结尾
NULL, // 目的char字符串
0, // 缓冲大小
NULL, // 肥缺省字符串
NULL); // 忽略这个参数

if (iMultiBytesLength <= 0)
{
SetupDiDestroyDeviceInfoList(hDevInfoX);
return DVDC_ERR_GET_DEVICE_PATH_LENGTH;
}

if (iMultiBytesLength > sizeof(pobjI2CDevice->pcDisplayDevicePath))
{
SetupDiDestroyDeviceInfoList(hDevInfoX);
return DVDC_ERR_DEVICE_PATH_LENGTH_SMALL;
}

WideCharToMultiByte (
CP_ACP, // ANSI 代码页
WC_COMPOSITECHECK, // 检查重音字符
buffer, // 原Unicode 串
-1, // -1 意思是串以0x00结尾
pobjI2CDevice->pcDisplayDevicePath, // 目的char字符串
iMultiBytesLength, // 缓冲大小
NULL, // 肥缺省字符串
NULL); // 忽略这个参数

//printf(" path:[%s]\n", pcResult);
pobjI2CDevice->nDisplayDeviceLength = iMultiBytesLength;
#else
//MessageBox(NULL, "not unicode", "xxxx", MB_OK);
if ((strlen(buffer) + 1) > sizeof(pobjI2CDevice->pcDisplayDevicePath))
{
SetupDiDestroyDeviceInfoList(hDevInfoX);
return DVDC_ERR_DEVICE_PATH_LENGTH_SMALL;
}

pobjI2CDevice->nDisplayDeviceLength = strlen(buffer) + 1;
strcpy_s(pobjI2CDevice->pcDisplayDevicePath, sizeof(pobjI2CDevice->pcDisplayDevicePath), buffer);
pobjI2CDevice->pcDisplayDevicePath[pobjI2CDevice->nDisplayDeviceLength] = 0;
#endif
}

// Cleanup
SetupDiDestroyDeviceInfoList(hDevInfoX);


return DVDC_ERR_SUCCESS;
}

IT_Young 2010-08-03
  • 打赏
  • 举报
回复
SetupDiGetClassDevs 获取类设备句柄,例如USB类
SetupDiEnumDeviceInterfaces 枚举该类所有设备
SetupDiGetDeviceInterfaceDetail 取得某设备详细信息,可以用来确定是你想要的设备,也可以取得设备路径
浅蓝马 2010-08-03
  • 打赏
  • 举报
回复
某个设备的路径一般来说应该是固定的,
如果不知道的话,可以尝试以下函数取得。

SetupDiGetClassDevs 获取类设备句柄,例如USB类
SetupDiEnumDeviceInterfaces 枚举该类所有设备
SetupDiGetDeviceInterfaceDetail 取得某设备详细信息,可以用来确定是你想要的设备,也可以取得设备路径
有没有想过,像使用U盘一样升级STM32固件,非常简单,非常方便 1: 插入电脑USB接口 2: 把升级固件拖到设备盘符 3: 升级完成 抛弃繁琐的USB DFU,抛弃落后的串口升级,让我们来谈谈U盘升级STM32 1. 为什么设计这个BOOT LOADER 在电子产品开发过程中,为了满足市场需要,经常是先开发出一个简单可用的版本,然后逐步迭代升级,修复bug,并增强系统功能 一个稳定,简单,安全的升级方式,就变得非常重要 对于嵌入式系统来说,常见的升级方式为 串口升级(私有协议或者X-Modem) USB升级(DFU) U盘升级(OTG) 网络升级 无线升级(OTA) 从技术来说,这几种升级方式大同小异,原理类似:都是一个Loader代理接收数据通道的数据,然后解密,烧录到FLASH中;但用户体验完全不同,拿串口升级来说,首先用户需要一个串口软件,然后对于没有硬件串口的PC来说,就需要一个USB转串口设备,对于不同PC平台,串口软件就不一样,这需要学习成本,过程繁琐;所以在一些需要用户自行升级远程设备的情况下,即便是通过电话指导,80%的用户仍然不知道怎么升级,导致失败 USB的DFU升级,也是类似的问题,它设计的初衷就是面向专业用户的,而不是小白!所以需要安装DFU软件,按照手册来一步步升级 OTA升级和网络升级,体验好些,可用做到无感升级,但不适合所有场景 而U盘升级,用户学习成本最低,U盘大家都知道,然后拷贝一个Bin文件进去,插入设备,重启设备,就完成升级了,非常简单。类似的变种,比如手机升级,是最先进的,直接将手机模拟成U盘,然后用户拷贝数据到手机,重启就好了,非常简单 在嵌入式系统中,还没这么方便的升级手段,虽然ARM的Mbed有一种类似的固件更新功能,但它是专门为调试器设计的,不能内嵌到用户MCU中 所以,我将手机升级的方案引入到嵌入式系统中,从而为大家提供一个实现稳定,安全,零学习成本的升级方案 经过一段时间的学习研究,有了这个USB MSD Bootloader 2. 功能特点 只占用15K FLASH空间 简单易用,直接拖拽文件进行固件升级,无需任何专业知识 采用USB大容量设备类,不用安装任何驱动 支持各种系统(Windows/Linux/Mac/Android) 不用开发任何上位机,提高产品效率 支持各种加密算法(AES256等),轻松安全升级 自动识别Bin,Hex,自定义加密固件(后缀为sec)文件 支持MD5文件校验机制,保证固件升级的完整性 显示设备升级状态信息 支持长文件升级 多种措施保证系统健壮性,保证Bootloader不会被误擦除,保证APP合法性 支持用户自定义加密算法和完整校验算法,极致安全 3. 系统原理 系统开机上电后,Bootloader接管系统,初始化USB硬件,等待USB连接 Bootloader在启动后1秒内,检测USB是否连接PC:如果连接PC,则进入固件升级模式,执行第3步;超时则跳转第8步,尝试执行用户APP Bootloader模拟成MSD设备,构建FAT16虚拟文件系统,U盘为”Bootloader”,容量为100M,但具体实际可用空间,根据用户MCU来确定,建议不要复制除APP之外的无关文件 当用户复制文件到U盘时,Bootloader会判断文件后缀和判断文件size,如果size大于实际的MCU可用FLASH或者文件后缀不合法,则进入错误状态,更新状态文件,重新枚举USB 文件后缀和size通过检测后,Bootloader会截获PC发送文件数据流,并写入MCU 对应的Flash中 如果写入过程中出错,则终止操作,擦除APP内容,进入错误状态,更新状态文件,重新枚举USB 成功写入后,Bootloader更新状态文件,重新枚举USB,显示升级完成;但不会运行APP,只有拔掉USB后,再次重启,才会进入第8步,尝试运行APP Bootloader检查APP固件的栈和入口函数合法性,只有通过检测后,才开始执行APP。检测判断条件是栈指针必须在RAM地址空间内,入口函数地址必须处于THUMB模式,并LSB为1 停止USB设备,关掉所有的中断,执行APP,APP开始接管系统 4. 支持芯片 STM32F101/3/5/7 重点来了,点击下面链接,下载固件
[教程] 充分发挥手机500W像素优势发个真正可以实现安卓做PC摄像头的教材 软件 不喜勿喷 好长时间没来了 今天显得难受 从网上 偶尔发现一个 可以把安卓手机作为PC 摄像头的 软件 亲测可用哦 还不错 就推荐给大家 或许人多人 在网上看多过 本帖旨在 整理下 网络资源 给小白们服务 大神绕过 谢谢 下面 上教程(备注 本帖转自网络 经本人整理修改 感谢原作) 利用DroidCamX将手机摄像头打造成电脑高清摄像头 此软件 一共有三种连接方式 WIFI USB 跟蓝牙 经过本人亲测体验 只推荐给大家 前两个方式 因为蓝牙实在是太卡 根本不流畅 再次就不 给机油没介绍这个 很蛋疼的 连接方式了 一、软件安装 此软件 分为 手机端 跟PC 端 需要用到的文件已经全部整理好,所以下载回来是一个压缩包,共包含如下三个文件: 首先安装手机端——HA-20110427-DroidCamX.Wireless.Webcam.Pro.1.4.2._GCA.apk 安装到手机上 再安装PC端,打开DroidCamX1.4.2.rar,直接运行Droid Cam-3.2.exe 一路点击下一步,即可安装完成。默认安装目录为C:Program Files DroidCam(32位系统)或C:Program Files (x86)DroidCam(64位系统),为了使用更方便,将“电脑端DroidCamApp.exe汉化覆盖.zip”中的DroidCamApp.exe覆盖掉安装目录下的同文件,软件界面即变成中文。 到此为止,所有安装工作已经做完了。可以为DroidCamApp.exe建立一个桌面快捷方式,因为它是DroidCam客户端的主程序。 二、WiFi无线摄像头 当无线摄像头来使用是最简单的,先打开手机WiFi并连接上无线路由,然后在手机上启动DroidCamX,看到如下画面。显示IP:192.168.1.102 端口:4747。 再启动PC端,连接方式选择WiFi/LAN,再将手机IP和DroidCam端口填上在手机端界面看到的即可。 点击Connect,手机现在的画面已经变成摄像头显示画面了。手机端的画面可能是左右相反的,没关系,先不用理会。这个界面有三个按钮,右上方是自动对焦,中间是亮度节能开关,下方是退出。 虽然手机界面上显示是左右反的,但在电脑上显示出来其实是正常的,如果部分用户仍然不正常可以勾选pc端的“镜像网络视频”。要使用该摄像头,在视频设备里选择DroidCam就可以了,QQ、Skype等各种需要使用摄像头的软件都完美兼容。 强烈推荐方式!!! 三、USB摄像头(个人也比较终于USB 连接 所以 强烈推荐用USB 方式连接 好处是速度 稳定 省电) 这是笔者比较推荐的方式,速度快,而且一边使用一边充电,不用担心手机电量被短时间用完。使用USB连接要稍微麻烦一点,先做一点准备工作:下载adb客户端及驱动,解压缩后,把里面 adb.exe 和 AdbWinApi.dll 两个文件(搜索一下你的电脑,一般用安卓手机的电脑里都有这东西)放到系统盘的 windows/system32 文件夹里就可以了。 为了方便以后使用,建立一个bat文件,内容为adb forward tcp:4747 tcp:4747。 其实很多 小白 不懂如何创建BAT 文件 其实很简单 在桌面右击新建一个文本 把adb forward tcp:4747 tcp:4747 粘贴到文本里 保存 把文本的 格式改为.bat 即可(文本字可以忽视) 先运行手机端。然后在PC上运行这个bat文件一次,再运行DroidCam客户端,选择连接方式为“ADB(由USB)”,点击Conect。如果不运行bat或者设置的端口与bat内的不一致,会有错误提示。 连接成功后界面与WiFi连接时是一样的,就不再多做介绍了。 软件设置 因为此软件是一直使用摄像头的,所以设置里提供了一些基本的节能设置,如自动变暗、黑色背景。另外保持手机唤醒这样可以避免部分手机在休眠时wifi自动断开而使软件无法继续使用。 前后摄像头是可以切换使用的,连接端口也可以修改成其他的。友情提醒,如果修改了端口号,PC的客户端也要做对应的修改,使用usb连接里的bat里命令包含的端口号同样要修改。 除了以上外,视频格式也提供了三种风格供选择,视频分辨率也可调节。 视频分辨率比较丰富,最高720x480到最低240x160,分辨率越高效果自然越好。 还要一提的是除了支持当摄像头外,它也能同时当麦克风,在PC上的客户端上勾选上启用音频即可。 手机当电脑摄像头这个功能,其实在S60和WM时代就已经有相应的软件来实现了,但以前的效果都比不上传统摄像头。DroidCamX给我们带来了希望,支持高分辨率,支持多种方式,在使用wifi与USB连接时传输图像都很流畅,实用性毋庸置疑。 安装调试 成功了 你可以充分 发挥 你手机的高像素 实现高清视频功能了 哈哈 500W 像素 可以秒杀了 普通本本的 130W 像素摄像头 不喜勿喷 感觉好 就评个分把 谢谢(评个分又不会怀孕 ) 下面 上传 本软件工具 DroidCamX手机摄像头.part1.rar (3.18 MB, 下载次数: 728) DroidCamX手机摄像头.part2.rar (2.97 MB, 下载次数: 683) 注意 有机油 说不能使用高分辨率这个情况 这个可能与 相机本身 或者是手机本身的分辨率有关 小蜜已经给同学 本人只在戴妃上测试了 一切正常 如果有机油发现问题 或者是 找出解决的 办法 欢迎跟帖 谢谢
Kindle 修砖教程汇总 (内有多篇教程) http://bbs.duokan.com/forum/thread-64038-1-1.html 深入了解之: 《修砖的原理》 Kindle是一个Linux设备, 支持网络连接。原理上和一台linux电脑一样。 Kindle的MMC Flash有4个分区: main, diags, var, usb。 在图形界面上,用usb导出u盘,只能见到第4个分区。 机器变砖,一般是main或者var文件错误,可以刷镜像恢复。 我们采用fastboot模式修砖。原理是,让Kindle进入刷机模式, 这时候kindle屏幕上是不变化的,也不导出USB磁盘。 kindle这时候是一个fastboot设备,我们在PC上用fastboot.exe给kindle刷机。 Kindle有三种启动模式: fastboot 刷机模式(屏幕无反应); diags 诊断模式(屏幕文字菜单); main 正常模式(图形界面,可看书)。 以KT为例: 刷机的全过程,就是一个状态变化的过程: magic key (按住kindle操作) ->HID-Compliant(PC下 mfgTool 操作) -> fastboot (PC下命令行操作) -> diags (文字菜单) -> main (Kindle图形界面) 修砖就是刷镜像。 版本刷匹配了就OK。 下面总结了一些命令行。刷 main kernel的命令行见 第(3)。 具体步骤见 修砖教程汇总里的 KT小白修砖贴。 fastboot.exe的命令格式为: fastboot.exe flash [目标分区] [镜像文件] 意思就是把 文件 刷入到 目标分区, flash即是刷入。 目标分区有 diags(调试分区), diags_kernel (调试分区kernel), kernel (主分区kernel)等。 在fastboot模式下刷机 (1)刷 diags分区 镜像: fastboot.exe flash diags mmcblk0p2_ssh-kt500.img (2)刷 diags分区 kernel, 也就是 diags_kernel : fastboot.exe flash diags_kernel kt_5.0.0_diags_kernel.img (3) 刷主分区 main_kernel, 也就是kernel: fastboot.exe flash kernel kernel_5.0.0.img (4) 设置启动模式为diags fastboot.exe setvar bootmode diags (5)重启Kindle fastboot.exe reboot 重启进入diags模式,然后用dd命令行,恢复主分区 在诊断模式,文字菜单, 依次选择N)、U)、Z)、X), 打开USB NetWork, 开启SSH。这时候,Kindle和PC之间的连接,模拟为RNDIS网卡,可以从网络登录Kindle,从而用dd命令行,恢复主分区。 (第一次运行需要在Windows下安装RNDIS网卡驱动, Win7/Win7 x64微软自带驱动) (6)在SSH下(用putty登录), 刷主分区镜像 dd if=/mnt/us/mmcblk0p1.img of=/dev/mmcblk0p1 这里的if 是input file, of是outputfile。 of是固定的分区,/dev/mmcblk0p1是主分区。 (7)在SSH下(用putty登录), 清空第三个分区 umount /dev/mmcblk0p3 dd if=/dev/zero of=/dev/mmcblk0p3 (8)重启到正常模式 idme -d --bootmode main reboot -f

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧