C++:删除打印机队列

C++: Deleting a printer queue

本文关键字:队列 打印机 删除 C++      更新时间:2023-10-16

我正在尝试从打印机中删除队列中的所有文件。我发现这段代码看起来很简单。

我尝试使用以下代码删除队列。它编译,但 SetPrinter 返回 false。我收到的错误消息是 5,我尝试使用此问题的方法将其解码为"正常"错误消息。但是我无法用它进行编译,因为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: %xn", GetLastError() );
        else printf("Number of printer jobs deleted: %un",
            pinfo->cJobs);
    }
    ClosePrinter( hPrinter );
}

我的包括:

#include <windows.h>
#include <winspool.h>

错误代码 5 表示"访问被拒绝"。(系统错误代码)

尝试使用管理员权限运行。

要格式化返回值 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);