- ベストアンサー
C++での印刷制御
C++でActiveXを作成し、印刷処理を行いたいと思っております。 印刷の際に紙切れ等のエラーが発生した場合にメッセージボックスを出したいのですがエラーを取得する方法が分かりません。 GetPrinter()でプリンタの状態を取得→エラー出力でいけるかなと思いやってみたのですが、OpenPrinter()でハンドルを取得しようとすると 0xC0000005: Access Violation のエラーが発生しハンドルすらまともに取得することが出来ません。 何か良い方法はないでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>OpenPrinter(prnName,&hPrn,&pdef); アクセス違反が起こるのはこの関数を呼び出した直後ですか? この関数のエラーチェックはされているのでしょうか? あとWindowsの構造体は初期化してから 渡すほうが良いです。 関数に渡した瞬間何に使われるか判りません。 例) memset( &pdef, 0, sizeof(pdef)); pdef.DesiredAccess = PRINTER_ALL_ACCESS;
その他の回答 (1)
- aris-wiz
- ベストアンサー率38% (96/252)
>0xC0000005: Access Violation のエラーが発生し 何をどの様にしたらという情報が抜けています。 単純にOpenPrinter関数の使い方を間違えているのでは ないのですか? 環境にもよるかもしれませんので、 環境を明確にしてください。
補足
【開発環境】 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
お礼
すいません。自己解決しました。 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); ↑に修正するとデータの取得が出来ました。 初期化が多分上手くいってなかったのかな・・・ ありがとうございました。
補足
エラーチェックの事はすっかり忘れてました・・・ 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); よろしくお願いします。