kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

CreateDCでACCESS_DENY

DEVNAMESとDEVMODE構造体を自前で作るとCreateDCでACCESS_DENY(GetLastError()が5)なのに、PrintDlg()で表示したプリンタダイアログからもらったPRINTDLG構造体の中のDEVMODE,DEVNAMESのハンドルを渡せばOK…という現象が手元でおこっている。
実際CreateDCやっているのは私じゃなくて、よそ様のライブラリなのだけれど…うーん、わからん。サーバ処理だから、PrintDlg()でUI出すのはできないのだけれど、フックして指定したプリンタを選択したことにしてしまうか…なぁ。ちなみにやっているのはこんな手順。

  • OpenPrinter()
  • EnumPrinters()でPRINTER_INFO_2を取得。
  • PRINTER_INFO_2からDEVNAMES,DEVMODE構造体の領域をGlobalAlloc/Lockで取得して、そのハンドルを渡す。