Druckaufträge erstellen



  • So wäre es in C#!

    int iAnzahl = Convert.ToInt32(tb_anzahl.Text);
                for (int i = 1; i <= iAnzahl; i++)
                {
                    LocalPrintServer localPrintServer = new LocalPrintServer();
                    PrintQueue printer = LocalPrintServer.GetDefaultPrintQueue();
                    printer.AddJob("Druckauftrag " + i);
                }
    


  • Schön, warum benutzt Du nicht C#?

    Ansonsten hat Martin Dir einen Link mit allen nötigen Infos geschickt.
    Schau ich mir Deinen Beispielcode an, merke ich das Du die Beschreiben zu AddJob nicht gelesen hast.
    Das Orginal

    BOOL AddJob(
      __in   HANDLE hPrinter,
      __in   DWORD Level,
      __out  LPBYTE pData,
      __in   DWORD cbBuf,
      __out  LPDWORD pcbNeeded
    );
    

    Und die Beschreibung zur Funktion:

    Parameters
    
    hPrinter [in]
        A handle that specifies the printer for the print job. This must be a local printer that is configured as a spooled printer. If hPrinter is a handle to a remote printer connection, or if the printer is configured for direct printing, the AddJob function fails. Use the OpenPrinter or AddPrinter function to retrieve a printer handle.
    
    Level [in]
        The version of the print job information data structure that the function stores into the buffer pointed to by pData. Set this parameter to one.
    
    pData [out]
        A pointer to a buffer that receives an ADDJOB_INFO_1 data structure and a path string.
    
    cbBuf [in]
        The size, in bytes, of the buffer pointed to by pData. The buffer needs to be large enough to contain an ADDJOB_INFO_1 structure and a path string.
    
    pcbNeeded [out]
        A pointer to a variable that receives the total size, in bytes, of the ADDJOB_INFO_1 data structure plus the path string. If this value is less than or equal to cbBuf and the function succeeds, this is the actual number of bytes written to the buffer pointed to by pData. If this number is greater than cbBuf, the buffer is too small, and you must call the function again with a buffer size at least as large as *pcbNeeded.
    

    Die Beschreibung der Struktur ADDJOB_INFO_1 findet sich verlinkt.
    Wenn Du Dir diese Struktur anschaust, wirst Du verstehen was fehlt.
    Deine "Adaption"

    AddJobW(
            phPrinter, 
            1, 
            NULL,        // ?
            0,           // ?
            &cbNeeded    // wozu braucht man das hier wenn der 3. Parm 0 ist
           );
    

    Wo ist nun die Schwierigkeit der Funktion, das Nötige mitzugegeben?



  • Es fehlt der Pfad... aber wenn ich nicht weiß wie der Drucker heißt, wie kann ich dann den Pfad zu diesem herstellen?



  • 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