c++使用打印机API打印



我在打印打印机的过程中有一个询价。

下面是我的三个程序描述。

[My Application info]

  1. 挂钩与打印相关的api,如StartDoc, StartPage, ExtTextOut, EndPage, EndDoc

  2. 在打印过程中对EndDoc API中从ExtTextOut获取的整个字符串进行检查后,当检测到特定字符串时,删除打印机并查看审批页面。

  3. 得到批准后,我想重新打印现有的打印机。(JOB_CONTROL_RESUME将不会在我的程序中使用。无条件删除后必须重新打印

  4. 转载时不再显示对话框。有了在DocumentProperties API开始时启动的打印的所有属性信息,将使用该信息重新启动相同的打印。

[Current reprint Logic]这是我现在的状态。如果您删除Print并再次继续打印(这是在创建新打印机DC后运行StartDoc, StartPage, Endpage, EndDoc的逻辑),在特定文档(Excel的文本框等)中,正常输出是不可能的。我检查了MSDN,确认没有API可以在Windows中输出特定的打印名称,所以我写了上面的代码。

(PowerShell命令)另外,为了打印,我尝试了下面的命令使用PowerShell打印几个文件(ppt, xls, doc…等),包括txt文件。PowerShell祝辞Start-Process -FilePath "C:UsersDeveloperODesktop1234.docx"动词打印上面的命令工作了,但结果不是我想要的,因为已经启动了一个新进程。

开始一个新的过程并开始打印对我不起作用。

(请回答)

问题0)有没有一个命令可以打印一个打开的进程,而不使用powershell启动进程?(目前我知道只能打印txt文件)

问题1)我一直在用c++语言工作,是否有API以编程方式请求使用c++的打印机?

问题2)我还尝试了ScheduleJob API。但这一直给出3002错误。(无法找到假脱机文件。)

代码如下,你能给我一些建议吗?

int main()
{
BOOL bResult = FALSE;
HANDLE hPrinter = NULL;
DWORD dNeedNum = 0;
CHAR szFullPath[MAX_PATH] = { 0, };
DWORD size = 4096;
ADDJOB_INFO_1 * JobInfo = { 0, };
W2M(g_wszFullPath, szFullPath);
bResult = OpenPrinter("Printer Name", &hPrinter, NULL);
if (bResult == FALSE)
{
printf("Error = %d", GetLastError());
}
JobInfo = (ADDJOB_INFO_1)LocalAlloc((LMEM_FIXED / LMEM_ZEROINIT), size);
bResult = AddJob(hPrinter, 1, (BYTE)JobInfo, size, &dNeedNum);
if (bResult == FALSE)
{
printf("Error = %d", GetLastError());
}
ZeroMemory(JobInfo->Path, sizeof(JobInfo->Path));
StringCbCopy(JobInfo->Path, sizeof(szFullPath), szFullPath);
bResult = ScheduleJob(hPrinter, JobInfo->JobId);
if (bResult == FALSE)
{
printf("Error = %d", GetLastError()); // <- Error Point 3002 Error
}
LocalFree(JobInfo);
ClosePrinter(hPrinter);
}

这不是对您的具体问题1,2和3的回答,但在您的评论中,您提到"我想要的是打印现有的文件或文档"。

在这种情况下,Win32 api只会打印GDI或XPS文档*,这意味着如果你想打印一个word文档,你需要先将其转换为XPS,或者使用word互操作来打印,word应用程序会将其转换为XPS或GDI并打印。

不幸的是,用于打印XPS文件的任何简单的Win32 api都已被弃用,并注意到在以后的windows版本中将被删除。

因此,打印XPS文档的剩余根是使用Print document API,不幸的是,要解释这一点并不容易。

https://learn.microsoft.com/en-us/windows/win32/printdocs/printdocs-printing

高层的前提是:

  1. 使用CreatePackageFromStream(…)打开文档作为xps包打印
  2. 使用CreateDocumentPackageTargetForPrintJob(…)为打印作业创建一个包目标。
  3. 使用GetPackageTarget(…)和GetXpsOMPackageWriter(…)获取用于打印文档的包目标和包编写器。
  4. 枚举xps包中的文档和页面,并将它们打印到您的包编写器。

我担心上面的步骤并没有真正公正地对待这些api的复杂性。

如果你需要传入设置,你需要:

  1. 获取打印机的默认开发模式
  2. 将devmode转换为该打印机的打印票据
  3. 更新打印票证中的设置
  4. 在相关的包编写器api中使用打印票。

作为一种选择,如果你可以使用一个单独的打印过程,你可以使用c# api,这是一个很多更简单,并获取一个文件的路径,并打印它与一个单一的调用。

https://learn.microsoft.com/en-us/dotnet/api/system.printing.printqueue.addjob?redirectedfrom=MSDN&视图=净- 5.0 #过载

*除非您使用直通api,使用特定的打印机驱动程序。

最新更新