何となく Blog by Jitta
Microsoft .NET 考

目次

Blog 利用状況
  • 投稿数 - 761
  • 記事 - 18
  • コメント - 37042
  • トラックバック - 222
ニュース
  • IE7以前では、表示がおかしい。div の解釈に問題があるようだ。
    IE8の場合は、「互換」表示を OFF にしてください。
  • 検索エンジンで来られた方へ:
    お望みの情報は見つかりましたか? よろしければ、コメント欄にどのような情報を探していたのか、ご記入ください。
It's ME!
  • はなおか じった
  • 世界遺産の近くに住んでます。
  • Microsoft MVP for Visual Developer ASP/ASP.NET 10, 2004 - 9, 2011
広告

記事カテゴリ

書庫

日記カテゴリ

ギャラリ

その他

わんくま同盟

同郷

 

ローカルに定義されているプリンタの情報を参照するために、OpenPrinter, GetPrinter という Platform API 関数が用意されています。GetPrinter の第3引数は、呼び出し側で確保しておいた領域へのアドレスを指定します。

この領域は、第2引数で指定した数値によって、PRINTER_INFO_1~9 のうち、どれかになります。この、PRINTER_INFO_? 構造体についてです。

使い方の例は、「Windows の通常使うプリンタを取得および設定する方法」などにあります。この中で、こんな風に使っています。


BOOL DPGetDefaultPrinter(LPTSTR pPrinterName, LPDWORD pdwBufferSize)
{
(snip)
    bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL
        , 2, NULL, 0, &dwNeeded, &dwReturned);
    {
      if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
        return FALSE;
    }
    
    // Allocate enough space for PRINTER_INFO_2.
    ppi2 = (PRINTER_INFO_2 *)GlobalAlloc(GPTR, dwNeeded);   // 注目
    if (!ppi2)
      return FALSE;
    
    // The second EnumPrinters() will fill in all the current information.
    bFlag = EnumPrinters(PRINTER_ENUM_DEFAULT
        , NULL, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned);
    if (!bFlag)
    {
      GlobalFree(ppi2);     // 注目
      return FALSE;
    }
(snip)
}

このように、領域はリニアに確保しています。ここで、PRINTER_INFO_2 構造体の定義を見てみます。「PRINTER_INFO_2


typedef struct _PRINTER_INFO_2 {
  LPTSTR    pServerName;
  LPTSTR    pPrinterName;
  LPTSTR    pShareName;
  LPTSTR    pPortName;
  LPTSTR    pDriverName;
  LPTSTR    pComment;
  LPTSTR    pLocation;
  LPDEVMODE pDevMode;
  LPTSTR    pSepFile;
  LPTSTR    pPrintProcessor;
  LPTSTR    pDatatype;
  LPTSTR    pParameters;
  PSECURITY_DESCRIPTOR pSecurityDescriptor;
  DWORD     Attributes;
  DWORD     Priority;
  DWORD     DefaultPriority;
  DWORD     StartTime;
  DWORD     UntilTime;
  DWORD     Status;
  DWORD     cJobs;
  DWORD     AveragePPM;
} PRINTER_INFO_2, *PPRINTER_INFO_2; 

このように、大量のポインタが定義されています。いったい、pServerName などはどこにあるんだろう?アドレスからは、ヒープに確保されているみたいなんだけど、解放しなくていいのだろうか?

投稿日時 : 2007年10月16日 22:22
コメント
タイトル
名前
Url
コメント