It had also been returning INVALID_PARAMETER for while, until I made sure to clear the PRINTER_NOTIFY_OPTIONS structure (The MSDN lies, FindNextPrinterChangeNotification does NOT ignore everything but the Flags field.
Here is my code
#include <Windows.h>
#include <stdio.h>
#include <conio.h>
int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, LPSTR lpCmdLine, int nCmdShow)
{
if(!AllocConsole()) return 1;
if(!(freopen("CONIN$", "rb", stdin) && freopen("CONOUT$", "wb", stdout) && freopen("Errlog.log", "wb", stderr))) return 2;
fprintf(stderr, "DEBUG : CONSOLE OK!\n");
LPBYTE buffer = NULL;
DWORD bufferSize = sizeof(buffer)/sizeof(buffer[0]);
DWORD numberPrinters = 0;
PRINTER_DEFAULTS printerPermissions;
memset(&printerPermissions, 0, sizeof(printerPermissions));
printerPermissions.DesiredAccess = PRINTER_ALL_ACCESS;
//Start Printer Enum
printf("Select the target printer\n");
if(!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, bufferSize, &bufferSize, &numberPrinters))
{
buffer = new BYTE[bufferSize];
if(!EnumPrinters(PRINTER_ENUM_LOCAL | PRINTER_ENUM_CONNECTIONS, NULL, 4, buffer, bufferSize, &bufferSize, &numberPrinters))
{
fprintf(stderr, "FAIL : Unable to Get Printers\n");
delete [] buffer;
return 3;
}
}
//End Printer Enum
//Start UI
fprintf(stderr, "DEBUG : PRINTER LIST OK\n");
for(unsigned int i = 0; i < numberPrinters; i++)
{
printf("%d : %s\n", i, (reinterpret_cast<PRINTER_INFO_4*>(buffer)+i)->pPrinterName);
}
fprintf(stderr, "DEBUG : LISTED PRINTERS OK!\n");
unsigned int input = 0;
do
{
scanf("%i", &input);
}while(input >= numberPrinters);
fprintf(stderr, "DEBUG : USER INPUT OK!\n");
char currentPrinter[64];
strcpy_s(currentPrinter, sizeof(currentPrinter)/sizeof(currentPrinter[0]), (reinterpret_cast<PRINTER_INFO_4*>(buffer)+input)->pPrinterName);
delete [] buffer;
bufferSize = 0;
HANDLE selectedPrinter = NULL;
//End UI
//HACK FIX LATER
OpenPrinter(currentPrinter, &selectedPrinter, NULL);
if(!GetPrinter(selectedPrinter, 2, buffer, bufferSize, &bufferSize))
{
buffer = new BYTE[bufferSize];
GetPrinter(selectedPrinter, 2, buffer, bufferSize, &bufferSize);
printerPermissions.pDatatype = reinterpret_cast<PRINTER_INFO_2*>(buffer)->pDatatype;
printerPermissions.pDevMode = reinterpret_cast<PRINTER_INFO_2*>(buffer)->pDevMode;
ClosePrinter(selectedPrinter);
}
//END HACK
//Start Open Printer
if(!OpenPrinter(currentPrinter, &selectedPrinter, &printerPermissions))
{
fprintf(stderr, "FAIL : Unable to open %s\n", currentPrinter);
return 4;
}
delete [] buffer;
fprintf(stderr, "DEBUG : PRINTER OPEN OK!\n");
//End Open Printer
//Start Hook Printer
fprintf(stderr, "DEBUG : HOOKING PRINTER....\n");
HANDLE printerHook = NULL;
if((printerHook = FindFirstPrinterChangeNotification(selectedPrinter, PRINTER_CHANGE_ADD_JOB, 0, NULL)) == NULL)
{
fprintf(stderr, "FAIL : Unable to hook printer\n");
ClosePrinter(selectedPrinter);
return 5;
}
fprintf(stderr, "DEBUG : PRINTER HOOK OK!\n");
//End Hook Printer
//Start Wait
fprintf(stderr, "DEBUG : STARTING WAIT.....\n");
switch(WaitForSingleObject(printerHook, 20000))
{
case WAIT_ABANDONED:
fprintf(stderr, "FAIL : Wait Failed - Abandonded\n");
FindClosePrinterChangeNotification(printerHook);
ClosePrinter(selectedPrinter);
return 6;
case WAIT_FAILED:
fprintf(stderr, "FAIL : Wait Failed - Error Code %i\n", GetLastError());
FindClosePrinterChangeNotification(printerHook);
ClosePrinter(selectedPrinter);
return 7;
break;
case WAIT_TIMEOUT:
fprintf(stderr, "FAIL : Wait Failed - Wait Timeout\n");
FindClosePrinterChangeNotification(printerHook);
ClosePrinter(selectedPrinter);
return 8;
}
fprintf(stderr, "DEBUG : WAIT OK!\n");
//End Wait
//Start Notify
PRINTER_NOTIFY_OPTIONS notifyOptions;
PRINTER_NOTIFY_INFO* notifyInfo = NULL;
memset(¬ifyOptions, 0, sizeof(notifyOptions));
notifyOptions.Flags = PRINTER_NOTIFY_OPTIONS_REFRESH;
notifyOptions.Version = 2;
if(!FindNextPrinterChangeNotification(printerHook, NULL, ¬ifyOptions, reinterpret_cast<LPVOID*>(¬ifyInfo))) //Problem is here
{
fprintf(stderr, "FAIL : Unable to get Notification Info - Error Code %i\n", GetLastError());
FindClosePrinterChangeNotification(printerHook);
ClosePrinter(selectedPrinter);
return 9;
}
for(int i = 0; i < notifyInfo->Count; i++)
{
if(notifyInfo->aData[i].Type == JOB_NOTIFY_TYPE && notifyInfo->aData[i].Field == JOB_NOTIFY_FIELD_DOCUMENT)
{
printf("DOCUMENT : %s\n", notifyInfo->aData[i].NotifyData.Data.pBuf);
}
}
fprintf(stderr, "DEBUG : NOTIFYINFO OK!");
//End Notify
FreePrinterNotifyInfo(notifyInfo);
FindClosePrinterChangeNotification(printerHook);
ClosePrinter(selectedPrinter);
getch();
fprintf(stderr, "DEBUG : PROGRAM EXIT OK!");
return 0;
}
Any help at all would be appreciated, I have been banging my head against this for the past 2 hours without any progress, even the Great Google has not been much help.
And before you ask, Yes I have both UAC and the windows firewall turned off and I know I shouldn't be using ASCII, but I didn't want to bother with Unicode until I at least got the printing stuff working.

New Topic/Question
Reply




MultiQuote




|