upstar
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2005-02-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1585回复:5

我用GUID找设备没找到,请指教。给分!

楼主#
更多 发布于:2004-05-27 12:14
在VC的应用程序里我用SetupDiGetClassDevs通过GUID可以获得设备信息句柄,但是接下来用SetupDiEnumDeviceInterfaces获取设备接口的时候就失败了。为什么会这样呢?下面是代码
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);        // 设备接口信息
        //就这里,bResult总是false,得不到设备接口
        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
        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;
}

最新喜欢:

zxwitsmezxwits...
sunwq
驱动牛犊
驱动牛犊
  • 注册日期2003-11-29
  • 最后登录2004-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-05-31 10:13
我的理解:
你这么做是不完全的,你定义在INF文件中的是设备类GUID,比如USB类,串行口类。你还应该在你的驱动程序中定义一个你自己产生的guid,他是专门对应你的具体设备的,比如你做USB设备,那么这两个设备的guid都不一样,可他们的GUID都是一样的。你在应用程序中应该对guid操作就可以了。
供参考,如果同意我的说法,加分为证。 :D

GUID还需要分设备类吗?我用软件产生一个GUID它根本没有让我选择设备类型,这个GUID好像是根据时间和CPU时钟产生的。
仅仅在inf中加GUID是没有用的,需要在驱动程序源码中进行符号连接
arthurcao
驱动小牛
驱动小牛
  • 注册日期2003-10-12
  • 最后登录2012-07-08
  • 粉丝0
  • 关注0
  • 积分92分
  • 威望20点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-05-27 17:17
我的理解:
你这么做是不完全的,你定义在INF文件中的是设备类GUID,比如USB类,串行口类。你还应该在你的驱动程序中定义一个你自己产生的guid,他是专门对应你的具体设备的,比如你做USB设备,那么这两个设备的guid都不一样,可他们的GUID都是一样的。你在应用程序中应该对guid操作就可以了。
供参考,如果同意我的说法,加分为证。 :D
arthurcao喜欢开源。
upstar
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2005-02-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-05-27 16:09
我用的68013自带的驱动。开发包也带有应用程序,但是它用CreateFile的时候用的devicepath是\"\\\\\\\\.\\\\EZUSB-0\",我想改用GUID来获取devicepath,所以就在原来的*.inf文件里加了一行ClassGUID={36fc9e60-c465-11cf-8056-444553540000},然后更新驱动,用我自己的程序来访问设备,结果就不行。是不是*.inf文件不能这样改?还是改得不够?我就是想用GUID来获取设备。
cqs103
驱动牛犊
驱动牛犊
  • 注册日期2004-04-08
  • 最后登录2004-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-05-27 16:02
你的设备驱动可能有问题
upstar
驱动牛犊
驱动牛犊
  • 注册日期2004-04-20
  • 最后登录2005-02-02
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-05-27 15:21
假如我的设备的GUID是{36FC9E60-C465-11CF-8056-444553540000},
那么利用GUID获得设备信息的时候定义的GUID结构变量为:
const GUID DiskClassGuid = {0x36FC9E60, 0xC465, 0x11CF, {0x80, 0x56, 0x44, 0x45, 0x53, 0x54, 0x00, 0x00}};
这样写对不对?好像有问题,找不到设备。请高手指点。
游客

返回顶部