根据GUID获得设备路径(转载)

2023-10-28


// 根据GUID获得设备路径

#include <initguid.h>
#include <setupapi.h>

#pragma comment(lib,"setupapi.lib")

// SetupDiGetInterfaceDeviceDetail所需要的输出长度,定义足够大
#define INTERFACE_DETAIL_SIZE 1024


const GUID DiskClassGuid = {0x53f56307L, 0xb6bf, 0x11d0, {0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b}};

// 根据GUID获得设备路径
// lpGuid: GUID指针
// pszDevicePath: 设备路径指针的指针
// 返回: 成功得到的设备路径个数,可能不止1个
int GetDevicePath(LPGUID lpGuid, LPTSTR* pszDevicePath)
{
    HDEVINFO hDevInfoSet;
    SP_DEVICE_INTERFACE_DATA ifdata;
    PSP_DEVICE_INTERFACE_DETAIL_DATA pDetail;
    int nCount;
    BOOL bResult;
 
    // 取得一个该GUID相关的设备信息集句柄
    hDevInfoSet = ::SetupDiGetClassDevs(lpGuid,     // class GUID
        NULL,                    // 无关键字
        NULL,                    // 不指定父窗口句柄
        DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);    // 目前存在的设备
 
    // 失败...
    if (hDevInfoSet == INVALID_HANDLE_VALUE)
    {
        return 0;
    }
 
    // 申请设备接口数据空间
    pDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)::GlobalAlloc(LMEM_ZEROINIT, INTERFACE_DETAIL_SIZE);
 
    pDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
 
    nCount = 0;
    bResult = TRUE;
 
    // 设备序号=0,1,2... 逐一测试设备接口,到失败为止
    while (bResult)
    {
        ifdata.cbSize = sizeof(ifdata);
  
        // 枚举符合该GUID的设备接口
        bResult = ::SetupDiEnumDeviceInterfaces(
            hDevInfoSet,     // 设备信息集句柄
            NULL,            // 不需额外的设备描述
            lpGuid,          // GUID
            (ULONG)nCount,   // 设备信息集里的设备序号
            &ifdata);        // 设备接口信息
  
        if (bResult)
        {
            // 取得该设备接口的细节(设备路径)
            bResult = SetupDiGetInterfaceDeviceDetail(
                hDevInfoSet,    // 设备信息集句柄
                &ifdata,        // 设备接口信息
                pDetail,        // 设备接口细节(设备路径)
                INTERFACE_DETAIL_SIZE,    // 输出缓冲区大小
                NULL,           // 不需计算输出缓冲区大小(直接用设定值)
                NULL);          // 不需额外的设备描述
   
            if (bResult)
            {
                // 复制设备路径到输出缓冲区
                ::strcpy(pszDevicePath[nCount], pDetail->DevicePath);
    
                // 调整计数值
                nCount++;
            }
        }
    }
 
    // 释放设备接口数据空间
    ::GlobalFree(pDetail);
 
    // 关闭设备信息集句柄
    ::SetupDiDestroyDeviceInfoList(hDevInfoSet);
 
    return nCount;
}


/*

//调用GetDevicePath函数时要注意,pszDevicePath是个指向字符串指针的指针,例如可以这样

int i;
    char* szDevicePath[MAX_DEVICE];        // 设备路径
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
    }
 
    // 取设备路径
    nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);
 
    // 逐一获取设备信息
    for (i = 0; i < nDevice; i++)
    {
        // 打开设备
        hDevice = ::OpenDevice(szDevicePath[i]);
 
        if (hDevice != INVALID_HANDLE_VALUE)
        {
            ... ...        // I/O操作
 
            ::CloseHandle(hDevice);
        }
    }
 
    // 释放空间
    for (i = 0; i & lt; MAX_DEVICE; i++)
    {
        delete []szDevicePath[i];
    }
//本例的Project中除了要包含winioctl.h外,还要包含initguid.h,setupapi.h,以及连接setupapi.lib。
//Q 得到设备路径后,就可以到下一步,用CreateFile打开设备,然后用DeviceIoControl

 

 int MAX_DEVICE = 2;
 int i;
    char* szDevicePath[8];        // 设备路径
 
    // 分配需要的空间
    for (i = 0; i < MAX_DEVICE; i++)
    {
        szDevicePath[i] = new char[256];
  ZeroMemory(szDevicePath[i],256);
    }
 
    // 取设备路径
    int nDevice = ::GetDevicePath((LPGUID)&DiskClassGuid, szDevicePath);

 for (i = 0; i < MAX_DEVICE; i++)
    {
        MessageBox(szDevicePath[i]);
    }
 for (i = 0; i < MAX_DEVICE; i++)
    {
        delete []szDevicePath[i];
    }

*/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据GUID获得设备路径(转载) 的相关文章

  • -[MyClassName copyWithZone:] 无法识别的选择器发送到实例

    我的应用程序崩溃了 原因是 MyClassName copyWithZone 无法识别的选择器发送到实例 我有两节课 假设 Class1 和 Class2 Class1 看起来像 Class1 h interface Class1 NSOb
  • 空合并运算符分配给 self

    我目前在 Unity 中设置了两个脚本来处理一些 UI 音频 一个是管理器 另一个是为特定 UI 元素播放声音 我所拥有的简化版本是这样的 public class AudioUIManager MonoBehaviour Only one
  • 强制派生类实现接口

    我今天在这里 就像昨天一样 遇到了另一个奇怪的界面问题 我有一堂课 public class InputDevice
  • 检查 SQL MAX() 函数返回 null

    我的问题是 如果我的表为空或者我使用 max 函数的列没有我指定的值 那么为什么 sqlDataReader hasRows TRUE 它给出了空记录 我该如何解决这个问题 提前致谢 像 MAX 这样的聚合函数将始终为每组返回一行 就您而言
  • 无法使用 Node.JS 将 null 值发送到 MySQL 数据库

    我正在尝试发送null使用 Node JS 到我的 MySQL 数据库 con query INSERT INTO Routes routeTrigger VALUES null title test function err result
  • PHP:数据库连接类构造方法

    我是面向对象编程的新手 最初 我是在类内部和构造函数外部定义变量并为其赋值 但是在今天的 Java OOP 课程之后 我被告知这是不好的风格 应该避免 这是我模拟的原始 PHP 数据库连接类 class DatabaseConnection
  • JavaScript 将 NULL 转换为 0

    我正在使用 jQuery 来获取元素的高度 但如果该元素不存在 以下代码将返回 NULL height menu li active ul height returns integer or null 这是一种跨浏览器安全的方法 可以使用以
  • 在 Groovy 中分配对象属性的简写方法?

    我使用此约定创建 Groovy 对象 Item item1 new Item name foo weight 150 是否有操作属性对象的速记约定 像这样的东西 item1 name hello weight 175 this does n
  • C# 中的 .class(在 Java 中使用)相当于什么

    在爪哇中 TokenStream my stream analyser exclude tokenStream fieldName my reader TermAttribute my token TermAttribute getAttr
  • Java:接口可以包含其中定义的常量变量吗?

    我可以创建吗public static final接口中的变量 我可以保留这些文件中定义的一些常见常量值吗 是的你可以 public interface Constants public static final int ZERO 0 然而
  • 空字符串与NULL

    我有一个表 其中一些行有一些空白cells 我尝试使用 IS NULL 函数选择此类行 但查询选择了 0 行 select from zzz fkp registration female where fname is null 0 row
  • 将文本文件扫描到对象数组中

    我有一个逗号分隔的文本文件 其信 息格式如下 名字 姓氏 餐1 餐2 餐3 餐4 每个新学生都在新的一行 我有以下学生对象 public class Student private String first null private Str
  • 如何在类中使用常量类变量声明常量数组?

    如何在类中使用常量类变量声明常量数组 是否可以 我不想要动态数组 我的意思是这样的 class test const int size int array size public test size 50 int main test t 5
  • 如何在 javascript ES6 类中链接异步方法

    我想链接类中的方法 我对同步方法有问题 但我不知道如何用异步方法做到这一点 例如这个类 class Example constructor this val 0 async setTimeout gt this val 1 return t
  • Python 类中的继承顺序

    我有课ExampleSim它继承自基类Physics class Physics object arg1 arg1 def physics method print physics method class ExampleSim Physi
  • Java 接口中的转换

    有人可以向我解释编译器如何在第一次转换中不抱怨 但在第二次转换中抱怨吗 interface I1 interface I2 class C1 implements I1 class C2 implements I2 public class
  • C# 继承

    假设我有以下代码 interface ISomeInterface void DoSomething void A void B public abstract class ASomeAbstractImpl ISomeInterface
  • C#:为派生类继承单独的静态成员

    我的问题简述 class A Other stuff in my class protected static staticMember class B A Other stuff in my class Will have A stati
  • 触摸屏书写时需要注意什么?

    我正在启动一个新项目 其中涉及为机器开发一个接口 用于测量镜片的楔形和圆度 并将信息存储在数据库中并生成报告 我们很有可能会在这台机器上安装触摸屏 这样它就不需要鼠标或键盘了 我没有任何开发全尺寸触摸屏的经验 所以我正在向你们寻求建议 提示
  • 如何只获取父类对象的属性

    我有两节课 class Parent object def init self id name self id id self name name self parent vars id name make a copy def print

随机推荐

  • 【转载】windows和wls文件互通

    windows和wls文件互通 wsl访问windows文件 https www jianshu com p d332e05adb6f windows访问wsl文件 https blog csdn net Caoyang He articl
  • Android 之 WebView (网页视图)基本用法

    本节引言 本节给大家带来的是Android中的一个用于显示网页的控件 WebView 网页视图 现在Android应用 层开发的方向有两种 客户端开发和HTML5移动端开发 所谓的HTML5端就是 HTML5 CSS JS来构建 一个网页版
  • TCPIP技术实验大作业:基于TCP/IP的程序开发技术综述及应用实践

    一 基于TCP IP的程序开发技术综述 1 1TCP IP协议族简介 TCP IP也被称作传输控制协议 网际协议 作为网络互连的核心协议 受到广泛的应用 该协议类型作为开放性的标准应用在各种计算机中 在一定程度上保证系统间通信的正常运行 在
  • mysql replication环境检查脚本

    author skate time 2013 05 13 mysql replication环境检查脚本 此脚本部署在slave端 可以通过短信或邮件监控slave的mysqld健康 replication环境健康 及复制延迟 脚本 mys
  • monorepo 下的 package tsc 构建

    很多个package都需要构建到每个项目的 lib 下 可以用 vscode 的 tasks json 任务去实现 具体 tasks json 的详情请看官网 https code visualstudio com docs editor
  • JavaScript中字符串的大小写转换(轮子,直接cv即可)

    此文件为js文件 封装模块按需导出即可 str 需要首字母转换的字符串 全部大写 export const all2Large str gt const arr str split let newStr 通过数组的forEach方法来遍历数
  • 解决Ubuntu下 anaconda 与ros opencv冲突的问题

    解决Ubuntu下 anaconda 与ros opencv冲突的问题 问题描述 解决办法之一 问题描述 在Ubuntu16 04上先后安装了Anaconda和ROS 然后在anaconda配置的pytorch环境中运行python代码 在
  • 【毕设】基于CycleGAN的风格迁移【一】环境搭建及运行代码

    源代码地址 CycleGAN源码 因为该篇内容包含Anaconda的环境管理及包的管理 可以选择参考 Anaconda安装 环境管理 包管理 实际演练例子 全网最详细 MrRoose1的博客 CSDN博客 一 搭配环境 1 首先把代码包下载
  • 递归、回溯-图的m着色问题

    1 问题描述 给定无向连通图G V E 和m种不同的颜色 用这些颜色为图G的各顶点着色 每个顶点着一种颜色 是否有一种着色法使G中每条边的2个顶点着不同颜色 这个问题是图的m可着色判定问题 输入 图的顶点的个数 颜色种类树m 输出顶点a与顶
  • C

    我们想定义一个全局变量 能够在多个文件中使用 举例说明比如说三个文件main c hello c hello h 想在main c和hello c中使用一个名字为a的变量 可能大家会简单地想直接在hello h里面定义一个变量unsigne
  • 网站渗透测试 越来越难渗透

    福利 网络安全重磅福利 入门 进阶全套282G学习资源包免费分享 最先 对于大家提出的难题 网站愈来愈难渗透 表明如今的安全防护技术性及其网站结构技术性的成熟情况是越来越健全了 次之 某一实际技术性方面的安全要求减少了 不可以整体表明渗透测
  • 分页组件的使用-jqPaginator

    工作中用到了分页 在github上面用到了一款分页组件 是叫jqPaginator 参考网站是 http jqpaginator keenwon com a3 上面可以下载 以及介绍怎么使用 贴出我使用的例子的代码 html div cla
  • 2020最新大厂高频微服务面试总结:Spring-Cloud+Spring-Boot+Dubbo(面试题+笔记+项目实战)

    话不多说 直接上题 SpringCloud面试题 什么是 Spring Cloud 使用 Spring Cloud 有什么优势 服务注册和发现是什么意思 Spring Cloud 如何实现 Spring Cloud 和dubbo区别 Spr
  • Linux MySQL 常见无法启动或启动异常的解决方案

    Linux MySQL 常见无法启动或启动异常的解决方案 在 Linux 上自建 MySQL 服务器 经常遇到各种无法启动或启动后异常的问题 本文列举一些常见问题的解决办法 注意 以下错误日志提示 都是查看 MySQL 错误日志得到 查看方
  • 深度理解volatile关键字

    Volatile java中可以把字段声明为volatile的 比如 public class AtomicInteger extends Number implements java io Serializable volatile变量
  • 华为OD机试 Python 【整数数组中同时出现的整数】

    描述 你有两组整数 你的任务是找出哪些整数在这两组中都出现了 如果找到了这样的整数 还需要注意它们分别在两组里出现了几次 取其中较小的那个次数为其 共同出现次数 要求如下 先按 共同出现次数 分类整数 再按这个次数从小到大输出 如果某个 共
  • 国产开源中文大语言模型再添重磅玩家:清华大学NLP实验室发布100亿参数规模的开源可商用大语言模型CPM-Bee

    5月27日 OpenBMB发布了一个最高有100亿参数规模的开源大语言模型CPM BEE OpenBMB是清华大学NLP实验室联合智源研究院成立的一个开源组织 该模型针对高质量中文数据集做了训练优化 支持中英文 根据官方的测试结果 其英文测
  • C++:计算Fibonacci数列的前30项并动态分配、用指针实现两数交换、买鸡问题、求圆的方法。

    任务一 编写一个C 风格的程序 用动态分配空间的方法计算Fibonacci数列的前30项 并将结果存储到动态分配的空间中 任务二 编写一个C 风格的程序 自定义一个函数 要求实现输入两个整数 让他们交换两个数的位置后输出 要求写一个自定义函
  • 关于Apple支付productID类型验证分析

    Apple中的productID类型包括 消耗型项目 非消耗型项目 自动续期订阅 非自动续期订阅项目 消耗型项目的验证 1 客户端发起Apple支付玩家完成付款 2 客户端收到Apple返回的票据信息 并对票据信息进行遍历发送到服务端做验证
  • 根据GUID获得设备路径(转载)

    根据GUID获得设备路径 include