• ベストアンサー

C++での印刷制御

C++でActiveXを作成し、印刷処理を行いたいと思っております。 印刷の際に紙切れ等のエラーが発生した場合にメッセージボックスを出したいのですがエラーを取得する方法が分かりません。 GetPrinter()でプリンタの状態を取得→エラー出力でいけるかなと思いやってみたのですが、OpenPrinter()でハンドルを取得しようとすると 0xC0000005: Access Violation のエラーが発生しハンドルすらまともに取得することが出来ません。 何か良い方法はないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.2

>OpenPrinter(prnName,&hPrn,&pdef); アクセス違反が起こるのはこの関数を呼び出した直後ですか? この関数のエラーチェックはされているのでしょうか? あとWindowsの構造体は初期化してから 渡すほうが良いです。 関数に渡した瞬間何に使われるか判りません。 例) memset( &pdef, 0, sizeof(pdef)); pdef.DesiredAccess = PRINTER_ALL_ACCESS;

exiter
質問者

お礼

すいません。自己解決しました。 DWORD dwNeeded, dwSize; PRINTER_INFO_2 pprn_info; memset( &pprn_info, 0, sizeof(pprn_info)); GetPrinter(hPrn,2,0,0,&dwNeeded); dwSize = dwNeeded; GetPrinter(hPrn,2,(LPBYTE)&pprn_info,dwSize,&dwNeeded); ↑に修正するとデータの取得が出来ました。 初期化が多分上手くいってなかったのかな・・・ ありがとうございました。

exiter
質問者

補足

エラーチェックの事はすっかり忘れてました・・・ aris-wizさんの助言どおり memset( &pdef, 0, sizeof(pdef)); で構造体の初期化を行ったら無事にハンドルの取得が出来ました。 あともう一つ質問なのですが GetPrinter()を行いたいのですが出来ません。 エラーは「要求された操作に対して与えられたバッファが無効です」 と返ってきます。 以下ソースです。 DWORD dwNeeded, dwSize; PRINTER_INFO_2 *pprn_info; memset( &pprn_info, 0, sizeof(pprn_info)); GetPrinter(hPrn,2,0,0,&dwNeeded); dwSize = dwNeeded; GetPrinter(hPrn,2,(LPBYTE)pprn_info,dwSize,&dwNeeded); よろしくお願いします。

その他の回答 (1)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

>0xC0000005: Access Violation のエラーが発生し 何をどの様にしたらという情報が抜けています。 単純にOpenPrinter関数の使い方を間違えているのでは ないのですか? 環境にもよるかもしれませんので、 環境を明確にしてください。

exiter
質問者

補足

【開発環境】 OS:WindowsXP SP2 開発言語:Visual C++ 6.0 こんな感じですかね・・・? 一緒にOpenPrinterのソースも書いておきます HANDLE hPrn; PRINTER_DEFAULTS pdef; char prnName[] = "プリンタ名"; pdef.DesiredAccess = PRINTER_ALL_ACCESS; OpenPrinter(prnName,&hPrn,&pdef); こんな感じです。何が間違いがあれば指摘お願いしますm__m

関連するQ&A