0

我正在使用 Crystal Reports 11 的 RDC (COM) API 进行打印。我的代码如下所示:

HRESULT res = m_Report->SelectPrinter(b_driver, b_device, b_port);
if (FAILED(res)) return res;
// For these calls, the #import wrapper throws on error
m_Report->PutPrinterDuplex(dmDuplex);
m_Report->PutPaperSize(dmPaperSize);
m_Report->PutPaperSource((CRPaperSource)pdlg->GetDevMode()->dmDefaultSource);
if (m_Report->GetPaperOrientation() == crDefaultPaperOrientation)
    m_Report->PutPaperOrientation(crPortrait);

VARIANT vfalse;
VariantInit(&vfalse);
vfalse.vt=VT_BOOL;
vfalse.boolVal=0;

res = m_Report->PrintOut(vfalse);

然而,在这一切结束时,水晶报表仍然显示它自己的打印机选择对话框——但似乎只适用于某些报表。为什么即使我通过 false for 水晶报表也会显示打印对话框promptUser?那么,如何抑制水晶报表的内部打印机选择对话框并强制它使用我的值?

编辑:哎呀,CR11,不是CR9。

一些进一步的信息:

  • 正常工作的报告(即不显示打印对话框)是使用 RDC API 在内部生成的;我们创建一个新的报表对象,将子报表导入其中,然后打印结果。那里没问题。
  • 不能正常工作的报告(即强制打开打印对话框)是用以前版本的水晶报告创建的;但是,打开和保存报告似乎没有帮助。
  • Crystal Reports 安装目录中的示例报表显示了同样的问题。

我尝试使用 VBScript 进行复制;然而,结果是什么都没有打印(没有对话框,什么也没有):

Set app = CreateObject("CrystalRuntime.Application.11")
Set report = app.OpenReport("C:\Program Files\Business Objects\Crystal Reports 11.5\Samples\en\Reports\General Business\Inventory Crosstab.rpt")
report.PrintOut(True)
rem Testing with a True parameter to force a print dialog - but no printout and nothing appears (no error either though)
4

2 回答 2

0

首先,让我先声明一下,我不是 C/C++ 程序员,所以我无法测试代码——多年来,我与 SDK 的交互一直与 VB 和 .Net 接口进行交互。

我从 BO 的devlibrary中找到了以下代码:

// A dummy variant
VariantInit (&dummy);
dummy.vt = VT_EMPTY;
HRESULT       hr = S_OK;
// Specify the path to the report you want to print                                    
_bstr_t ReportPath("c:\\Program Files\\Business Objects\\Crystal Reports 11.5\\Samples\\En\\Reports\\General Business\\Inventory.rpt");
_variant_t vtEmpty(DISP_E_PARAMNOTFOUND, VT_ERROR);
// Instantiate the IApplication object
m_Application.CreateInstance("CrystalRuntime.Application.115");
//Open the Report using the OpenReport method
m_Report = m_Application->OpenReport(ReportPath, dummy)
//Print the Report to printer
m_Report->PrintOut(dummy, dummy, dummy, dummy);

它有效吗?它应该使用其“默认”打印机设置打印报告,并且没有提示。

你写了:

然而,在这一切结束时,水晶报表仍然显示它自己的打印机选择对话框——但似乎只适用于某些报表。

一般来说,我发现如果 Crystal 认为缺少某些内容,它往往会忽略抑制对话框的命令。我发现参数对话框确实如此。也许它也适用于这种情况。我会问导致生成对话框的报告有什么不同。可以设置“无打印机”选项。或许这就是共同的主线。

您可以访问 VB6 IDE 吗?如果使用VB6的界面编写等效命令,是否会出现提示?

您还可以调查使用 CRPE32.dll 而不是报表设计器控件。老实说,我不知道 RDC 是封装了 CRPE DLL 还是完全独立的代码库。

于 2011-02-13T15:27:51.663 回答
0

事实证明,这毕竟是我代码中的一个错误——我之前为 RDC API 放入了一个包装器,以修复我们遇到的某些其他错误;由于 IReport 接口中有大量方法,我编写了一个脚本来为我不感兴趣的方法生成传递存根。结果发现该脚本为具有默认值的参数传递了虚假值。哎呀!修复包装代码修复了这里的错误。

于 2011-02-20T14:10:59.630 回答