• 根据GUID获取设备信息


    #include <windows.h>  
    #include <setupapi.h>  
    #include <objbase.h>  
    #include <initguid.h>  
    #include <stdio.h>
     
    DEFINE_GUID(GUID_DEVINTERFACE_CDROM, 0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);
    #define CdRomClassGuid GUID_DEVINTERFACE_CDROM
    
    //DEFINE_GUID(DiskClassGuid,               0x53f56307L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(CdRomClassGuid,              0x53f56308L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(PartitionClassGuid,          0x53f5630aL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(TapeClassGuid,               0x53f5630bL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(WriteOnceDiskClassGuid,      0x53f5630cL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(VolumeClassGuid,             0x53f5630dL, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(MediumChangerClassGuid,      0x53f56310L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(FloppyClassGuid,             0x53f56311L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(CdChangerClassGuid,          0x53f56312L, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
    //DEFINE_GUID(StoragePortClassGuid,        0x2accfe60L, 0xc130, 0x11d2, 0xb0, 0x82, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b);     
         
    #define INTERFACE_DETAIL_SIZE   (1024)  
    #define MAX_DEVICE      (16)     
    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;     
    }  
          
    int main(int argc, char **argv)  
    {  
        char *path[10] = {NULL};  
        int i, count;
        GUID cdrom = CdRomClassGuid;
    
        for (i=0; i<10; i++)  
        {  
            path[i] = (char*)malloc(256);  
        }  
        count = GetDevicePath(&cdrom, path);  
        for (i=0; i<count; i++)  
        {  
            printf("%s/n", path[i]);  
        }  
        printf("HDD Count: %d/n", count);  
        return TRUE;  
    }  
  • 相关阅读:
    搭建SpringCloud之注册中心Eureka
    学习角色管理模块错误总结---基于SpringMVC框架
    【转】Eclipse 单步调试
    [转]MyBatis的foreach语句详解
    解决pom.xml文件 ---- web.xml is missing and <failOnMissingWebXml> is set to true
    解决Dynamic Web Module 3.0 Requires Java 1.6 or newer
    用maven在eclipse用spring建javaweb工程(一)
    【转载】Eclipse 断点调试
    学习大神笔记之“MyBatis学习总结(三)”
    学习大神笔记之“MyBatis学习总结(二)”
  • 原文地址:https://www.cnblogs.com/liubaocheng999/p/3573764.html
Copyright © 2020-2023  润新知