2015-05-23 77 views
1

VC++中使用Windows Management Instrumentation(WMI),我们可以找到SystemInfo,如系统名称和其他属性。根据其状态获取打印机详细信息

GetComputerName例子:

BOOL WINAPI GetComputerName(
    _Out_ LPTSTR lpBuffer, 
    _Inout_ LPDWORD lpnSize 
); 

有附着在我的系统1台的热和2共享打印机3台打印机,

我如何获得有关打印机是脱机的信息?
如何基于状态分类/列出打印机?

感谢

回答

1

参见EnumPrinters

DWORD flags = PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS; 
DWORD bufsize, printerCount; 
DWORD level = 2; //2 is for PRINTER_INFO_2 

::EnumPrinters(flags, NULL, level, NULL, 0, &bufsize, &printerCount); 
if (bufsize) 
{ 
    BYTE* buffer = new BYTE[bufsize]; 
    ::EnumPrinters(flags, NULL, level, buffer, bufsize, &bufsize, &printerCount); 

    if (bufsize && printerCount) 
    { 
     const PRINTER_INFO_2* info = (PRINTER_INFO_2*)buffer; 
     for (DWORD i = 0; i < printerCount; i++) 
     { 
      if (info->pServerName) cout << "pServerName: " << info->pServerName << endl; 
      if (info->pPrinterName) cout << "pPrinterName: " << info->pPrinterName << endl; 
      if (info->pShareName) cout << "pShareName: " << info->pShareName << endl; 
      if (info->pPortName) cout << "pPortName: " << info->pPortName << endl; 
      if (info->Attributes & PRINTER_ATTRIBUTE_LOCAL) cout << "[local]\n"; 
      if (info->Attributes & PRINTER_ATTRIBUTE_NETWORK) cout << "[network]\n"; 

      wcout << "status: " << info->Status << endl; 
      if (info->Status & PRINTER_STATUS_ERROR) cout << "status: error\n"; 

      wcout << endl; 
      info++; 
     } 
    } 
    delete[] buffer; 
}