MONITOR 構造体 (winsplp.h)

注意事項

MONITOR 構造体は古く、互換性上の理由からのみサポートされています。 新しい印刷モニターは、プリント サーバー クラスターで使用できるように 、MONITOR2 を実装する必要があります。

MONITOR 構造体には、印刷モニターによって定義された関数へのポインターが含まれています。

構文

typedef struct _MONITOR {
  BOOL( )(LPWSTR pName,DWORD Level,LPBYTE pPorts,DWORD cbBuf,LPDWORD pcbNeeded,LPDWORD pcReturned)  *pfnEnumPorts;
  BOOL( )(LPWSTR pName,PHANDLE pHandle)  *pfnOpenPort;
  BOOL()(LPWSTR pPortName,LPWSTR pPrinterName,PHANDLE pHandle,_MONITOR *pMonitor)  * pfnOpenPortEx;
  BOOL( )(HANDLE hPort,LPWSTR pPrinterName,DWORD JobId,DWORD Level,LPBYTE pDocInfo)  *pfnStartDocPort;
  BOOL( )(HANDLE hPort,LPBYTE pBuffer,DWORD cbBuf,LPDWORD pcbWritten)  *pfnWritePort;
  BOOL( )(HANDLE hPort,LPBYTE pBuffer,DWORD cbBuffer,LPDWORD pcbRead)  *pfnReadPort;
  BOOL( )(HANDLE hPort)  *pfnEndDocPort;
  BOOL( )(HANDLE hPort)  *pfnClosePort;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pMonitorName)  *pfnAddPort;
  BOOL( )(LPWSTR pName,DWORD Level,LPBYTE lpBuffer,LPWSTR lpMonitorName)  *pfnAddPortEx;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pPortName)  *pfnConfigurePort;
  BOOL( )(LPWSTR pName,HWND hWnd,LPWSTR pPortName)  *pfnDeletePort;
  BOOL( )(HANDLE hPort,DWORD ControlID,LPWSTR pValueName,LPWSTR lpInBuffer,DWORD cbInBuffer,LPWSTR lpOutBuffer,DWORD cbOutBuffer,LPDWORD lpcbReturned)  *pfnGetPrinterDataFromPort;
  BOOL( )(HANDLE hPort,LPCOMMTIMEOUTS lpCTO,DWORD reserved)  *pfnSetPortTimeOuts;
  BOOL( )(LPCWSTR pszObject,ACCESS_MASK GrantedAccess,PHANDLE phXcv)  *pfnXcvOpenPort;
  DWORD( )(HANDLE hXcv,LPCWSTR pszDataName,PBYTE pInputData,DWORD cbInputData,PBYTE pOutputData,DWORD cbOutputData,PDWORD pcbOutputNeeded) *pfnXcvDataPort;
  BOOL( )(HANDLE hXcv)  *pfnXcvClosePort;
} MONITOR, *LPMONITOR;

メンバー

pfnEnumPorts

ポート モニター サーバー DLL の EnumPorts 関数は、ポート モニターがサポートするポートを列挙します。

pfnOpenPort

印刷モニターの OpenPort 関数へのポインター。

pfnOpenPortEx

言語モニターの関数によって OpenPortEx プリンター ポートが開きます。

pfnStartDocPort

印刷モニターの StartDocPort 関数は、指定したポートで印刷ジョブを開始するために必要なタスクを実行します。

pfnWritePort

印刷モニターの WritePort 関数へのポインター。

pfnReadPort

印刷モニターの ReadPort 関数へのポインター。

pfnEndDocPort

印刷モニターの EndDocPort 関数は、指定したポートで印刷ジョブを終了するために必要なタスクを実行します。

pfnClosePort

印刷モニターの ClosePort 関数へのポインター。

pfnAddPort

注意事項

AddPort 関数は廃止されているため、使用しないでください。

AddPort はポートを作成し、スプーラー環境で指定されたモニターで現在サポートされているポートの一覧に追加します。

pfnAddPortEx

(現在は使用されていません。 NULL である必要があります)。)印刷モニターの AddPortEx 関数へのポインター。 (ポート モニターのみ)。

pfnConfigurePort

注意事項

ConfigurePort 関数は廃止されているため、使用しないでください。 代わりに ConfigurePortUI を使用してください。

ConfigurePort は、指定したポートを構成するポート管理機能です。

pfnDeletePort

注意事項

DeletePort 関数は古く、使用しないでください。

DeletePort は、モニターの環境からポートを削除します。

pfnGetPrinterDataFromPort

ポート モニターの GetPrinterDataFromPort 関数は、双方向プリンターから状態情報を取得し、呼び出し元に返します。

pfnSetPortTimeOuts

ポート モニター サーバー DLL の SetPortTimeOuts 関数は、開いているポートのポート タイムアウト値を設定します。

pfnXcvOpenPort

印刷モニターの XcvOpenPort 関数へのポインター。 (ポート モニターのみ)。

pfnXcvDataPort

印刷モニターの XcvDataPort 関数へのポインター。 (ポート モニターのみ)。

pfnXcvClosePort

印刷モニターの XcvClosePort 関数へのポインター。 (ポート モニターのみ)。

注釈

次のセクションでは、各コールバック メンバーについて詳しく説明します。

AddPort

typedef BOOL (WINAPI *pfnAddPort)(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pMonitorName
);

Parameters (AddPort)

Monitor [in] (AddPort)

呼び出し元が指定したモニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor2 をサポートしている場合、このパラメーターは存在しません)。

pName [in] (AddPort)

ポートが接続されているサーバーの名前を指定する null で終わる文字列へのポインター。 pName が NULL の場合、ポートはローカルです。

hWnd [in] (AddPort)

ポート名を入力するダイアログ ボックスの親ウィンドウへのハンドル。

pMonitorName [in] (AddPort)

ポートに関連付けられているモニターを指定する null で終わる文字列へのポインター。

戻り値 (AddPort)

関数が成功した場合は戻り値は TRUE、それ以外の場合は FALSE です。

ConfigurePort

typedef BOOL (WINAPI *pfnConfigurePort)(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pPortName
);

パラメーター (ConfigurePort)

hMonitor [in] (ConfigurePort)

呼び出し元が指定したモニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor をサポートしている場合、このパラメーターは存在しません)。

pName [in] (ConfigurePort)

指定されたポートが存在するサーバーの名前を指定する null で終わる文字列へのポインター。 この文字列が NULL の場合、ポートはローカルです。

hWnd [in] (ConfigurePort)

構成情報を入力するダイアログ ボックスの親ウィンドウへのハンドル。

pPortName [in] (ConfigurePort)

構成するポートの名前を指定する null で終わる文字列へのポインター。

戻り値 (ConfigurePort)

関数が成功した場合、戻り値は TRUE です。

DeletePort

pfnDeletePort DeletePort;

BOOL WINAPI DeletePort(
  _In_ HANDLE hMonitor,
  _In_ LPWSTR pName,
  _In_ HWND   hWnd,
  _In_ LPWSTR pPortName
)

Parameters (DeletePort)

hMonitor [in] (DeletePort)

呼び出し元が指定したモニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor をサポートしている場合、このパラメーターは存在しません)。

pName [in] (DeletePort)

削除するポートが存在するサーバーの名前を指定する null で終わる文字列へのポインター。 このパラメーターが NULL の場合、ポートはローカルです。

hWnd [in] (DeletePort)

[ポート削除] ダイアログ ボックスの親ウィンドウへのハンドル。

pPortName [in] (DeletePort)

削除するポートに名前を付ける null で終わる文字列へのポインター。

戻り値 (DeletePort)

関数が成功した場合、戻り値は TRUE です。

EndDocPort

typedef BOOL ( WINAPI *pfnEndDocPort)(
  _In_ HANDLE hPort
);

Parameters (EndDocPort)

hPort [in] (EndDocPort)

呼び出し元が指定したポート ハンドル。

戻り値 (EndDocPort)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

EnumPorts

typedef BOOL (WINAPI *pfnEnumPorts)(
  _In_     HANDLE  hMonitor,
  _In_opt_ LPWSTR  pName,
  _In_     DWORD   Level,
  _Out_    LPBYTE  pPorts,
  _In_     DWORD   cbBuf,
  _Out_    LPDWORD pcbNeeded,
  _Out_    LPDWORD pcReturned
);

Parameters (EnumPorts)

hMonitor [in] (EnumPorts)

呼び出し元が指定したモニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor をサポートしている場合、このパラメーターは存在しません)。

pName [in, optional] (EnumPorts)

ポートを列挙するサーバーの名前を含む文字列への呼び出し元指定ポインター。 NULL ポインターは、ポート モニター サーバー DLL が実行されているシステムを表します。

Level [in] (EnumPorts)

pPorts が指すバッファーで返される構造体の種類を示す呼び出し元から指定された値。

指定できる値は、1 (PORT_INFO_1) または 2 (PORT_INFO_2) です。

pPorts [out] (EnumPorts)

ポート情報を受信するためのバッファーへの呼び出し元指定ポインター。 返される情報は、 PORT_INFO_1 構造体または PORT_INFO_2 構造体の配列の後に、構造体メンバーが指す文字列で構成されている必要があります。

cbBuf [in] (EnumPorts)

pPort が指すバッファーの呼び出し元が指定したサイズ (バイト単位)。

pcbNeeded [out] (EnumPorts)

返されるすべての情報を格納するために必要なバッファー サイズを受信する場所への呼び出し元指定ポインター (バイト単位)。

pcReturned [out] (EnumPorts)

列挙されたポート数を受け取る場所への呼び出し元指定ポインター。

戻り値 (EnumPorts)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

GetPrinterDataFromPort

pfnGetPrinterDataFromPort GetPrinterDataFromPort;

BOOL WINAPI GetPrinterDataFromPort(
  _In_  HANDLE  hPort,
  _In_  DWORD   ControlID,
  _In_  LPWSTR  pValueName,
  _In_  LPWSTR  lpInBuffer,
  _In_  DWORD   cbInBuffer,
  _Out_ LPWSTR  lpOutBuffer,
  _In_  DWORD   cbOutBuffer,
  _Out_ LPDWORD lpcbReturned
)

Parameters (GetPrinterDataFromPort)

hPort [in] (GetPrinterDataFromPort)

呼び出し元が指定したポート ハンドル。

ControlID [in] (GetPrinterDataFromPort)

呼び出し元から提供されたデバイス I/O 制御コード。 値 0 は、pValueName によって値名が指定されていることを示します。

pValueName [in] (GetPrinterDataFromPort)

要求される情報を識別する文字列への呼び出し元から指定されたポインター。 ControlID が 0 の場合にのみ有効です。

lpInBuffer [in] (GetPrinterDataFromPort)

入力データを含むバッファーへの呼び出し元指定ポインター。 ControlID が 0 以外の場合にのみ使用されます。

cbInBuffer [in] (GetPrinterDataFromPort)

lpInBuffer が指すバッファーの呼び出し元指定サイズ (バイト単位)。

lpOutBuffer [out] (GetPrinterDataFromPort)

要求されたデータを受信するためのバッファーへの呼び出し元指定ポインター。

cbOutBuffer [in] (GetPrinterDataFromPort)

lpOutBuffer が指すバッファーの呼び出し元が指定したサイズ (バイト単位)。

lpcbReturned [out] (GetPrinterDataFromPort)

lpOutBuffer が指すバッファーに書き込まれたバイト数を受け取る場所への呼び出し元指定ポインター。

戻り値 (GetPrinterDataFromPort)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

OpenPortEx

pfnOpenPortEx OpenPortEx;

BOOL WINAPI OpenPortEx(
  _In_  HANDLE           hMonitor,
  _In_  HANDLE           hMonitorPort,
  _In_  LPWSTR           pPortName,
  _In_  LPWSTR           pPrinterName,
  _Out_ PHANDLE          pHandle,
  _In_  struct _MONITOR2 *pMonitor
)

Parameters (OpenPortEx)

hMonitor [in] (OpenPortEx)

呼び出し元が指定した言語モニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor をサポートしている場合、このパラメーターは存在しません)。クラスター環境では、言語モニターのインスタンスが複数存在する場合があります。

hMonitorPort [in] (OpenPortEx)

呼び出し元から提供されたポート モニター インスタンス ハンドル。 これは、モニターの InitializePrintMonitor2 関数によって返されるハンドルです。 (印刷モニターが InitializePrintMonitor2 ではなく InitializePrintMonitor をサポートしている場合、このパラメーターは存在しません)。言語モニターは、ポート モニターの MONITOR2 構造で関数を呼び出すときに、このハンドル 使用する必要があります。

pPortName [in] (OpenPortEx)

開くポートの名前を含む文字列への呼び出し元指定ポインター。

pPrinterName [in] (OpenPortEx)

ポートに接続されているプリンターの名前を含む文字列への呼び出し元指定ポインター。

pHandle [out] (OpenPortEx)

ポート ハンドルを受信する場所への呼び出し元から指定されたポインター。

pMonitor [in] (OpenPortEx)

ポート モニターの InitializePrintMonitor2 関数によって返される MONITOR2 構造体への呼び出し元指定ポインター。

戻り値 (OpenPortEx)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

SetPortTimeOuts

BOOL (WINAPI *pfnSetPortTimeOuts)
    (
    _In_ HANDLE  hPort,
    _In_ LPCOMMTIMEOUTS lpCTO,
    _In_ DWORD   reserved    // must be set to 0
    );

Parameters (SetPortTimeOuts)

hPort [in] (SetPortTimeOuts)

タイムアウト値を設定する開いているポートへの呼び出し元から提供されるハンドル。

lpCTO [in] (SetPortTimeOuts)

COMMTIMEOUTS 構造体への呼び出し元が指定したポインター。

予約済み [in] (SetPortTimeOuts)

将来利用するために予約されています。 0 に設定する必要があります。

戻り値 (SetPortTimeOuts)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

StartDocPort

typedef BOOL (WINAPI *pfnStartDocPort)(
  _In_ HANDLE hPort,
  _In_ LPWSTR pPrinterName,
  _In_ DWORD  JobId,
  _In_ DWORD  Level,
  _In_ LPBYTE pDocInfo
);

Parameters (StartDocPort)

hPort [in] (StartDocPort)

呼び出し元が指定したポート ハンドル。

pPrinterName [in] (StartDocPort)

プリンター名を含む文字列への呼び出し元指定ポインター。

JobId [in] (StartDocPort)

呼び出し元指定のスプーラー割り当てジョブ ID。

Level [in] (StartDocPort)

pDocInfo が指す構造体の種類を示す呼び出し元から指定された値。

使用できる値は、1 (DOC_INFO_1) または 2 (DOC_INFO_2) です。

pDocInfo [in] (StartDocPort)

DOC_INFO_1またはDOC_INFO_2構造体への呼び出し元から指定されたポインター。

戻り値 (StartDocPort)

操作が成功した場合、関数は TRUE を返す必要があります。 それ以外の場合は FALSE を返す必要があります。

メモ

スプーラーは、アプリケーション要求を受信したときに AddPort を呼び出して、その環境にポートを追加します。 スプーラーは、名前付きサーバー上の名前付きポート モニターに呼び出しを転送します。

AddPort を使用すると、ポートを対話形式で追加できます。 モニターは、 hWnd に関連付けられているウィンドウのダイアログ ボックスにポート名を入力するようにユーザーに求めるメッセージを表示する必要があります。 AddPort では、Win32 EnumPorts 関数を呼び出して入力したポート名を検証し、スプーラー環境に重複するポート名が追加されていないことを確認する必要があります。 モニターでは、ポートがサポートされているポートであることを確認する必要もあります。

スプーラーは、リモート の AddPort 呼び出しをサポートしていません。 そのため、 AddPort の実装では 、pName パラメーターと pMonitorName パラメーターを無視できます。

スプーラーは ConfigurePort を 呼び出して、ポート モニターがポート構成を実行できるようにします。 ConfigurePort では、必要なポート構成情報の一部またはすべてをユーザーから取得するためのダイアログ ボックスを提供できます。

スプーラーは、リモート の ConfigurePort 呼び出しをサポートしていません。そのため、モニターは pName パラメーターを無視できます。

スプーラーは DeletePort を 呼び出して、ポート モニターがモニターの環境からポートを削除できるようにします。 モニターは、指定されたポートをその状態から削除する必要があります。 ポートが開いている限り、スプーラーはモニターで DeletePort を呼び出しません。

アプリケーションでは、ローカル ポートとリモート ポートを削除できます。 スプーラーが DeletePort を呼び出す前に、プリンター UI に確認メッセージ ボックスが表示されるため、モニターは hWnd パラメーターを無視し、別のダイアログ ボックスを表示しないようにする必要があります。

EndDocPort 関数を定義し、MONITOR2構造に関数のアドレスを含めるには、言語モニターとポート モニター サーバー DLL が必要です。

関数の hPort 引数として受け取るハンドルは、モニターの OpenPort 関数または OpenPortEx 関数が指定したポート ハンドルです。

言語モニターの EndDocPort 関数は、通常、関連付けられているポート モニターの EndDocPort 関数を 呼び出します。 また、印刷デバイスが SetJob を呼び出してジョブを終了したときに、JOB_CONTROL_LAST_PAGE_EJECTEDのコマンドを指定してスプーラーに通知する必要もあります。 双方向プリンターの言語モニターは、プリンターがジョブが実際に完了したことを通知するまで SetJob を呼び出さないでください。

ポート モニター サーバー DLL の EndDocPort 関数は、通常、CloseHandle 関数を呼び出して、StartDocPort 内から CreateFile を呼び出して以前に取得したハンドルを閉じます。 また、 SetJob を呼び出し、JOB_CONTROL_SENT_TO_PRINTERのコマンドを指定して、印刷デバイスがジョブを完了したときにスプーラーに通知する必要もあります。 (スプーラーが言語モニターを介してポートと通信している場合、言語モニターがJOB_CONTROL_LAST_PAGE_EJECTEDを送信するまで、ジョブが完了したとは見なされません)。

EndDocPort 関数は、StartDocPort 関数によって割り当てられたすべてのリソースを解放する必要があります。

ユーザーが印刷ジョブを削除または再起動した場合は、 EndDocPort 関数の動作を変更できます。 関数は GetJob を呼び出し、JOB_STATUS_DELETINGまたはJOB_STATUS_RESTARTの状態をチェックして、これらのイベントのいずれかが発生したかどうかを確認できます。

EnumPorts 関数を定義し、MONITOR2構造体に関数のアドレスを含めるには、ポート モニター サーバー DLL が必要です。 言語モニターでは、この関数はエクスポートされません。

EnumPorts 関数の目的は、印刷モニターで現在サポートされているポートを列挙することです。 これらのポートは、以前にモニターの AddPortUI または AddPortEx 関数に指定されたポートです。

EnumPorts 関数は、pPort が指すバッファーに、PORT_INFO_1またはPORT_INFO_2構造体の配列を格納する必要があります。 次に、最後の配列要素の後のメモリ位置から、関数は配列の構造体メンバーが指すすべての文字列を読み込む必要があります。 これを行う方法の例については、 サンプル ポート モニターである localmon.dll を参照してください。 関数は、 pcReturned が指す位置に番号を配置することによって、指定された構造体の数 (つまり、サポートされているポートの数) も返す必要があります。

呼び出し元は、 cbBuf で指定されたバッファーのサイズを指定します。 バッファーが小さすぎる場合、関数は必要なバッファー サイズを pcbNeeded が指す場所に配置し、ERROR_INSUFFICIENT_BUFFERを指定して SetLastError を呼び出し、 FALSE を返す必要があります。

Level に無効なレベル番号が含まれている場合、関数はERROR_INVALID_LEVELを指定して SetLastError を呼び出し、FALSE を返す必要があります。 一部のポート モニターでは、レベル値 1 のみがサポートされます。

ポート モニターは、PORT_INFO_2構造体の pMonitorName メンバーと pDescription メンバーが指す文字列のローカライズをサポートする必要があります。 これらの文字列はリソース ファイルで定義し、 LoadString を呼び出して取得する必要があります。

PORT_INFO_2構造体の fPortType メンバーは、NT ベースのオペレーティング システムでは使用されません。

言語モニター とポート モニター サーバー DLL は、必要に応じて GetPrinterDataFromPort 関数を定義し、 MONITOR2 構造体に関数のアドレスを含めることができます。

この関数は双方向プリンターでの使用を目的としており、次の 2 つの方法で使用できます。

  • プリンター ポートをポーリングするように言語モニターに要求する手段として、レジストリに格納されているプリンター固有の情報の現在の値を取得する。

  • ポート モニターに I/O 制御コードをポート ドライバーに送信するように要求する手段として。

言語モニターの GetPrinterDataFromPort 関数が pValueName で文字列ポインターを受け取る場合は、指定された出力バッファー内の値を返す必要があります。 通常、この文字列はレジストリ値の名前を表し、スプーラーはアプリケーションが GetPrinterData 関数を呼び出すときに GetPrinterDataFromPort を 呼び出します。

言語モニターの役割は、ポート モニターの WritePort 関数を呼び出し、 ReadPort を呼び出して応答を読み取り、必要な値を取得することで、プリンター ハードウェアにコマンドを送信することです。 たとえば、 サンプル言語モニター pjlmon.dll は、ポートの "インストールされているメモリ" と "使用可能なメモリ" レジストリ値の名前の値を返すことができます。

スプーラーは GetPrinterDataFromPort を呼び出してレジストリ値を取得した後、レジストリを新しい値で更新します。

通常、ポート モニターは、pValueName に文字列ポインターを含む GetPrinterDataFromPort の呼び出しをサポートしていません。

言語モニターの GetPrinterDataFromPort 関数が ControlID で 0 以外の I/O コントロール コードを受け取る場合は、関連付けられているポート モニターの GetPrinterDataFromPort 関数を呼び出して結果を返すだけです。 カーネル モード ドライバー リファレンスでは、並列ポートとシリアル ポートの I/O コントロール コードの一覧を示します。

ポート モニターの GetPrinterDataFromPort 関数が ControlID で 0 以外の I/O コントロール コードを受け取ると、 DeviceIOControl を呼び出して、コントロール コードをカーネル モード ポート ドライバーに渡す必要があります。 lpInBuffercbInBufferlpOutBuffercbOutBufferおよび lpcbReturned パラメーター値も DeviceIOControl に渡す必要があります。

言語モニターは、関数を定義し、そのアドレスをOpenPortExMONITOR2構造に含めるために必要です。 この OpenPortEx 関数は、印刷キューがポートに接続されているときに、印刷スプーラーによって呼び出されます。

関数OpenPortExの主な目的は、呼び出し元が言語モニターの StartDocPort、WritePortReadPortEndDocPortおよび GetPrinterDataFromPort 関数の後続の呼び出しの入力引数として使用できるポート ハンドルを返することです。 通常、言語モニターは関連するポート モニターで同等の関数を呼び出すことによってこれらの関数を実装するため、言語モニターは通常、ポート モニターの OpenPort 関数を呼び出してポート ハンドルを取得します。 詳細については、「 言語とポート モニターの相互作用」を参照してください。

OpenPortEx関数の pMonitor パラメーターは、ポート モニターのMONITOR2構造体へのポインターです。 この構造体には、ポート モニターの呼び出し可能な関数へのポインターが含まれています。 関数は OpenPortEx 構造体をチェックして、必要なすべての関数ポインターが NULL 以外であることを確認する必要があります。 構造体が有効な場合、関数はそれをローカル ストレージにコピーする必要があります。 それ以外の場合 OpenPortEx は、ERROR_INVALID_PRINT_MONITORを指定して SetLastError を呼び出し、 FALSE を返す必要があります。

ポート ハンドルを入力として受け入れる印刷モニター機能では、モニター ハンドルも受け入れられません。 そのため、関数は OpenPortEx 、受信したモニター ハンドルをポート ハンドルで参照できる場所に格納する必要があります。 これにより、ポート ハンドルを受け入れる関数がモニター ハンドルを参照できるようになります。

ポート モニター サーバー DLL の SetPortTimeOuts 関数を使用すると、言語モニターで開いているポートのポート タイムアウト値を指定できます。 関数は省略可能であり、ポート モニターがポート タイムアウト値の変更を許可するポートを制御する場合にのみ指定する必要があります。 関数が定義されている場合、そのアドレスは MONITOR2 構造体に含まれている必要があります。

この関数は、 サンプル言語モニターである pjlmon.dll によって呼び出され、それを呼び出すカスタマイズされた言語モニターを作成できます。 印刷スプーラーは を呼び出 SetPortTimeOutsしません。

ポート モニターは、 OpenPort 関数内からポートのタイムアウト値を初期化する必要があります。

関数を 定義 StartDocPort し、 MONITOR2 構造に関数のアドレスを含めるには、言語モニターとポート モニター サーバー DLL が必要です。

関数の hPort 引数として受け取るハンドルは、モニターの OpenPort 関数または OpenPortEx 関数が指定したポート ハンドルです。

通常、言語モニターの 関数は StartDocPort 、関連付けられているポート モニターの StartDocPort 関数を呼び出します。

ポート モニター サーバー DLL の StartDocPort 関数は、通常、 CreateFile 関数を呼び出して、カーネル モード ポート ドライバーへの接続を作成します。

必要に応じて、ポート モニターは 、EndDocPort が呼び出されるまで、他のプロセスが指定したポートを使用できないようにする必要があります。 たとえば、COM ポートのポート モニターでは、スプーラーがプリンター データをポートに送信している間に、別のアプリケーションがポートが特定の通信デバイスに接続されていることを前提とせず、そのデバイスとの通信を試みる必要があります。 この注意書きは、ローカル印刷プロバイダーには適用されません。これにより、EndDocPort への間の呼び出しなしで連続して 2 回呼び出StartDocPortされることはありませんが、この保証を行わない印刷プロバイダーには適用されます。

要件

要件
Header winsplp.h (Winsplp.h を含む)

こちらもご覧ください

MONITOR2

MONITORUI