2012-10-19 48 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

2番目のGetPrinterが成功しました(0以外を返しました)。しかし、ステータスは常にゼロです。 –

答えて

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が使用しているどのようなメカニズムとの間にも不一致があります。 –

関連する問題