crpe32.dll を使用した Crystal Reports の印刷に問題があります (何らかの理由で、CrystalDecisions.CrystalReports.Engine の ReportDocument クラスを使用できませんでした)。パラメータなしでレポートを印刷しようとすると、エラーは発生しません。インポートされた dll のメソッドを使用するだけで十分です:
- PEOpenEngine
- PEOpenPrintJob
- PEOutputToPrinter
- PEStartPrintJob
- PEClosePrintJob
- PECloseEngine
しかし、PEGetNthParameterField や PEAddParameterCurrentValue など、構造体を渡さなければならないメソッドに問題があります。結果としてまだ「false」になり、構造は変更されません。
private static void PrintTest()
{
int o1 = PEOpenEngine();
if (o1 == 0)
{
return;
}
int o2 = PEOpenPrintJob("someReport.rpt");
short paramCounts = PEGetNParameterFields(o2); // I've got here 4 in one of my real reports
PEParameterFieldInfo paramInfo = new PEParameterFieldInfo();
paramInfo.StructSize = 316;
bool isParamCorrect = PEGetNthParameterField(o2, 0, ref paramInfo); // false :( and unchanged paramInfo
int o3 = PEOutputToPrinter(o2, 1);
int o4 = PEStartPrintJob(o2, true);
int o5 = PEClosePrintJob(o2);
int oLast = PECloseEngine();
}
[DllImport("crpe32.dll")]
static extern short PEGetNParameterFields(int PrintJob);
[DllImport("crpe32.dll")]
static extern bool PEGetNthParameterField(int PrintJob, int parameterN, ref PEParameterFieldInfo parameterInfo);
そして、おそらく私の問題の原因となるもの - PEParameterFieldInfo 構造
public struct PEParameterFieldInfo
{
public int StructSize;
public int ValueType;
public int DefaultValueSet;
public int CurrentValueSet;
public string Name;
public string Prompt;
public string DefaultValue;
public string CurrentValue;
public string ReportName;
public int needsCurrentValue;
public int isLimited;
public double MinSize;
public double MaxSize;
public string EditMask;
public int isHidden;
}
ここで何が間違っているのか分かりますか?