我正在尝试从打印机中删除队列中的所有文件。我发现this piece of code似乎非常直接。
我尝试使用下面的代码删除队列。它编译,但SetPrinter返回false。我得到的错误消息是5,我尝试使用方法from this question解码为“正常”错误消息。但我无法用它编译,因为STR_ELEMS未定义。搜索谷歌“STR_ELEMS未定义”,但死胡同。
有人可以帮我解码错误信息并删除打印机队列吗?
BOOL bStatus = false;
HANDLE hPrinter = NULL;
DOC_INFO_1 DocInfo;
bStatus = OpenPrinter((LPTSTR)_T("CN551A"), &hPrinter, NULL);
if(bStatus) {
DWORD dwBufsize=0;
GetPrinterA(hPrinter, 2, NULL, 0, &dwBufsize); // Edit: Returns false
PRINTER_INFO_2* pinfo = (PRINTER_INFO_2*)malloc(dwBufsize);
long result = GetPrinterA(hPrinter, 2,
(LPBYTE)pinfo, dwBufsize, &dwBufsize);
if ( pinfo->cJobs==0 ) // Edit: pinfo->cJobs is not 0
{
printf("No printer jobs found.");
}
else
{
if ( SetPrinter(hPrinter, 0, 0, PRINTER_CONTROL_PURGE)==0 )
printf("SetPrinter call failed: %x\n", GetLastError() );
else printf("Number of printer jobs deleted: %u\n",
pinfo->cJobs);
}
ClosePrinter( hPrinter );
}
我的包括:
#include <windows.h>
#include <winspool.h>
答案 0 :(得分:3)
错误代码为5意味着&#34;访问被拒绝&#34;。 (System Error Codes)
尝试使用管理员权限运行。
要从GetLastError
的返回值格式化可打印错误消息,请使用FormatMessage
这样的内容:
TCHAR buffer[256];
if (0 == FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,
GetLastError(), 0, buffer, 256, 0)) {
// FormatMessage failed.
}
此外,您可以尝试将PRINTER_DEFAULTS
结构传递给OpenPrinter
,也许是这样的:
PRINTER_DEFAULTS PrnDefs;
PrnDefs.pDataType = "RAW";
PrnDefs.pDevMode = 0;
PrnDefs.DesiredAccess = PRINTER_ALL_ACCESS;
bStatus = OpenPrinter((LPTSTR)_T("CN551A"), &hPrinter, &PrnDefs);