次の方法で共有


ReadPort 関数 (winsplp.h)

ポート モニターの ReadPort 関数は、プリンター ポートからデータを読み取ります。

構文

BOOL ReadPort(
  _In_  HANDLE  hPort,
  _Out_ LPBYTE  pBuffer,
        DWORD   cbBuffer,
  _Out_ LPDWORD pcbRead
);

パラメーター

[in] hPort

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

[out] pBuffer

ポートから読み取られたデータを受信するバッファーへの呼び出し元指定のポインター。

cbBuffer

呼び出し元が指定した pBuffer バイト単位のサイズ。

[out] pcbRead

ポートから正常に読み取られたバイト数を受信する場所への呼び出し元指定のポインター。

戻り値

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

備考

言語モニター およびポート・モニター・サーバー DLL は、ReadPort 関数を定義し、その関数のアドレスを MONITOR2 構造に含めるために必要です。

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

通常、言語モニターの ReadPort 関数は、関連付けられているポート モニターの ReadPort 関数を呼び出し、取得したバッファーの内容を呼び出し元に返します。

さらに、言語モニターは、ポート モニターの ReadPort 関数を呼び出して、要請されていない状態情報を確認する別のスレッドを作成する場合があります。 このような読み取り操作が成功した場合は、SetPort (Microsoft Windows SDK ドキュメントで説明) 呼び出すことによって、状態情報をスプーラーに返す必要があります。

通常、ポート モニター サーバー DLL の ReadPort 関数は、ReadFile (Windows SDK ドキュメントで説明) 呼び出して、カーネル モード ポート ドライバーからデータを取得します。 この関数は、呼び出し元にデータを返すだけです。

言語モニターとポート・モニターの両方が ReadPort 関数を定義し、そのアドレスをMONITOR2構造に配置する必要がありますが、言語モニターの ReadPort 関数は、スプーラーまたはアプリケーションによって実際に呼び出されることはありません。 この関数は、言語モニター自体の内部使用のみを目的としています。

たとえば、pjlmon.dll、サンプル言語モニターは、要求されていないプリンターの状態情報を監視するために独自の ReadPort を呼び出す別のスレッドを作成し、ReadPort 関数はポート モニターの ReadPort 関数を呼び出します。 ポート モニターが言語モニターにデータを返すと、言語モニターは受信したデータを解析し、SetPort (Windows SDK ドキュメントで説明) 呼び出してスプーラーに状態情報を送信します。

この関数は、pcbRead が指す位置に数値を配置することで、正常に読み取られたバイト数返す必要があります。 呼び出し元は、返されたバイト数ではなく、戻り値 ReadPort's チェックして、書き込み操作の成功または失敗を判断します。 したがって、返されるバイト数が 0 の場合、関数が FALSE を返さない限り、失敗した読み取り表しません。

ある種のシステム実装またはモニター実装のタイムアウト メカニズムでは、スプーラーのストールを回避するために、ReadPort 関数が妥当な時間内に返されるようにする必要があります。

言語モニターは、StartDocPort/EndDocPort ペアの外部でポート モニターの ReadPort ルーチンを呼び出すことができます。 (このような呼び出しは、要求されていない状態をチェックするスレッドによって生成される場合があります)。ただし、一部のポート モニターではこのような呼び出しが失敗する可能性があるため、このエラーを処理するには言語モニターを記述する必要があります。

必要条件

要件 価値
ターゲット プラットフォーム デスクトップ
ヘッダー winsplp.h (Winsplp.h を含む)
ライブラリ NtosKrnl.exe

関連項目

GetPrinterDataFromPort

StartDocPort

OpenPortEx

OpenPort

EndDocPort する