использование функции SetJob в printspooler API

Я использую функцию 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 неправильный тип структуры.

0

Решение

Помимо указания 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);
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]