印刷 – プログラミング – Home

通知
すべてクリア

印刷


SH
 SH
(@SH)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

印刷について分からないので教えてください。

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
 SH
(@SH)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

書き忘れていましたが、
windows XP,Visual Stadio2005 VC++で
プログラムしています。

よろしくお願いします。


返信引用
Kerry
 Kerry
(@Kerry)
ゲスト
結合: 20年前
投稿: 192
 

これが原因かどうかはわかりませんが、
DOCINFO構造体のlpszDocNameメンバにNULLは指定できません。


返信引用
SH
 SH
(@SH)
ゲスト
結合: 18年前
投稿: 17
 

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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

> CPrintDialog dlg(FALSE);
> printHDC = dlg.GetPrinterDC();
これってダイアログの場合も有効でしたっけ?
printHDCの値は大丈夫ですか?


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
ITO
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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


返信引用
SH
 SH
(@SH)
ゲスト
結合: 18年前
投稿: 17
Topic starter  

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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

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

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

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


返信引用
SH
 SH
(@SH)
ゲスト
結合: 18年前
投稿: 17
 

> //印刷用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
 ITO
(@ITO)
ゲスト
結合: 22年前
投稿: 1235
 

PrinterDCが正しく取得できていない可能性はないですか?

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました