2012-10-19 13 views
5

Chcę sprawdzić, czy drukarka jest podłączona do sieci. W tym celu otrzymuję uchwyt drukarki z OpenPrinter. Następnie chcę użyć PRINTER_STATUS_OFFLINE w PRINTER_INFO_6 z GetPrinter(). Wynik zawsze wynosi 0?Sprawdź, czy zainstalowana drukarka sieciowa jest online

Jak uzyskać stan offline mojej drukarki?

Kod użyty.

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

Czy oba 'GetPrinter' rzeczywiście się powiodły? – Jay

+0

Drugi GetPrinter powiodło się (zwrócił wartość niezerową). Ale status jest zawsze zerowy. –

Odpowiedz

6

Naprawiłem to. użyłem "pinfo2-> Atrybuty & PRINTER_ATTRIBUTE_WORK_OFFLINE".

Oto kod.

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

Nieprawidłowe, przynajmniej dla drukarek sieciowych. –

+0

@CristianAmarie: czy możesz wyjaśnić swój komentarz? – Thalia

+0

Drukarkę sieciową można zgłosić jako online, podczas gdy urządzenie fizyczne jest w rzeczywistości offline. Nie mówię, że zawsze jest prawdą, ale tak się dzieje. Wystąpiła również sytuacja odwrotna: drukarka sieciowa została zgłoszona na moim komputerze jako offline (co było fałszem) i nie mogłem niczego wydrukować. Poprosiłem kolegę, aby wydrukował coś i voila - drukarka zaktualizowała swój status z powrotem do trybu online. Najprawdopodobniej jest spór między spoolerem a menedżerem listy/UPnP/jakimkolwiek mechanizmem Win32. –