Druckerstatus (PRINTER_ATTRIBUTE) auslesen



  • Hallo ,
    bin schon am verzweifeln.
    Ich möchte Programmgesteuert herausfinden, ob der angeschlossene Drucker den Status ONLINE/OFFLINE hat.
    Über PRINTER_INFO_5 kann ich PRINTER_ATTRIBUTE auslesen, was so weit funktioniert.
    Wenn ich aber den Drucker über Windows (WIN7) auf offline setze, kriege ich den PRINTER_ATTRIBUTE-Wert=0x00000640 und auf Online 0x00000240 beide Werte sind aber in Winspool.h nicht definiert 😮
    Hat jemand ne Idee, ob die beiden Werte wirklich ON/OFFLINE-Status repräsentieren?

    Winspool.h Attribute
    #define PRINTER_ATTRIBUTE_QUEUED 0x00000001
    #define PRINTER_ATTRIBUTE_DIRECT 0x00000002
    #define PRINTER_ATTRIBUTE_DEFAULT 0x00000004
    #define PRINTER_ATTRIBUTE_SHARED 0x00000008
    #define PRINTER_ATTRIBUTE_NETWORK 0x00000010
    #define PRINTER_ATTRIBUTE_HIDDEN 0x00000020
    #define PRINTER_ATTRIBUTE_LOCAL 0x00000040
    #define PRINTER_ATTRIBUTE_ENABLE_DEVQ 0x00000080
    #define PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS 0x00000100
    #define PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST 0x00000200
    #define PRINTER_ATTRIBUTE_WORK_OFFLINE 0x00000400
    #define PRINTER_ATTRIBUTE_ENABLE_BIDI 0x00000800
    #define PRINTER_ATTRIBUTE_RAW_ONLY 0x00001000
    #define PRINTER_ATTRIBUTE_PUBLISHED 0x00002000
    #define PRINTER_ATTRIBUTE_FAX 0x00004000
    #define PRINTER_ATTRIBUTE_TS 0x00008000
    #define PRINTER_ATTRIBUTE_PUSHED_USER 0x00020000
    #define PRINTER_ATTRIBUTE_PUSHED_MACHINE 0x00040000
    #define PRINTER_ATTRIBUTE_MACHINE 0x00080000
    #define PRINTER_ATTRIBUTE_FRIENDLY_NAME 0x00100000

    CString str,name; 
    	DWORD dwNeeded, dwReturned; 
    	PRINTER_INFO_5 *pInfo5; 
    
    	EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, NULL, 0, &dwNeeded, &dwReturned); 
    	pInfo5 = new PRINTER_INFO_5[dwNeeded]; 
    	EnumPrinters(PRINTER_ENUM_LOCAL, NULL, 5, (PBYTE) pInfo5, dwNeeded, &dwNeeded, &dwReturned); 
    
    	if(NULL != pInfo5) 
    	{ 
    		PRINTER_INFO_5 *pDrucker = pInfo5;
    
    		for(UINT i = 0; i < dwReturned; i++) 
    		{ 
    			str.Format("NAME:%s PORT:%s Attrib:%d",pDrucker->pPrinterName ,pDrucker->pPortName, pDrucker->Attributes); 
    			name = pDrucker->pPortName;
    			if( (name.MakeUpper().Find("USB") != -1)) 
    			{
    				m_List.AddString( str);
    				switch(pDrucker->Attributes)
    				{
    					case PRINTER_ATTRIBUTE_DIRECT			        : m_List.AddString("PRINTER_ATTRIBUTE_DIRECT			"); break;
    					case PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST	: m_List.AddString("PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST	");break;
    					case PRINTER_ATTRIBUTE_ENABLE_DEVQ		    : m_List.AddString("PRINTER_ATTRIBUTE_ENABLE_DEVQ		");break;
    					case PRINTER_ATTRIBUTE_HIDDEN			        : m_List.AddString("PRINTER_ATTRIBUTE_HIDDEN			");break;
    					case PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS	  : m_List.AddString("PRINTER_ATTRIBUTE_KEEPPRINTEDJOBS	");break;
    					case PRINTER_ATTRIBUTE_LOCAL		    		  : m_List.AddString("PRINTER_ATTRIBUTE_LOCAL				");break;
    					case PRINTER_ATTRIBUTE_NETWORK			      : m_List.AddString("PRINTER_ATTRIBUTE_NETWORK			");break;
    					case PRINTER_ATTRIBUTE_PUBLISHED		    	: m_List.AddString("PRINTER_ATTRIBUTE_PUBLISHED			");break;
    					case PRINTER_ATTRIBUTE_QUEUED			        : m_List.AddString("PRINTER_ATTRIBUTE_QUEUED			");break;
    					case PRINTER_ATTRIBUTE_RAW_ONLY		      	: m_List.AddString("PRINTER_ATTRIBUTE_RAW_ONLY			");break;
    					case PRINTER_ATTRIBUTE_SHARED			        : m_List.AddString("PRINTER_ATTRIBUTE_SHARED			");break;
    					case PRINTER_ATTRIBUTE_FAX	 	      	    : m_List.AddString("PRINTER_ATTRIBUTE_FAX	 		 ");break;
    					case PRINTER_ATTRIBUTE_FRIENDLY_NAME    	: m_List.AddString("PRINTER_ATTRIBUTE_FRIENDLY_NAME"); break;
    					case PRINTER_ATTRIBUTE_MACHINE	 	        : m_List.AddString("PRINTER_ATTRIBUTE_MACHINE	 	 ");break;
    					case PRINTER_ATTRIBUTE_PUSHED_USER	      : m_List.AddString("PRINTER_ATTRIBUTE_PUSHED_USER	 ");break;
    					case PRINTER_ATTRIBUTE_PUSHED_MACHINE     : m_List.AddString("PRINTER_ATTRIBUTE_PUSHED_MACHINE");break;
    					case PRINTER_ATTRIBUTE_WORK_OFFLINE       : m_List.AddString("PRINTER_ATTRIBUTE_WORK_OFFLINE");break;
    					case PRINTER_ATTRIBUTE_ENABLE_BIDI        : m_List.AddString("PRINTER_ATTRIBUTE_ENABLE_BIDI");break;
    					case PRINTER_ATTRIBUTE_TS                 : m_List.AddString("PRINTER_ATTRIBUTE_TS");break;
    					case PRINTER_ATTRIBUTE_DEFAULT            : m_List.AddString("PRINTER_ATTRIBUTE_DEFAULT");break;
    					case PRINTER_ATTRIBUTE_TS_GENERIC_DRIVER  : m_List.AddString("PRINTER_ATTRIBUTE_TS_GENERIC_DRIVER");break;
    					default: m_List.AddString("UNDEFINIERT;"); // HIER IMMER UNDEFINIERT!!!!
    				}
    			}
    			pDrucker++; 
    		} 
    	} 
    	delete[] pInfo5;
    

  • Mod

    Das ist eine Bit Maske.
    Also ist es sehr wohl definiert:

    0x640 == PRINTER_ATTRIBUTE_LOCAL | PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST | PRINTER_ATTRIBUTE_WORK_OFFLINE;
    0x240 == PRINTER_ATTRIBUTE_LOCAL | PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST;
    

    Mit seinem switch case kommst Du da nicht hin:

    if (pDrucker->Attributes & PRINTER_ATTRIBUTE_DIRECT)
        m_List.AddString("PRINTER_ATTRIBUTE_DIRECT            ");
    if (pDrucker->Attributes & PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST)
        m_List.AddString("PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST    ");
    ...
    


  • Hallo Martin,

    jetzt fällt der Groschen

    man dankt..


Log in to reply