zoukankan      html  css  js  c++  java
  • MFC中获取指定打印机的打印队列的方法

    void CPrintListTestDlg::OnBnClickedButton1()
    {
        GetDlgItem(IDC_TxtList)->SetWindowText(L"");
        HANDLE   PrnHandle;   
        UpdateData(TRUE);
        LPTSTR strPrinter = m_StrPrinterName.GetBuffer();//如果网络打印机,则格式为\\Xp-pcname\CanonLBP or \\192.168.1.x\\PrinterName
        m_StrPrinterName.ReleaseBuffer(); 
        if   (OpenPrinter(strPrinter,&PrnHandle,NULL))   
        {   
            unsigned    char   buf[8192];   
            DWORD   dwSize;   
            if   (GetPrinter(PrnHandle,2,buf,sizeof(buf),   
                &dwSize))   {   
                    PRINTER_INFO_2*   pInfo;   
                    pInfo   =   (PRINTER_INFO_2*)buf;   
                    //pInfo->Status   就是打印机的状态,详细的代码可以   
                    //参见winspool.h中以PRINTER_STATUS开头的宏定义   
                    if(pInfo->Status==PRINTER_STATUS_PAUSED) 
                        ;
                        //cout<<"a"<<endl;
                    else if(pInfo->Status==PRINTER_STATUS_PENDING_DELETION)   
                        ;
                        //cout<<"b"<<endl;  
                    ///////////以上pInfo->Status代码试验不成功,哪位知道原因请告知,谢谢
                    if (pInfo->Attributes&PRINTER_ATTRIBUTE_WORK_OFFLINE)//测试成功
                    {
                        AfxMessageBox(L"offline");                
                    }
                    else
                    {
                        AfxMessageBox(L"online");
                    }
            }   
            JOB_INFO_2  *pJobs;
            int         cJobs;
            DWORD       dwPrinterStatus;
            if (!GetJobs(PrnHandle, &pJobs, &cJobs, &dwPrinterStatus))
            {
                /*CString strPrint = pJobs->pPrinterName;
                cout<<pJobs->JobId<<"\n"<<strPrint<<endl;
                cout<<pJobs->pDocument<<endl;*/    
                ClosePrinter(PrnHandle);
                return;
            }
            else
            {
                //CString strPrint = pJobs->pPrinterName;
                if (cJobs > 0)
                {
                    AppendText(IDC_TxtList, L"开始获取....");
                    //    cout<<pJobs->JobId<<"\nPrint:"<<strPrint<<endl;
    
                    CString strtemp ,strindex;
                    for (int j = 0; j <cJobs; j ++)
                    {
                        strindex.Format(L"%d", pJobs[j].JobId);
                        strtemp = pJobs[j].pDocument;
                        
                        strindex = L"打印文档"+strindex+L"\t";
                        strtemp = strindex + strtemp;
    
                        AppendText(IDC_TxtList,strtemp);
                    }
                }
                else
                    AppendText(IDC_TxtList, L"无打印队列");
            
            }
            ClosePrinter(PrnHandle);
        }
        else
        {
            CString strError;
            strError.Format(L"%d",GetLastError());
            strError = L"打开出错" + strError;
            AfxMessageBox(L"打开出错!");
        }
    
    }
    BOOL CPrintListTestDlg::GetJobs(HANDLE hPrinter,        /* Handle to the printer. */ 
                                    JOB_INFO_2 **ppJobInfo, /* Pointer to be filled.  */ 
                                    int *pcJobs,            /* Count of jobs filled.  */ 
                                    DWORD *pStatus)         /* Print Queue status.    */ 
    {
        DWORD               cByteNeeded,
            nReturned,
            cByteUsed;
        JOB_INFO_2          *pJobStorage = NULL;
        PRINTER_INFO_2       *pPrinterInfo = NULL;
    
        /* Get the buffer size needed. */ 
        if (!GetPrinter(hPrinter, 2, NULL, 0, &cByteNeeded))
        {
            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
                return FALSE;
        }
    
        pPrinterInfo = (PRINTER_INFO_2 *)malloc(cByteNeeded);
        if (!(pPrinterInfo))
            /* Failure to allocate memory. */ 
            return FALSE;
    
        /* Get the printer information. */ 
        if (!GetPrinter(hPrinter,
            2,
            (LPBYTE)pPrinterInfo,///////////////////////////lpstr
            cByteNeeded,
            &cByteUsed))
        {
            /* Failure to access the printer. */ 
            free(pPrinterInfo);
            pPrinterInfo = NULL;
            return FALSE;
        }
    
        /* Get job storage space. */ 
        if (!EnumJobs(hPrinter,
            0,
            pPrinterInfo->cJobs,
            2,
            NULL,
            0,
            (LPDWORD)&cByteNeeded,
            (LPDWORD)&nReturned))
        {
            if (GetLastError() != ERROR_INSUFFICIENT_BUFFER)
            {
                free(pPrinterInfo);
                pPrinterInfo = NULL;
                return FALSE;
            }
        }
    
        pJobStorage = (JOB_INFO_2 *)malloc(cByteNeeded);
        if (!pJobStorage)
        {
            /* Failure to allocate Job storage space. */ 
            free(pPrinterInfo);
            pPrinterInfo = NULL;
            return FALSE;
        }
    
        ZeroMemory(pJobStorage, cByteNeeded);
    
        /* Get the list of jobs. */ 
        if (!EnumJobs(hPrinter,
            0,
            pPrinterInfo->cJobs,
            2,
            (LPBYTE)pJobStorage,
            cByteNeeded,
            (LPDWORD)&cByteUsed,
            (LPDWORD)&nReturned))
        {
            free(pPrinterInfo);
            free(pJobStorage);
            pJobStorage = NULL;
            pPrinterInfo = NULL;
            return FALSE;
        }
    
        /*
        *  Return the information.
        */ 
        *pcJobs = nReturned;
        *pStatus = pPrinterInfo->Status;
        *ppJobInfo = pJobStorage;
        free(pPrinterInfo);
    
        return TRUE;
    }

    运行结果:

     

  • 相关阅读:
    HDU 5001 Walk (暴力、概率dp)
    Codeforces Round #265 (Div. 2) C 暴力+ 找规律+ 贪心
    zoj 3812 We Need Medicine (dp 状压)
    ZOJ
    ZOJ 3811 / 2014 牡丹江赛区网络赛 C. Untrusted Patrol bfs/dfs/并查集
    POJ 2411 状压dp
    HDU 3001 三进制 状压dp
    POJ 2096 (dp求期望)
    poj 3311 状压dp 最短路
    数据挖掘的基本概念
  • 原文地址:https://www.cnblogs.com/MarsPanda/p/2913533.html
Copyright © 2011-2022 走看看