高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


Technote 1097

Desktop Printing Revealed


目次

初代のバックグラウンド印刷機能

デスクトップ・プリンタの現在

デスクトップ・プリンタの明日

未来はすぐそこにある

DesktopPrinting.h

DTPSample.c

のテクニカルノートは1997年2月に発行され、プリンタドライバ開発者がデスクトップ・プリンタ機能に対応するための情報が記述されていました。Mac OS 8.5ではサードパーティ製のデスクトップ・プリンタが初めてサポートされますが、若干の仕様変更もございます。デスクトップ・プリンタ機能に対応したプリンタ・ドライバを開発する際はこのテックノートの最新情報をご利用下さい。

1989年、System 6とMultiFinderの登場で、バックグラウンド印刷が可能となりました。当初、書類を印刷した直後にMacintoshのコントロールを回復でき、同時にプリンタドライバがバックグラウンドで印刷処理をする程度だと考えられていましたが、初代のバックグラウンド印刷機能は誰もが想像したよりもはるかに強力であり、デスクトップ・プリンタを含めて、現在の印刷テクノロジー全般にわたる基礎になっています。しかし、デスクトップ・プリンタのサポートに関心を持つデベロッパにとっては残念なことですが、バックグラウンド印刷技術の大部分がマニュアル化されていないのが現状です。

1994年、StyleWriter 1200ドライバおよびLaserWriter 8.3の登場とともに、デスクトップ・プリンタ技術が導入されました。初期リリースから現在まで、デスクトップ・プリンタは複数の機能拡張と不可視属性をもつアプリケーションの集合として存在してきました。これまで、デスクトップ・プリンタのサポートに関心を持つデベロッパにとって、デスクトップ・プリンタのイメージは必ずしも明確かつシンプルなものではありませんでしたが、このテクノロジーが将来的にも拡張されていく兆候が見えてきた現在、その技術を理解することは以前にもまして重要な問題になりつつあります。

この問題について完全なストーリーを描いて見せることはもとより不可能ですし、Mac OS Xの導入とともに状況が再度変更されることも確実ですが、このテックノートでは、Mac OS X以前のすべてのMac OSのバージョンに対応したバックグラウンド印刷を対象にしています。この中には、サードパーティのデベロッパがデスクトップ・プリンタを利用できるようにするための重要な変更事項も含まれています。プリンタドライバをすでに開発している場合は、このテックノートで説明されている、デスクトップ・プリンタのサポートを追加するために必要な事項を参照してください。



初代のバックグラウンド印刷機能
初代のバックグラウンド印刷機能は次のようなものでした。プリンタドライバは、対象となる各ページをQuickDrawピクチャとして、システムフォルダ内の特殊なフォルダ(「Spool」フォルダ)に作成されたテンポラリファイル(スプールファイル)のデータフォークに保存していました。また、このファイルのリソースフォークに格納される情報もありました。この情報は、ページフォーマット、書類名、その他のジョブ情報、および各ページのデータの先頭へのオフセットを記述していました。システム起動時にMultiFinderによって起動される特殊なアプリケーション(Backgrounder)は、プリンタドライバによって作成される書類を監視し、必要に応じてプリントモニタを起動していました(Backgrounderはその後、System 7でFinderに統合されました)。プリントモニタはバックグラウンドで実行され、スプールファイルをプリンタドライバに供給する機能を果たしていました。

プリントモニタは、通常のアプリケーションとほぼ同じ方法でプリンタドライバを呼び出すことによって、その威力を発揮します。ただし、ドライバの'PDEF' 0リソースではなく、'PDEF' 126リソース('PDEF' 0リソースと同じフォーマットを持つ)が呼び出される点が異なります。PrOpenが呼び出された直後に(PrOpenDocが呼び出される前に)、特殊なPrGeneralコードが送信され、その後、呼び出す必要のある通知関数へのポインタがプリンタドライバに送られます。この後、プリントモニタでは、格納されているページデータをドライバに送信して、各ページを印刷します。こうしたバックグラウンド印刷機能は、次のような2つのケースでは、現在でもプリントマネージャによって使用されています。つまり、デスクトップ・プリンタがインストールされていないとき(または使用停止になっているとき)と、Finderが実行していないとき(Finderの代わりにAt Easeが実行している場合など)です。

初代のバックグラウンド印刷機能を理解するためには、そのスプールファイルの構造を知る必要があります。スプールファイルのリソースフォークには次のリソースが含まれています(このテックノートで言及する構造体はすべて68Kアラインメントを持ちます)。

'PREC' 3 - プリントレコード
'alis' -8192 - スプールファイルを作成したプリンタドライバのエイリアス
'ics#' 131 - プリントモニタに表示されるスプールファイルのアイコン(小)
'PREC' 124 - プリンタ名
'PREC' 126 - ジョブ情報

typedef {
	short   version;        // 常に1
	short   flags;          // 常に0
	short   numPages;       // スプールファイルのページ数
	short   numCopies;      // スプールファイルの部数
	OSType  creator;        // スプールファイルを作成した
	                        // プリンタドライバのクリエータタイプ
	Str31   appName;        // スプールファイルを作成した
	                        // アプリケーションの名前
} PREC126Record, *PREC126Ptr, **PREC126Handle;


'STR ' -8192 − プリンタドライバのファイル名
'STR ' -8189 − 書類名 (ブランクを埋め込み、常に 80 バイトの文字列にします)

スプールファイルのデータフォークはSpoolFileHeader構造体で始まり、その後にページが続きます。

typedef struct {
	short   version;	// 常に1
	long    fileLen;	// ヘッダを含むファイルのサイズ
	long    fileFlags;	// 常に0
	short   numPages;	// スプールファイルのページ数
	TPrint  printRecord;	// PREC 3を読み込めない場合のみ使用
} SpoolFileHeader, *SpoolFileHeaderPtr, **SpoolFileHeaderHandle;

typedef struct {
	long    pictFlags;	// 常に0
	Picture thePict;	// 可変長
	long    pageOffset;	// このページのPICTの先頭への
				// オフセット
} SpoolPage;


スプールファイルは、ドライバによって、システムフォルダ内の「Spool」フォルダまたは「プリントモニタ書類」フォルダの中に作成されます。(Mac OS 8のデスクトップ・プリンタがアクティブな場合は、現在の省略時デスクトップ・プリンタフォルダの中に作成されます。FindFolderkPrintMonitorDocsFolderTypeセレクタを使用すると、正しいフォルダを検出することができます。)書き込まれるスプールファイルは、'?job'というファイルタイプと'prmt'というクリエータタイプを持ちます。ファイルの書き込みが終了すると、ドライバはファイルタイプを'pjob'に変更します。サードパーティ製のドライバもサポートされている場合は、サードパーティ製のドライバはAppleイベントをFinderに送信して、新しいスプールファイルが作成されたことを通知する必要があります(詳細については後述します)。

プリントモニタ(またはデスクトップ・プリントモニタ)がジョブをプリントするとき、ドライバのPrOpenルーチンが呼び出され、さらに以下に示す構造体(、DesktopPrinting.hヘッダファイルを参照)を含むPrGeneralが呼び出されます。この後、プリントモニタでは、ドライバが定期的に呼び出す必要のあるpIdleProcを含むPrOpenDocを呼び出します。PrOpenPagePrClosePageは書類の各ページごとに呼び出され、その結果、そのページがドライバにプリントされることになります。

// 関数のプロトタイプ
typedef pascal void    (*DTPAsyncErrorNotificationProcPtr) (StringHandle string);
typedef pascal void    (*DTPEndNotificationProcPtr) ();
typedef pascal Boolean (*DTPInForegroundProcPtr) ();
typedef pascal void    (*DTPStatusMessageProcPtr) (StringHandle string);

// プリントモニタ及びデスクトップ・プリントモニタが通知のために
// 使用するPrGeneralコード
#define kPrintMonitorPrGeneral -3

// TPrintMonitorPrintingData
// クラシックバックグラウンド印刷とサードパーティ製のデスクトップ・プリンタを
// サポートしない場合に使用される
typedef struct {
	short	                     iOpCode;                // kPrintMonitorPrGeneral
	short	                     iError;
	long	                     iReserved;              // 0 = プリントモニタ
	THPrint	                     hPrint;
	short	                     noProcs;                // 通知関数の数
	long	                     iReserved2;
	DTPAsyncErrorNotificationUPP pAsyncNotificationProc; // 通知を開始させるUPP
	DTPEndNotificationUPP        pAsyncEndnotifyProc;    // 通知を終了させるUPP
	DTPInForegroundUPP           pDTPInForegroundProc;   // プリントモニタが
	                                                     // 全面にあるかどうかの確認
} TPrintMonitorPrintingData;

// TDesktopPrintMonitorPrintingData
// サードパーティ製のデスクトップ・プリンタをサポートしている場合に使用される
typedef struct {
	short	                     iOpCode;                // kPrintMonitorPrGeneral
	short	                     iError;
	long	                     iReserved;              // 1 = デスクトップ・プリントモニタ
	THPrint	                     hPrint;
	short	                     noProcs;                // 通知関数の数
	long	                     iReserved2;
	DTPAsyncErrorNotificationUPP pAsyncNotificationProc; // 通知を開始させるUPP
	DTPEndNotificationUPP        pAsyncEndnotifyProc;    // 通知を終了させるUPP
	DTPInForegroundUPP           pInForegroundProc;      // プリントモニタが
	                                                     // 全面にあるかどうかの確認
	DTPStatusMessageUPP          pStatusMessageProc;     // デスクトップ・プリンタ
	                                                     // ウインドウの状況を更新する
} TDesktopPrintMonitorPrintingData;


バックグラウンド印刷機能を使って印刷する場合、プリントモニタとデスクトップ・プリントモニタは、PrOpenDocを呼び出す直前にDialogPtrをローメモリのグローバル変数(ApplScratch)に格納します。ドライバでは、GetDialogItemSetDialogItemTextを使って、そのダイアログの先頭項目に中に状況メッセージを格納する必要があります。

PrGeneral呼び出しにより、印刷がデスクトップ・プリントモニタ(インタフェースを持たないバックグラウンドアプリケーション)から実行されていることが明らかな場合は、ダイアログまたはアラートを表示してはいけません。ただし例外は、デスクトップ・プリントモニタがStopAlertParamTextにパッチを当てていることです。ParamTextを呼び出し、さらにStopAlertを呼び出すと、Finderは設定されたテキストを含むアラートを表示します。ただし、StopAlertに渡されたフィルタ関数は呼び出されません。

プリンタドライバはユーザによるジョブの一時停止、印刷キューの停止、もう一度印刷をする、ジョブのキャンセルのオプションを提供することができます。ユーザがアラートでオプションを選んだ後、プリンタドライバはプリントマネージャのエラーコード(SetPrError)を以下のいずれかの値に設定します。

// デスクトップ・プリンタのエラーコード

#define    kDTPHoldJobErr        -4200
#define    kDTPStopQueueErr      -4201
#define    kDTPTryAgainErr       -4202
#define    kDTPAbortJobErr       128
デスクトップ・プリンタモニタは指定された値に応じて、ジョブの一時停止、印刷キューの停止、もう一度印刷をする、ジョブのキャンセルを実行します。

デスクトップ・プリンタの現在
デスクトップ・プリンタは、LaserWriter 8.3およびStyleWriter 1200プリンタドライバとともに導入されました。デスクトップ・プリンタは、初代のバックグラウンド印刷機能とほぼ同じ技術を採用しています。現在、Apple純正プリンタドライバのみをサポートしていますが、Mac OS 8.5ではサードパーティ製のプリンタでもデスクトップ・プリンタとして使えます。ドライバに組み込む必要のある追加項目をここで紹介します。

デスクトップ・プリンタをサポートするために追加する必要のあるリソースは、主にデスクトップ・プリンタのアイコンです。プリンタドライバを開発しているデベロッパは、ドライバのクリエータタイプとともに完全な'BNDL'リソースを供給する必要があります。すでにドライバ内部や初期設定ファイルなどで使用するためのファイルタイプとアイコンとは別に、'dpnn''dpcn''dpna'のファイルタイプに対するアイコンを追加する必要があります。これらは、"通常" のデスクトップ・プリンタ、省略時デスクトッププリンタ(輪郭が太線で囲まれている)、およびアクティブでない(または使用可能でない)デスクトップ・プリンタにそれぞれ対応しています。この例として、次にColor StyleWriter 2500のバンドルを示します。尚、LaserWriter 8の場合は、デスクトップ・プリンタのアイコンを設定する方法は若干異なており、アイコンは対象となるプリンタに対応するPPD(PostScript printer description)ファイルから取得されます。

BNDL ID -8193
StyleWriter 2500のバンドルとアイコン


Apple純正のプリンタドライバがデスクトップ・プリンタとして使用され、スプールファイルを作成するとき、そのファイルは、初代のバックグラウンド印刷機能で使用されたのと同じフォルダに格納されます。デスクトップ・プリンタ機能拡張がファイルをデスクトップ・プリンタに移動し、実際に書類のプリントプロセスを開始します。デスクトップ・プリンタがアクティブなときは、次に定義するリソースがスプールファイルに追加されます。

'PINX' -8200 − ページインデックスリソース
'jobi' 1 − プリントジョブ情報

// PINX -8200(ページインデックスリソース)

typedef struct {
	short count;            // pageOffsetの項目数
	long  pageoffset [1];	// ファイルの先頭からページレコードへの
				// オフセット (つまり、先頭ページの場合は、
				// sizeof (SpoolFileHeader) になる) 
} SpoolPageIndex, *SpoolPageIndexPtr, **SpoolPageIndexHandle;

// jobi 1(デスクトップ・プリンタジョブ情報リソース)
// プリント優先順位

#define kDTPPrintJobUrgent     0x00000001
#define kDTPPrintJobAtTime     0x00000002
#define kDTPPrintJobNormal     0x00000003
#define kDTPPrintJobHolding    0x00001003

typedef struct {
	short          firstPageToPrint;   // 印刷するスプールファイルの先頭ページ
	short          priority;           // 印刷優先順位(例:kDTPPrintJobNormal)
	short          numCopies;          // 印刷部数
	short          numPages;           // スプールファイルのページ数
	unsigned long  timeToPrint;        // 優先順位がkPrintJobAtTimeのとき、印刷する
                                           // 時刻(秒)
	Str31          documentName;       // 書類名
	Str31          applicationName;    // スプールファイルを作成したアプリケーション名
	Str32          printerName;        // プリンタ名
                                           // (PREC 124と一致していなければならない)
} DTPPrintJobInfo, *DTPPrintJobInfoPtr, **DTPPrintJobInfoHandle;
別の追加を行うことで、省略時デスクトップ・プリンタを変更することができます。アプリケーションまたはドライバはAppleイベントをFinderに送信することができます。 (SendAEToFinderはFinderにイベントを送信します。詳細についてはDTPSample.cをご覧下さい。)
#define kDTPSignature             'dtpx'
#define aeDTPSetDefaultEventType  'pfsd'

typedef struct {
	OSType   dtpSignature;      // kDTPSignature
	OSType   dtpEventType;      // aeDTPSetDefaultEventType叉はaeDTPSyncEventType
	FSSpec   dtpSpec;           // デスクトップ・プリンタのFSSpec
} DTPAppleEventData;

OSErr SetDefaultDTP (StringPtr dtpName)
{
	OSErr              err;
	DTPAppleEventData  myEvent;

	myEvent.dtpSignature = kDTPSignature;
	myEvent.dtpEventType = aeDTPSetDefaultEventType;
    BlockMove ((Ptr) dtpSpec, (Ptr) &myEvent.dtpSpec, sizeof (FSSpec));

	err = SendAEToFinder ((Ptr) &myEvent, sizeof (DTPAppleEventData));

	return err;
}
デスクトップ・プリンタの明日
Mac OS 8の登場とともに、デスクトップ・プリンタは独立した機能拡張ではなくなりました。デスクトップ・プリンタ機能はFinderに統合され、その結果として、ほとんどの場合にデスクトップ・プリンタを使用できるようになります。もちろん、機能拡張マネージャでデスクトップ・プリントモニタとデスクトップ・プリンタ・スプーラを使用停止にすれば、デスクトップ・プリンタ機能をオフにすることもできます。Mac OS 8.5ではサードパーティ製のドライバもサポートされています。

デスクトップ・プリンタはGestaltセレクタをインストールし、サードパーティ製のプリンタドライバがサポートされているかどうかを知らせます。デスクトップ・プリンタが使用可能であっても、サードパーティ製のプリンタドライバがサポートされていないことがこのセレクタで示されている場合は、前述の「初代のバックグラウンド印刷機能」で説明した方法を使用する必要があります。
#define kGestaltPFEFeatures  'dtpf'
#define kThirdPartySupport   0x00000004
Boolean ThirdPartyDriverSupported(void)

{
	long  response;
	Boolean result = false;
	OSErr err = Gestalt(kGestaltPFEFeatures,&response);
	if (err == noErr)
	result = !!(response & kThirdPartySupport);
	return result;
}


サードパーティ製のデスクトップ・プリンタがサポートされているとき、サードパーティ製のドライバは、'?job'というファイルタイプを使って、スプールファイルを直接デスクトップ・プリンタのフォルダに書き込む必要があります。スプール作業が完了したら、ファイルタイプを'pjob'に変更します。ドライバでは、デスクトップ・プリンタ機能拡張セレクタを含むGestaltルーチンを呼び出して、現在選択されている省略時デスクトップ・プリンタのフォルダや、その他の多くの項目を決定することができます。このセレクタは'dtpx'であり、その情報はハンドルとして返されます。theDTPListGestaltDTPInfoHandleに対してはDisposeHandleを絶対呼び出さないでください。

// デスクトップ・プリンタ情報Gestaltセレクタ
// このGestaltセレクタを使ってすべてのデスクトップ・プリンタの情報が得られます

enum { gestaltDTPInfo = 'dtpx' );
enum
{
    kDTPGestaltStructVersion2 = 0x02008000,  // バージョン2.0f0(Mac OS 8.0、8.1、7.x)
    kDTPGestaltStructVersion3 = 0x03000000,  // バージョン3.0(Mac OS 8.5)
};

// デスクトップ・プリンタ情報
typedef struct {
	short   vRefNum;	// デスクトップ・プリンタフォルダのvRefNum
	long    dirID;		// デスクトップ・プリンタフォルダのディレクトリID
	Str31   dtpName;	// デスクトップ・プリンタフォルダの名前
	OSType  driverType;	// ドライバのクリエータ
	Boolean current;	// 省略時プリンタに指定されているかどうか
	Str32   printerName;	// プリンタのネットワーク名
				// (LaserWriter 8.4デスクトップ・プリンタの場合のみ)
	Str32   zoneName;	// プリンタのゾーン
				// (LaserWriter 8.4デスクトップ・プリンタの場合のみ)
} DTPInfo;

// デスクトップ・プリンタGestaltセレクタの情報
typedef struct
{
    long    version;            // kDTPGestaltStructVersion2叉は
                                // kDTPGestaltStructVersion3
    short   numDTPs;            // リストに含まれるデスクトッププリンタの数
    Handle  theDTPList;         // デスクトップ・プリンタのDTPInfoリストへのハンドル
    Handle  theDTPDriverList;   // デスクトップ・プリンタのファイル情報リストへのハンドル
    long    reserved;
} GestaltDTPInfo, **GestaltDTPInfoHandle;
スプールファイルの書き込みが終了したら、FinderにAppleイベントを送信して通知する必要があります。詳しくはDTPSample.cSyncDTP関数をご覧下さい。

このバージョンのデスクトップ・プリンタ機能には、さらに別の呼び出しも追加されます。具体的にはドライバがサポートする必要のある3つの新しいPrGeneralセレクタ(kIsSamePrinterInfokGetPrinterInfo、およびkSetDefaultPrinterInfo)が用意されています。これらのセレクタは、デスクトップ・プリンタ機能拡張がドライバのデスクトップ・プリンタの中のどれが現在の省略時プリンタであるかを判定したり、新規にデスクトップ・プリンタを作成する必要があるかどうかを判断したり、さらにデスクトップ・プリンタが省略時で選択されていることをドライバに通知することを可能にします。以下に、これらのセレクタを使用する際に必要な構造体を示します。
// PrGeneral opコード
enum
{
    kDTPGetPrinterInfo        = 23,
    kDTPIsSamePrinterInfo     = 24,
    kDTPSetDefaultPrinterInfo = 25
};

// デスクトップ・プリンタの種別(アドレスタイプ)
enum
{
    kDTPUnknownPrinterType      = -1,   // 種別不明
    kDTPSerialPrinterType       = 0,    // シリアルプリンタ
    kDTPAppleTalkPrinterType    = 1,    // AppleTalkプリンタ
    kDTPTCPIPPrinterType        = 2,    // TCP/IPプリンタ
    kDTPSCSIPrinterType         = 3,    // SCSIプリンタ
    kDTPUSBPrinterType          = 4     // USBプリンタ
};

// シリアルポート
enum
{
    kDTPUnknownPort = -1,     // Communications Toolboxなどで、プリンタポートや
                              // モデムポート以外のシリアルポートにも対応している場合
    kDTPPrinterPort = 0,      // プリンタポート
    kDTPModemPort   = 1       // モデムポート
};

// シリアルプリンタのアドレス
typedef struct
{
    short   port;             // kDTPPrinterPort、kDTPModemPort、kDTPUnknownPortのいずれか
    Str31   portName;         // portで指定されたシリアルポートの名称
} DTPSerialAddress;

// AppleTalkプリンタのアドレス
typedef struct
{
    Str32   nbpName;
    Str32   nbpZone;
    Str32   nbpType;
} DTPAppleTalkAddress;

// TCP/IPプリンタのアドレス
typedef struct
{
    Str255  TCPIPAddress;
    Str255  queueName;
} DTPTCPIPAddress;

// SCSIプリンタのアドレス
typedef struct
{
    short   id;                 // SCSI番号
} DTPSCSIAddress;

// USBプリンタのアドレス
typedef struct
{
    Str255  name;               // プリンタ名
} DTPUSBAddress;

// PrGeneralに渡す情報
typedef struct
{
    Str31   dtpDefaultName;     // デスクトップ・プリンタに使用される省略時の名前
    short   printerType;        // kDTPSerialPrinterType、kDTPAppleTalkPrinterType、
                                // kDTPTCPIPPrinterType、kDTPSCSIPrinterType、
                                // kDTPUSBPrinterType、kDTPUnknownPrinterTypeのいずれか

    // プリンタ種別固有の情報
    union
    {
        DTPSerialAddress        serial;
        DTPAppleTalkAddress     appleTalk;
        DTPTCPIPAddress         tcpip;
        DTPSCSIAddress          scsi;
        DTPUSBAddress           usb;
    } u;

    // ドライバ固有の情報は任意に追加できる

} DTPPrinterInfo, **DTPPrinterInfoHandle;

typedef struct
{
    short                 iOpCode;      // kDTPGetPrinterInfo、kDTPIsSamePrinterInfo、
                                        // kDTPSetDefaultPrinterInfoのいずれか
    short                 iError;
    long                  iCommand;
    DTPPrinterInfoHandle  printerInfo;
} TDTPPrGeneralData;
デスクトップ・プリンタ機能に対応していることをFinderに知らせるためには、プリンタドライバのリソースフォークに'dtpi'リソースを追加する必要があります。'dtpi'リソースは以下のように定義されています。
// デスクトップ・プリンタの情報リソース
#define kDTPInfoResType 'dtpi'
#define kDTPInfoResID   -8192

// サポートされている接続方法
#define kDTPUnknownConnection       0x00000000  // 接続方法不明
#define kDTPSerialConnection        0x00000001  // シリアル接続
#define kDTPSCSIConnection          0x00000002  // SCSI接続
#define kDTPAppleTalkConnection     0x00000004  // AppleTalk接続
#define kDTPTCPIPConnection         0x00000008  // TCP/IP接続
#define kDTPUSBConnection           0x00000010  // USB接続

// デスクトップ・プリンタがサポートする追加機能
#define kDTPBasicFeatures           0x00000000	// デスクトップ・プリンタの基本機能のみをサポート

typedef struct
{
    long    features;          // kDTPBasicFeatures(MacOS 8.5は基本機能のみをサポートします)
    long    connectionType;    // kDTPUnknownConnection叉は
                               // kDTPSerialConnection、kDTPSCSIConnection、
                               // kDTPAppleTalkConnection、kDTPTCPIPConnection、
                               // kDTPUSBConnectionの結合
} DTPInfoResource;
セレクタでサードパーティ製のプリンタドライバが選択されるとき、デスクトップ・プリンタ機能は一連のPrGeneralコードによってそのドライバを呼び出します。まず最初に、そのプリンタドライバによって作成されたそれぞれのデスクトップ・プリンタについて、kIsSamePrinterInfoセレクタを含む呼び出しが実行され、現在選択されているプリンタが決定されます。これに対して、ドライバは、TPrinterInfoPrGeneralDataレコードのiErrorフィールドに情報を書き込んで応答します。ドライバが現在のプリンタであると判断したプリンタがkIsSamePrinterInfoセレクタで渡された情報と一致する場合、ドライバはiErrorフィールドにnoErrを設定します。また、一致しない場合は、iErrorフィールドに-1を設定します。

セレクタで選択されたプリンタが、ドライバによって所有されているデスクトップ・プリンタに含まれていない場合は、新しいデスクトッププリンタを作成し、kGetPrinterInfoセレクタを含むPrGeneralを呼び出して、選択されているプリンタに対応する情報を取得します。この時点で、ドライバではprinterInfoハンドルのサイズを変更してプリンタ情報を書き込みます。作成したデスクトップ・プリンタに使用したい名前をdtpDefaultNameフィールドに書き込む必要があります。また、ドライバでは、必要に応じて任意のプリンタ情報を追加することもできます。その情報を返すと、デスクトップ・プリンタ機能拡張はこの情報をデスクトップ・プリンタの内部に保存します。

ユーザが「プリンタ」メニュー(デスクトッププリンタをクリックするとFinderに表示される)の「省略時プリンタに指定」コマンドを使ってデスクトップ・プリンタのいずれかを選択するとき、ドライバはkSetDefaultPrinterInfoセレクタを含むPrGeneral呼び出しを実行します。この呼び出しを受け取ったときは、ドライバが保持している内部設定を変更してください。その結果、受け取ったDTPPrinterInfoによって指定されるプリンタがドライバの現在選択されているプリンタになります。


未来はすぐそこにある
初代のバックグラウンド印刷をサポートするドライバをすでに開発している場合、将来にわたって互換性を維持するための最善の選択はデスクトップ・プリンタのサポートを追加することです。しかし、バックグラウンド印刷との格闘を始めたばかりで、Mac OS 8のデスクトップ・プリンタ機能のみをサポートしようとしている場合は、現在のデスクトップ・プリンタ機能に加えて初代のバックグラウンド印刷もサポートすることを強くお勧めします。こうすれば、実行するMac OSのバージョンに関係なく、ユーザはより一貫した印刷操作を経験できるようになるはずです。