Druckaufträge erstellen
-
Ich komm von C# dort ist es ganz einfach mit Addjob einen Druckauftrag hinuzufügen, doch leider versteh ich das in C++ nicht so recht.
-
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 OrginalBOOL 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.aspxAndere Möglichkeit, Druckernamen per Argument beim Programmaufruf.
-
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%2BDanke 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).aspxMSDN OpenPrinter:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd162751(v=vs.85).aspxMSDN 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!
-
Jo... Keine Rechte, wie GetLastError eben sagt...
-
Sehr guter, wichtiger und hilfreicher Beitrag Herr Richter!
-
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...