Я использую функцию getJobs, которую я нашел для получения текущих заданий на печать на моем принтере (не на устройстве печати). До сих пор я могу сказать, сколько заданий на печать находится в очереди моего виртуального принтера, и у меня есть информация из JOB_INFO_ Strucs, с которой можно связываться, но я пытаюсь использовать SetJob (), чтобы удалить задание из очереди на печать (после сохранения информация, которую я хочу). С этим я получаю ошибку:
0xC0000005: Access violation reading location 0x00002012.
У меня вопрос, что именно я делаю не так? Я попытался выставить 0 как уровень и NULL для pJob, тогда я не получаю сообщение об ошибке, но задание на печать все еще находится в очереди. Я не могу найти кого-то еще, у кого есть примеры с объяснениями.
BOOL getJobs(LPTSTR printerName) {
HANDLE hPrinter; //Printer handle variable
DWORD dwNeeded, dwReturned, i; //Mem needed, jobs found, variable for loop
JOB_INFO_1 *pJobInfo; // pointer to structure
//Find printer handle
if (!OpenPrinter(printerName, &hPrinter, NULL)) {
return FALSE;
}
//Get amount of memory needed
if (!EnumJobs(hPrinter, 0, 0xFFFFFFFF, 1, NULL, 0, &dwNeeded, &dwReturned)) {
if (GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
ClosePrinter(hPrinter);
return FALSE;
}
}
//Allocate the memory, if you cant end function
if ((pJobInfo = (JOB_INFO_1 *)malloc(dwNeeded)) == NULL) {
ClosePrinter(hPrinter);
return FALSE;
}
//Get job info struc
if (!EnumJobs(hPrinter, 0, 0xFFFFFFFF, 1, (LPBYTE)pJobInfo, dwNeeded, &dwNeeded, &dwReturned)) {
ClosePrinter(hPrinter);
free(pJobInfo);
return FALSE;
}
//If there are printjobs, get document name and data type. put into docinfo1 struc and return true
if (dwReturned > 0){
docinfo1.pDocName = pJobInfo[1].pDocument;
docinfo1.pDatatype = pJobInfo[1].pDatatype;
SetJob(hPrinter, pJobInfo[1].JobId, 2, (LPBYTE)pJobInfo, JOB_CONTROL_DELETE);
ClosePrinter(hPrinter);
free(pJobInfo);
return TRUE;
}
//No print jobs, Free memory and finish up :>
ClosePrinter(hPrinter);
free(pJobInfo);
return FALSE;
}
Помощь очень ценится.
РЕДАКТИРОВАТЬ: проблема оказалась простой ошибкой, когда я сказал SetJob неправильный тип структуры.
Помимо указания JOB_INFO_2
структура, когда вы на самом деле передать JOB_INFO_1
структура (как было отмечено в комментариях), вы также пытаетесь использовать второй элемент pJobInfo[]
, который может даже не существовать:
SetJob(hPrinter, pJobInfo[1].JobId, 2, (LPBYTE)pJobInfo, JOB_CONTROL_DELETE);
Измените это на:
SetJob(hPrinter, pJobInfo[0].JobId, 1, (LPBYTE)pJobInfo, JOB_CONTROL_DELETE);
Или еще лучше, сделайте это, потому что все, что вам нужно, чтобы удалить задание на печать, это идентификатор задания:
SetJob(hPrinter, pJobInfo[0].JobId, 0, NULL, JOB_CONTROL_DELETE);
Других решений пока нет …