1

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;
    }

ここで何が間違っているのか分かりますか?

4

1 に答える 1

0

これは私が使用する構造体の宣言の例ですが、エラーの原因でしょうか?

    private struct PESubreportInfo
    {
        public short StructSize;
        [MarshalAs(UnmanagedType.ByValArray, SizeConst = PE_SUBREPORT_NAME_LEN)]
        public char[] Name;       
    }
于 2013-04-18T13:13:27.167 に答える