您的位置:首页 > Web前端

获取连到电脑上的打印机的相关信息

2010-10-27 16:39 706 查看
         一.   打印机型号获取
当打印机连接到电脑上的时候,会发送消息给系统。系统会读取打印机的型号,接口等一系列的消息,并把这些消息写到注册表里面。在程序当中我们并没有直接读取注册表的信息,而是间接的通过SETUP API的函数间接地读取到了相关的信息。主要相关的函数如下:
1. 首先枚举现在连接电脑的所有硬件。函数是
HDEVINFO  SetupDiGetClassDevs(const GUID*ClassGuid,

PCTSTREnumerator, HWNDhwndParent, DWORDFlags

 
    此函数的返回值使我们所需要的,指向了符合条件的一个硬件信息表,这个表中包含我们所需要的信息。此函数的第一个参数,是设备的一个标识,分为两种一种是interface标识,另一种是setup 标识,interface 标识是微软自己定义的,是已定的,setup 标识是驱动安装的时候设定的,是不定的。
2. 取得所有硬件的的句柄之后,需要的是枚举每一个硬件设备。
BOOL SetupDiEnumDeviceInfo(HDEVINFO DeviceInfoSet,DWORD MemberIndex,PSP_DEVINFO_DATA DeviceInfoData)
  此函数第一个参数是SetupDiGetClassDevs返回的值作为输入。第二个参数硬件信息表的索引,第三个参数是输出一个指向SP_DEVINFO_DATA结构的指针。这个结构中包括该设备的interface guid以及设备实例的句柄。
3.
BOOL SetupDiGetDeviceRegistryProperty( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData, DWORD Property,PDWORD PropertyRegDataType,PBYTE PropertyBuffer,DWORD PropertyBufferSize,  PDWORD RequiredSize);

这个函数是获取特定设备信息的函数。第二个参数是SetupDiEnumDeviceInfo的输出值。
第三个参数有很多此时应赋值为SPDRP_HARDWAREID. PropertyBuffer是返回的数据。
4.
BOOL SetupDiGetDeviceInstanceId( HDEVINFO DeviceInfoSet, PSP_DEVINFO_DATA DeviceInfoData,PTSTR DeviceInstanceId,DWORD DeviceInstanceIdSize,PDWORD RequiredSize);

这个函数是获取设备的具体信息,包括设备是存储设备的具体类型,以及设备的名称和设备的usb端口。此函数与3的函数同时使用,才能的到相应的数据。可以根据此字符串判断打印机以及打印机的型号以及端口号。更进一步可以在此函数后便再次调用3,把第三个参数设置成不同的值来获取更加具体的结果。不过有些数据是取不到的,应该调用CM_XXX系列的函数来获取。
 附上具体代码一则:需要一些库以及头文件请自己添加:
  HDEVINFO hdevinfo=NULL;
  SP_DEVINFO_DATA  device_data;
  DWORD dwIdx = 0;
  SP_DEVINFO_DATA  sDevInfo;
  sDevInfo.cbSize=sizeof(SP_DEVINFO_DATA);
DWORD   dwRegType;
DWORD DataT;
LPTSTR buffer = (LPTSTR)LocalAlloc(LPTR,10000);
LPTSTR buffer1 = (LPTSTR)LocalAlloc(LPTR,1000);
DWORD buffersize = 0;
BOOL c;
HANDLE hand;
SP_DEVICE_INTERFACE_DATA  spdid;
spdid.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);
SP_DEVICE_INTERFACE_DETAIL_DATA sdidd;
sdidd.cbSize=sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SP_DEVINFO_DATA  sDevInfo1;
sDevInfo1.cbSize=sizeof(SP_DEVINFO_DATA);
vector<CString> vector1;
vector<CString> vector2;
  hdevinfo= SetupDiGetClassDevs(NULL,0,0,DIGCF_ALLCLASSES |DIGCF_PRESENT);
  DWORD a= GetLastError();
  while(SetupDiEnumDeviceInfo(hdevinfo, dwIdx++, &sDevInfo))
  {
      if(dwIdx==139)
      {
      dwIdx=139;
      }
    c= SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_HARDWAREID ,&DataT,(PBYTE)buffer,buffersize,&buffersize);
    c=SetupDiGetDeviceInstanceId(hdevinfo,&sDevInfo,buffer1,buffersize,&buffersize);
    vector1.push_back((CString)buffer);
    vector2.push_back((CString)buffer1);
   
    if(c)
    {
        CString a(buffer1);
        a=a.Left(a.Find(L"//"));
        if(L"USBPRINT"==a)
          { ZeroMemory(buffer,10000);
       c=  SetupDiGetDeviceRegistryProperty(hdevinfo,&sDevInfo,SPDRP_DEVICEDESC,&DataT,(PBYTE)buffer,1000,&buffersize);
   
buffersize=GetLastError();
          }
    }
   
 
   
      
  }
  LocalFree(buffer);
LocalFree(buffer1);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息