PRINTER_DEFAULTSも、プリンタの設定の一つだが、特に気になるのはアクセス属性。
PRINTER_DEFAULTS structure (Winspool.h) - Win32 apps | Microsoft Docs
前回、設定変更で、pd.DesiredAccessをPRINTER_ALL_ACCESSにしたけど、常にそれでいいのではとおもうかもしれない。
しかし、
ここでは、PRINTER_ALL_ACCESSで失敗する例を示している。
// 取得したIDごとに処理を分岐. // Printが選択された時. case ID_ITEM_PRINT: // ID_ITEM_PRINTブロック { // 変数の宣言と初期化. PAGESETUPDLG psd = {0}; // PAGESETUPDLG構造体psdを0で初期化. DEVMODE *pDevMode = NULL; // DEVMODE構造体ポインタpDevModeをNULLで初期化. PRINTER_DEFAULTS pd = {0}; // PRINTER_DEFAULTS構造体pdを{0}で初期化. BOOL bRet = FALSE; // BOOL型bRetをFALSEで初期化. HANDLE hPrinter = NULL; // HANDLE型hPrinterをNULLで初期化. // psdの初期設定 psd.lStructSize = sizeof(PAGESETUPDLG); // sizeofでPAGESETUPDLG構造体のサイズを指定. psd.hwndOwner = hwnd; // hwndを指定. psd.Flags = PSD_INHUNDREDTHSOFMILLIMETERS; // ミリ単位に設定. // PageSetupDlgの表示. bRet = PageSetupDlg(&psd); // PageSetupDlgにpsdを渡して表示し, 戻り値をbRetに格納. if (bRet){ // TRUEの時. pDevMode = (DEVMODE *)GlobalLock(psd.hDevMode); // psd.hDevModeをロック. if (pDevMode != NULL){ // pDevModeがNULLでない時. pd.DesiredAccess = PRINTER_ALL_ACCESS; // 全ての権限. bRet = OpenPrinter(pDevMode->dmDeviceName, &hPrinter, &pd); // OpenPrinterでプリンタを開く. if (bRet){ // TRUE. MessageBox(hwnd, _T("OpenPrinter OK!"), _T("PRINTER_DEFAULTS"), MB_OK); // "OpenPrinter OK!"と表示. ClosePrinter(hPrinter); // ClosePrinterで閉じる. } else{ // FALSE. MessageBox(hwnd, _T("OpenPrinter NG!"), _T("PRINTER_DEFAULTS"), MB_OK); // "OpenPrinter NG!"と表示. } GlobalUnlock(psd.hDevMode); // アンロック. } } } // 既定の処理へ向かう. break; // breakで抜けて, 既定の処理(DefWindowProc)へ向かう.
NGになる。
PageSetupDlgの選択結果が、読み取り専用だからPRINTER_ALL_ACCESSはダメなのかな。(個人の感想)
PRINTER_ACCESS_USEにすると、
OKになる。
ただ、Windows10だと、PRINTER_ALL_ACCESSでもOKになる。
(7はFaxとXPS Document Writerのみ、10は実機プリンタありなので、それもあるかな・・・。)