2012-10-19 82 views
5

我想檢查打印機是否在線。爲此,我使用OpenPrinter獲得 打印機手柄。然後我想在PRINTER_INFO_6中使用PRINTER_STATUS_OFFLINE 和GetPrinter()。結果總是0?檢查安裝的網絡打印機是否在線

如何獲得我的打印機的脫機狀態?

我使用的代碼。

bool IsPrinterOnline(wstring strPrinterFriendlyName) 
{ 
    HANDLE hPrinter ; 
    if (OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0) 
    {  
    /*OpenPrinter call failed*/ 
    return false; 
    } 

    DWORD dwBufsize = 0; 
    PRINTER_INFO_6* pinfo = 0; 
    GetPrinter(hPrinter, 6,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize 

    PRINTER_INFO_6* pinfo6 = (PRINTER_INFO_6*)malloc(dwBufsize); //Allocate with dwBufsize 
    GetPrinter(hPrinter, 6,(LPBYTE)pinfo6, dwBufsize, &dwBufsize); 

    DWORD dwStatus = pinfo6->dwStatus; //always returns 0 

    if (dwStatus == PRINTER_STATUS_OFFLINE) 
    { 
    free(pinfo6); 
    ClosePrinter(hPrinter); 
    return false; 
    } 

    free(pinfo6); 
    ClosePrinter(hPrinter); 
    return true; 
} 
+0

這兩個'GetPrinter'實際上是否成功? – Jay

+0

第二個GetPrinter成功(返回非零)。但是狀態總是爲零。 –

回答

6

我修好了。我用「pinfo2->屬性& PRINTER_ATTRIBUTE_WORK_OFFLINE」。

這是代碼。

bool IsPrinterOnline(wstring strPrinterFriendlyName) 
{ 
    HANDLE hPrinter ; 
    if (OpenPrinter(const_cast<LPWSTR>(strPrinterFriendlyName.c_str()), &hPrinter, NULL) == 0) 
    {  
    /*OpenPrinter call failed*/ 
    return false; 
    } 

    DWORD dwBufsize = 0; 
    PRINTER_INFO_2* pinfo = 0; 
    int nRet = 0; 
    nRet = GetPrinter(hPrinter, 2,(LPBYTE)pinfo, dwBufsize, &dwBufsize); //Get dwBufsize 
    DWORD dwGetPrinter = 0; 
    if (nRet == 0) 
    { 
    dwGetPrinter = GetLastError(); 
    } 

    PRINTER_INFO_2* pinfo2 = (PRINTER_INFO_2*)malloc(dwBufsize); //Allocate with dwBufsize 
    nRet = GetPrinter(hPrinter, 2,reinterpret_cast<LPBYTE>(pinfo2), dwBufsize, &dwBufsize); 
    if (nRet == 0) 
    { 
    dwGetPrinter = GetLastError(); 
    return false; 
    } 

    if (pinfo2->Attributes & PRINTER_ATTRIBUTE_WORK_OFFLINE) 
    { 
    free(pinfo2); 
    ClosePrinter(hPrinter); 
    return false; 
    } 

    free(pinfo2); 
    ClosePrinter(hPrinter); 
    return true; 
} 
+0

不正確,至少對於網絡打印機。 –

+0

@CristianAmarie:你能解釋一下你的評論嗎? – Thalia

+0

當物理設備實際處於脫機狀態時,可以將網絡打印機報告爲聯機。我不是說事情總是如此,但事情正在發生。 也發生了相反的情況:網絡打印機在我的計算機上報告爲脫機(這是錯誤的),我無法打印任何東西。我讓同事打印一些東西,然後打印機將其狀態更新回在線狀態。最有可能的假脫機程序和網絡列表管理器/ UPnP/Win32正在使用的任何機制之間存在分歧。 –