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.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...