ローカルに定義されているプリンタの情報を参照するために、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