印刷

[戻る]
SH 2008/04/08(火) 23:06:23
印刷について分からないので教えてください。

void CXXXDlg::OnBnClickedPrint()
{
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    CDC    PrinterDC;
    HDC printHDC;

    //印刷開始ダイアログ表示
    CPrintDialog dlg(FALSE);            
    if(dlg.DoModal()==IDOK){
        //印刷用HDCを得る
        printHDC = dlg.GetPrinterDC();        

        //印刷用HDCからCDCへ変換
        PrinterDC.Attach(printHDC);            

        DOCINFO    docinfo;
        //DOCINFOを用意
        docinfo.cbSize  = sizeof(docinfo);    
        docinfo.lpszDocName = NULL;
        docinfo.lpszOutput = NULL;
        docinfo.lpszDatatype = NULL;
        docinfo.fwType = 0;
        
        //印刷開始
        PrinterDC.StartDoc(&docinfo);            

        //ページ印刷開始
        PrinterDC.StartPage();                
    

        //印刷内容
        PrinterDC.TextOut(100, 100, "BHA");    

        //ページ印刷終了
        PrinterDC.EndPage();                
    

        //印刷終了
        PrinterDC.EndDoc();
                        
        PrinterDC.Detach();
        //HDC開放
        ::DeleteDC(printHDC);                
    
    }
}

というソースをコーディングしていますが、コンパイルは成功して実行すると
Windows によって VC_NETSample2.exe でブレークポイントが発生しました。

ヒープが壊れていることが原因として考えられます。VC_NETSample2.exe または読み込
まれた DLL にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

とエラーが出てしまいます。
どこがいけないのでしょうか?なにか解決策があったら教えてください。

SH 2008/04/08(火) 23:07:47
書き忘れていましたが、
windows XP,Visual Stadio2005 VC++で
プログラムしています。

よろしくお願いします。

Kerry 2008/04/09(水) 14:36:21
これが原因かどうかはわかりませんが、
DOCINFO構造体のlpszDocNameメンバにNULLは指定できません。

SH 2008/04/09(水) 16:19:00
Kerryさん

返信ありがとうございます。
ご指摘いただいた部分を
他のホームページを参考に
docinfo.cbSize  = sizeof(docinfo);    
        docinfo.lpszDocName = "";
        docinfo.lpszOutput = NULL;
        docinfo.lpszDatatype = NULL;
        docinfo.fwType = 0;

にしてみましたが、同じ結果になってしまいました。

ちなみに参考にしたのは
http://m--takahashi.com/bbs/pastlog/07500/07419.htmlです。

ITO 2008/04/11(金) 10:48:12
>   CPrintDialog dlg(FALSE);            
>   printHDC = dlg.GetPrinterDC();        
これってダイアログの場合も有効でしたっけ?
printHDCの値は大丈夫ですか?

ITO 2008/04/11(金) 10:51:13
VC6.0の場合は大丈夫みたいですね。
でも値は調べてみた方がいいと思います。

ITO 2008/04/11(金) 12:58:44
ん?
> 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
デバックモードで実行すれば何かわかるんじゃないかな?
デバッグ→開始 でいいはず。

SH 2008/04/11(金) 21:19:43
ITOさん

返信ありがとうございます。

>VC6.0の場合は大丈夫みたいですね。
>でも値は調べてみた方がいいと思います

デバックで見てみましたが、
Windows によって VC_NETSample2.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。VC_NETSample2.exe または読み込
まれた DLL にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。

というエラーが出るのは
malloc.cの
#ifdef _WIN64
    return HeapAlloc(_crtheap, 0, size ? size : 1);
#else  /* _WIN64 */
    if (__active_heap == __SYSTEM_HEAP) {
        return HeapAlloc(_crtheap, 0, size ? size : 1);
    } else
    if ( __active_heap == __V6_HEAP ) {
        if (pvReturn = V6_HeapAlloc(size)) {
            return pvReturn;
        }
    }

return HeapAlloc(_crtheap, 0, size ? size : 1);の部分でした。

このmalloc.cは自分で書いたものではなくPrinterDC.を使用した際に
定義されているものなので、
間違っていないと思うのですが・・・

VC6.0では正常に動作するんですよね?
VS2005 VC++では使用できないんですかね?

ITO 2008/04/11(金) 22:09:49
> このmalloc.cは自分で書いたものではなくPrinterDC.を使用した際に
> 定義されているものなので、
> 間違っていないと思うのですが・・・

>        //印刷用HDCを得る
>        printHDC = dlg.GetPrinterDC();        

>        //印刷用HDCからCDCへ変換
>         PrinterDC.Attach(printHDC);            
ここのどちらかがうまくいかないで PrinterDCが取得できて
いないということはありませんか。
PrinterDC、もしくはprintHDCの内容をデバッグモードで
見ることは出来ませんか?

SH 2008/04/12(土) 13:29:19
>        //印刷用HDCを得る
>        printHDC = dlg.GetPrinterDC();        

>        //印刷用HDCからCDCへ変換
>         PrinterDC.Attach(printHDC);            
>ここのどちらかがうまくいかないで PrinterDCが取得できて
>いないということはありませんか

ここの部分はデバックモードでも通ります。

 //印刷開始
        PrinterDC.StartDoc(&docinfo); 
を通った後にmalloc.cに飛んで
return HeapAlloc(_crtheap, 0, size ? size : 1);の部分で
Windows によって VC_NETSample2.exe でブレークポイントが発生しました。
ヒープが壊れていることが原因として考えられます。VC_NETSample2.exe または読み込
まれた DLL にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
と出てしまいます。

ITO 2008/04/12(土) 13:42:55
PrinterDCが正しく取得できていない可能性はないですか?

http://www.kumei.ne.jp/c_lang/sdk/sdk_77.htm
を参考にしてみてください。

古いスレッドには追加発言できません。