Druckaufträge erstellen



  • Kann mir niemand ein Bsp. machen wie ich das bewerkstellige? 😃



  • Die EnumPrinters function holt Dir die verfügbaren Drucker, Druckprovider oder -server:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd162692%28v=vs.85%29.aspx

    Andere Möglichkeit, Druckernamen per Argument beim Programmaufruf.


  • Mod

    Squirl schrieb:

    Kann mir niemand ein Bsp. machen wie ich das bewerkstellige? 😃

    👎 Es ist immer wieder verblüffend zu welchen exorbitanten Leistungen Google fähig ist.
    http://www.lmgtfy.com/?q=enumjobs+example+c%2B%2B



  • LPHANDLE	phPrinter=NULL;	 // Handle to printer object
    	DWORD	cbBufSize=0, cbNeeded, cByteNeeded, cByteUsed, cReturned;
    
    	DWORD dwFlags =  PRINTER_ENUM_LOCAL | PRINTER_ENUM_FAVORITE; 
    
    	PRINTER_INFO_2 l_PrintersStruct[300]; 
    	LPPRINTER_INFO_2 lp_PrintersStruct = &l_PrintersStruct[0];
    	DWORD l_BufferSize = sizeof(l_PrintersStruct);
    
    	ADDJOB_INFO_1 l_jobstruct;
    	DWORD l_JobSize = sizeof(l_JobSize);
    
    	EnumPrinters(dwFlags, NULL,2,(LPBYTE) lp_PrintersStruct,l_BufferSize,&cbNeeded, &cReturned);
    
    	OpenPrinter(lp_PrintersStruct->pPrinterName,phPrinter, NULL);
    
    	AddJobW(phPrinter, 1, (LPBYTE)&l_jobstruct, l_JobSize, &cbNeeded);
    


  • Martin Richter schrieb:

    Squirl schrieb:

    Kann mir niemand ein Bsp. machen wie ich das bewerkstellige? 😃

    👎 Es ist immer wieder verblüffend zu welchen exorbitanten Leistungen Google fähig ist.
    http://www.lmgtfy.com/?q=enumjobs+example+c%2B%2B

    Danke aber danach konnte ich auch selber suchen...



  • BTW: 2 Beiträge weiter oben, soweit bin ich jetzt!



  • Klappt es?



  • LPHANDLE	phPrinter=NULL;	 // Handle to printer object
    	DWORD	cbBufSize=0, cbNeeded, cByteNeeded, cByteUsed, cReturned;
    
    	DWORD dwFlags =  PRINTER_ENUM_LOCAL | PRINTER_ENUM_FAVORITE; 
    
    	PRINTER_INFO_2 l_PrintersStruct[300]; 
    	LPPRINTER_INFO_2 lp_PrintersStruct = &l_PrintersStruct[0];
    	DWORD l_BufferSize = sizeof(l_PrintersStruct);
    
    	ADDJOB_INFO_1 l_jobstruct;
    	DWORD l_JobSize = sizeof(l_JobSize);
    
    	EnumPrinters(dwFlags, NULL,2,(LPBYTE) lp_PrintersStruct,l_BufferSize,&cbNeeded, &cReturned);
    
    	AddPrinter(NULL,2,(LPBYTE)l_PrintersStruct);
    
    	//OpenPrinter(lp_PrintersStruct->pPrinterName,phPrinter, NULL);
    
    	AddJobW(phPrinter, 1, (LPBYTE)&l_jobstruct, l_JobSize, &cbNeeded);
    

    Nein, leider nicht! phPrinter ist leer! 😃



  • char cPrinterName[65538];
    int iPrinterNameSize = sizeof(cPrinterName);
    int iLastError;
    HANDLE hPrinter;
    
    if(GetDefaultPrinter(cPrinterName, (DWORD*) &iPrinterNameSize) == 0)
    {
        iLastError = GetLastError();
    
    }
    
    if(OpenPrinter(cPrinterName, &hPrinter, NULL) == 0)
    {
        iLastError = GetLastError();
    
    }
    

    Damit müsstest du den Namen des Standard-Druckers bekommen und den anschließend "öffnen" können.
    Wenn es nicht geht, setz' Haltepunkte und überprüfe 'iLastError'.

    MSDN GetDefaultPrinter:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd144876(v=vs.85).aspx

    MSDN OpenPrinter:
    http://msdn.microsoft.com/en-us/library/windows/desktop/dd162751(v=vs.85).aspx

    MSDN FehlerCodes:
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms681381(v=vs.85).aspx



  • // Printer 
    	char cPrinterName[65538]; 
    	int iPrinterNameSize = sizeof(cPrinterName); 
    	int iLastError; 
    	HANDLE hPrinter; 
    	DWORD	cbBufSize=0, cbNeeded, cByteNeeded, cByteUsed, cReturned;
    	DWORD dwFlags =  PRINTER_ENUM_LOCAL | PRINTER_ENUM_FAVORITE; 
    	PRINTER_INFO_2 l_PrintersStruct[300]; 
    	LPPRINTER_INFO_2 lp_PrintersStruct = &l_PrintersStruct[0];
    	DWORD l_BufferSize = sizeof(l_PrintersStruct);
    	ADDJOB_INFO_1 l_jobstruct;
    	DWORD l_JobSize = sizeof(l_jobstruct);
    
    	JOB_INFO_1 l_JobInfoStruct;
    	DWORD l_JobInfoSize = sizeof(l_JobInfoStruct);
    
    	// Gibt die verfügbaren Drucker und infos zurück
    	EnumPrinters(dwFlags, NULL,2,(LPBYTE) lp_PrintersStruct,l_BufferSize,&cbNeeded, &cReturned);
    
    	// Get den Default Printer
    	if(GetDefaultPrinter((LPWSTR)cPrinterName, (DWORD*) &iPrinterNameSize) == 0) 
    	{ 
    		iLastError = GetLastError(); 
    	} 
    
    	// Öffnet den Printer
    	if(OpenPrinter((LPWSTR)cPrinterName, &hPrinter, NULL) == 0) 
    	{ 
    		iLastError = GetLastError(); 
    	}
    
    	if(AddJobW(hPrinter, 1, (LPBYTE)&l_jobstruct, l_BufferSize, &cbNeeded) == false)
    	{
    		ASSERT(false);
    		iLastError = GetLastError();
    	}
    
    	// Job löschen
    
    	int iAnzahl = 3;
    
    	if(EnumJobs(hPrinter,0,3,1, (LPBYTE)&l_JobInfoStruct,l_BufferSize,&cbNeeded,&cReturned) == false)
    	{
    		//ASSERT(false);
    		iLastError = GetLastError();
    	}
    
    	if(SetJob(hPrinter,l_JobInfoStruct.JobId,1,(LPBYTE)&l_JobInfoStruct,JOB_CONTROL_DELETE) == false)
    	{
    		//ASSERT(false);
    		iLastError = GetLastError();
    	}
    

    So Job hinzufügen läuft jetzt ohne Probleme, doch ich bekomme keinen Job gelöscht! iLastError der Funktion SetJob, steht 5 = Access is denied.

    Danke schonmal! 😃


  • Mod

    Jo... Keine Rechte, wie GetLastError eben sagt...



  • Sehr guter, wichtiger und hilfreicher Beitrag Herr Richter! 😃


  • Mod

    Garaka schrieb:

    Sehr guter, wichtiger und hilfreicher Beitrag Herr Richter! 😃

    Eben.
    Woher sollen wir bitte wissen, warum er auf die Prozesse keine Rechte hat?
    Oder hast Du eine Kristallkugel?

    Manche Leute glauben es einfach nicht und vermuten anderes hinter access denied.

    Insofern ist mein Beitrag also hilfreich... 🤡


Anmelden zum Antworten