0

我有一个 dll,其中有打印单元。

在我的应用程序中,我导出了开始、结束打印过程以及打印文档的方法。

对 dll 的调用如下:

1-> begin printing and print document
2-> print document
3-> end printing.

我在每个打印页面(托盘、方向等)之前更改设置当我再次调用 (2) 并尝试更改打印机设置时,步骤 1 成功完成,方法:用于开发模式结构的 ResetDc 返回 false ...

问题是当我在 1 次调用后回到应用程序中时,应用程序打印机单元更改了某些内容,从而阻止了 dll 中的后续调用?

如何解决问题?

编辑

这是设置页面设​​置的功能。当进行 1 次调用时(来自上面的列表)ResetDC 成功执行,但在下一次调用中 ResetDC 返回 false。为什么 ... ?

function PRPageSetup(paperSize: Integer = DMPAPER_A4): Boolean;
var
  pDevice: pChar;
  pDriver: pChar;
  pPort: pChar;
  hDMode: THandle;
  PDMode: PDEVMODE;
  PrnHandle: THandle;

begin
  result := false;
  GetMem(pDevice, cchDeviceName);
  GetMem(pDriver, MAX_PATH);
  GetMem(pPort, MAX_PATH);

  Printer.GetPrinter(pDevice, pDriver, pPort, hDMode);

  if hDMode <> 0 then
  begin
    pDMode := GlobalLock(hDMode);
    if pDMode <> nil then
    begin                 
         pDMode^.dmFields := pDMode^.dmFields or DM_PAPERSIZE or DM_ORIENTATION;
         pDMode^.dmPaperSize := paperSize;        

      if Printer.Printing then
        PrnHandle := printer.Canvas.Handle
       else
        PrnHandle := Printer.Handle;

      if ResetDc(PrnHandle, pDMode^) <> 0
        then PRCanReset := true
        else PRCanReset := false;

      Result := true;
      GlobalUnlock(hDMode);
    end;
  end;
  FreeMem(pDevice, cchDeviceName);
  FreeMem(pDriver, MAX_PATH);
  FreeMem(pPort, MAX_PATH);
end;
4

1 回答 1

0

我终于设法解决了这个问题。

我发现当 TMetaFileCanvases 仍在内存中时,我无法设置页面。我需要先释放它们,然后重新配置页面。

感谢大家的努力和时间。

于 2012-10-13T19:50:50.297 回答