测试打印机:佳能2580s
测试系统:Microsoft Windows [版本 6.1.7601]
测试的语言:C/C++
g++版本:g++ (i686-posix-sjlj, built by strawberryperl.com project) 4.9.2
执行命令:
g++ -std=c++11 -Wall main.cpp -o main -lgdi32 -lwinspool -static-libgcc -static-libstdc++ -Wl,--enable-stdcall-fixup
#include <Windows.h>
#include <stdio.h>
// 手动声明动态加载的API函数
typedef BOOL (WINAPI *GetDefaultPrinterAFunc)(LPSTR, LPDWORD);
typedef HDC (WINAPI *CreateDCAFunc)(LPCSTR, LPCSTR, LPCSTR, const DEVMODEA*);
typedef int (WINAPI *StartDocAFunc)(HDC, const DOCINFOA*);
static GetDefaultPrinterAFunc pGetDefaultPrinterA = NULL;
static CreateDCAFunc pCreateDCA = NULL;
static StartDocAFunc pStartDocA = NULL;
int InitPrinter() {
HMODULE hWinspool = LoadLibraryA("winspool.drv");
HMODULE hGdi32 = LoadLibraryA("gdi32.dll");
if (!hWinspool || !hGdi32) return 1;
pGetDefaultPrinterA = (GetDefaultPrinterAFunc)GetProcAddress(hWinspool, "GetDefaultPrinterA");
pCreateDCA = (CreateDCAFunc)GetProcAddress(hGdi32, "CreateDCA");
pStartDocA = (StartDocAFunc)GetProcAddress(hGdi32, "StartDocA");
if (!pGetDefaultPrinterA || !pCreateDCA || !pStartDocA) return 1;
return 0;
}
int PrintBlankPage() {
char szPrinter[256] = {0};
DWORD dwSize = sizeof(szPrinter);
HDC hdcPrinter = NULL;
DOCINFOA di = { sizeof(DOCINFOA), "BlankPageJob", NULL };
if (!pGetDefaultPrinterA(szPrinter, &dwSize)) return 1;
hdcPrinter = pCreateDCA(NULL, szPrinter, NULL, NULL);
if (!hdcPrinter) return 1;
if (pStartDocA(hdcPrinter, &di) <= 0) {
DeleteDC(hdcPrinter);
return 1;
}
// 关键修改:创建空白页面
StartPage(hdcPrinter); // 开始页面
EndPage(hdcPrinter); // 立即结束页面(无内容)
EndDoc(hdcPrinter);
DeleteDC(hdcPrinter);
return 0;
}
int main() {
if (InitPrinter() != 0) {
printf("打印机初始化失败\n");
return 1;
}
while (1) {
if (PrintBlankPage() == 0) {
printf("空白页已发送至打印机队列\n");
} else {
printf("错误:无法发送空白页\n");
}
Sleep(60000); // 保持60秒间隔
}
return 0;
}

6950

被折叠的 条评论
为什么被折叠?



