Crystal报告11 RDC(COM API)显示打印机对话框,即使我告诉它不要提示

时间:2011-02-07 14:17:21

标签: com printing crystal-reports crystal-reports-xi

我正在使用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);

然而,在所有这些结束时,水晶报告仍显示其自己的打印机选择对话框 - 但似乎只对某些报告。为什么即使我为promptUser传递false,水晶报告也会显示打印对话框?那么,如何抑制水晶报告的内部打印机选择对话框并强制它使用我的值?

编辑:哎呀,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)

2 个答案:

答案 0 :(得分: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,或者是一个完全独立的代码库。

答案 1 :(得分:0)

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