1

最近、MFC 印刷コードで問題が発生しています。この問題を大まかに説明すると、同じドキュメントを 2 回印刷しようとすると問題が発生します。(実際には、同じドキュメントである必要はありません。2 つのドキュメントが印刷され、子ウィンドウが破棄されず、その間に作成されていない場合に発生するようです。) 初めて、ドキュメントは正常に印刷されます。2 回目は、キャッチされない例外でプログラムがクラッシュします。

これも、最近のアップグレード後にのみ発生し始めました。これは私が文字通り一度も触れたことのないコードです。VS2005 と MFC8 を使用していたバージョン 5 では問題なく動作しました。しかし、VS2008 と MFC9 にアップグレードすると、この問題が発生し始めました。

問題のコードは次のとおりです。

void CReportWnd::OnPrint() 
{
    CDC dc;
    CPrintDialog dlg (FALSE);
    CPrintDialog defaults(FALSE);
    DEVMODE *ldev_printinfo;
    int li_first = 0;
    int li_last;


    int ret = defaults.GetDefaults();
    ldev_printinfo = defaults.GetDevMode();
    //ldev_printinfo->dmOrientation = DMORIENT_LANDSCAPE;
    dc.Attach (defaults.GetPrinterDC ());
    dc.ResetDC(ldev_printinfo);

    PROPrint(1, NULL, &dc, NULL, &li_last, true);

    dlg.m_pd.hDevMode = ldev_printinfo;
    dlg.m_pd.Flags &= ~PD_NOPAGENUMS;
    dlg.m_pd.nMinPage = 1;
    dlg.m_pd.nFromPage = 1;
    dlg.m_pd.nMaxPage = li_last;
    dlg.m_pd.nToPage = li_last;     

    if (dlg.DoModal () == IDOK) {
        dc.DeleteDC();
        dc.Detach();
        dc.Attach (dlg.GetPrinterDC ());        
    } else {
        return;
    }

    //Set up document info (need to set the name)
    DOCINFO di;
    ::ZeroMemory (&di, sizeof (DOCINFO));
    di.cbSize = sizeof (DOCINFO);
    di.lpszDocName = "Report";

    if(dc.StartDoc(&di) <= 0) {
        return;
    }


    if(dlg.PrintRange()) {
        li_first = dlg.m_pd.nFromPage - 1;
        li_last = dlg.m_pd.nToPage - 1;
    }

    //Now do the actual print job to the printing device
    PROPrint(1, NULL, &dc, &li_first, &li_last, false);
}

上部近くの int ret = ... 行で、例外がスローされます。GetDefaults() は、アクセス違反の例外をスローします。ただし、この関数が呼び出されるのは 2 回目だけです。ある種のリソースの問題のように思えます。リソースが解放されず、適切に割り当てられていないようです。しかし、私は印刷に慣れていないので、何でもかまいません。

誰かが何らかの助けを提供できれば、本当に感謝しています。

また、はい、例外をキャッチできることも知っています。私の問題は、例外を処理してドキュメントを印刷するにはどうすればよいですか?

編集:この特定のコードセットだけでなく、プログラムが複数の場所でこの問題を抱えているようです。問題は特にこのコードにあるのではないのではないかと思います。私は現在それに取り組んでおり、それを修正する必要があるので、解決策を見つけたら、必ず返信します. それまでは、いつでも提案をお待ちしています。

4

1 に答える 1

0

確かではありませんが、コードが既定のプリンターに関連付けられている既定のデバイス コンテキストを削除している可能性がありますか? dc.DeleteDC()次の行を削除してみてください。

if (dlg.DoModal() == IDOK) 
{
   dc.Detach();
   dc.Attach(dlg.GetPrinterDC());        
} 
else
   return;
于 2012-09-12T08:16:36.813 に答える