Vb6 从未从“打印”对话框传递的副本数,始终为1

Vb6 从未从“打印”对话框传递的副本数,始终为1,vb6,printing,Vb6,Printing,我们有一个VB6应用程序,它使用vbprndlg.dll库向用户显示打印选择对话框。最近,我们收到Windows Vista和7(32位和64位)用户的报告,指出无论他们在对话框的“副本数”框中输入什么,副本数始终保持为1。在XP Pro机器上运行完全相同的代码时,副本的数量会像应该的那样传递给报告对象 到目前为止,我已经使用公共对话框控件和vbprndlg.dll在Vista和7计算机上运行了测试,每次报告的副本数总是为1,无论我在框中键入数字还是使用箭头切换按钮增加副本数。其他属性-例如选择

我们有一个VB6应用程序,它使用
vbprndlg.dll
库向用户显示打印选择对话框。最近,我们收到Windows Vista和7(32位和64位)用户的报告,指出无论他们在对话框的“副本数”框中输入什么,副本数始终保持为1。在XP Pro机器上运行完全相同的代码时,副本的数量会像应该的那样传递给报告对象

到目前为止,我已经使用公共对话框控件和
vbprndlg.dll
在Vista和7计算机上运行了测试,每次报告的副本数总是为1,无论我在框中键入数字还是使用箭头切换按钮增加副本数。其他属性-例如选择了哪台打印机以及“起始”和“结束”页码报告是否正确

当我将副本数硬编码到Crystal Report对象(如下所示)时,会打印正确的副本数-因此,这似乎是对话框控件而不是Crystal Report对象的问题

下面是我正在使用的代码片段:

Dim PD As vbprndlglib.PrinterDlg
Set PD = New vbprndlglib.PrinterDlg
''//load default settings
PD.PrinterName = Printer.DeviceName
PD.DriverName = Printer.DriverName
PD.Port = Printer.Port
PD.PaperBin = Printer.PaperBin
PD.CancelError = True
PD.Min = 1
PD.Max = 32767
PD.flags = (vbprndlglib.cdlPDNoSelection Or vbprndlglib.cdlPDHidePrintToFile)
If PrintFlags And PrintDialogFlags.DisablePagesButton Then PD.flags = PD.flags Or
    vbprndlglib.cdlPDNoPageNums
    PD.ShowPrinter (hwnd)
    ''//cr is a reference to a CrystalReport object
    cr.PrinterPort = PD.Port
    cr.PrinterDriver = PD.DriverName
    cr.PrinterName = PD.PrinterName
    cr.CopiesToPrinter = PD.Copies ''//always 1 on Vista/7, correct # on XP
    If PD.flags And vbprndlglib.cdlPDPageNums Then
        cr.PrinterStartPage = PD.FromPage ''// these work fine
        cr.PrinterStopPage = PD.ToPage
    End If
    ''//... 
    cr.Action = 1 ''//prints report
End If

我似乎找不到任何关于VB6和WindowsVista/7中的打印对话框之间的已知兼容性问题的信息。我还可以尝试使用对话框控件吗

就在我提交这个问题时,答案突然出现在我面前

VBPrnDlg
控件的
Flags
属性更改为包含
vbprndlglib.cdlPDUseDevModeCopies
标志,修复了它,拷贝数再次起作用


希望这能帮助陷入类似问题的人

这对我有用。在Win7 32位上测试,WinXP不需要这个标志:D:D:D