印刷について分からないので教えてください。
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 にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
とエラーが出てしまいます。
どこがいけないのでしょうか?なにか解決策があったら教えてください。
書き忘れていましたが、
windows XP,Visual Stadio2005 VC++で
プログラムしています。
よろしくお願いします。
これが原因かどうかはわかりませんが、
DOCINFO構造体のlpszDocNameメンバにNULLは指定できません。
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です。
> CPrintDialog dlg(FALSE);
> printHDC = dlg.GetPrinterDC();
これってダイアログの場合も有効でしたっけ?
printHDCの値は大丈夫ですか?
VC6.0の場合は大丈夫みたいですね。
でも値は調べてみた方がいいと思います。
ん?
> 可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
デバックモードで実行すれば何かわかるんじゃないかな?
デバッグ→開始 でいいはず。
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++では使用できないんですかね?
> このmalloc.cは自分で書いたものではなくPrinterDC.を使用した際に
> 定義されているものなので、
> 間違っていないと思うのですが・・・
> //印刷用HDCを得る
> printHDC = dlg.GetPrinterDC();
> //印刷用HDCからCDCへ変換
> PrinterDC.Attach(printHDC);
ここのどちらかがうまくいかないで PrinterDCが取得できて
いないということはありませんか。
PrinterDC、もしくはprintHDCの内容をデバッグモードで
見ることは出来ませんか?
> //印刷用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 にバグがあります。
可能であれば、出力ウィンドウに詳細な診断情報が表示されます。
と出てしまいます。