以下、本発明を実施するための形態について図面を用いて説明する。なお、この実施の形態で用いる装置の各構成要素の全てが本発明に必須のものではなく、また、各構成要素の種々の変形や応用も可能である。即ち、本発明は以下の実施形態の特定の構成に限定されるものではない。
図1は、本発明の一実施の形態に係る情報処理装置の一例であるコンピュータ20と、周辺装置の一例であるスキャナ10とを含む画像読取システムの構成を示すブロック図である。
スキャナ10は、ハードウェア資源として、USBインターフェース11、CPU12、ROM13、RAM14、スキャナエンジン15、操作パネル16を有する。USB(Universal Serial Bus)インターフェース11は、USBの規格に従ってコンピュータ20との間でデータの送受信を行う。CPU12は、ROM13に記憶されているスキャナ10の制御プログラムを、RAM14にロードし、それを実行することでスキャナ10の動作を制御する。ROM13は制御プログラムのほか、スキャナ10の動作に必要なパラメータ等も記憶する。RAM14はCPU12のワークエリアとして使用されるほか、スキャナ10の状態情報や画像データの一時記憶領域等としても使用される。
スキャナエンジン15は、原稿に光を照射する光源やその反射光を読み取り、光電変換するCCDカラーイメージセンサ等を含む。スキャナ10の原稿台に置かれた原稿上をスキャナエンジン15により走査させて原稿上の画像を読み取り、読み取られた画像に応じた画像データ(読取画像データ)が生成される。操作パネル16は、スキャナ10の状態やユーザによる作業のためのメニューを表示する表示部と、ユーザが読取開始指示を含む種々の操作を行うハードキーを含む。操作パネル16はタッチパネル等、他の形態としてもよい。
また、ここではスキャナ10を、スキャナ専用機を例に示したが、これにプリンタなど他の機能をさらに付加したマルチファンクション機としてもよい。また、原稿上の画像を読み取る際、原稿台上に原稿を置いて走査するものとしたが、原稿搬送機構を設け、スキャナエンジン15を固定させて、原稿の搬送により走査するようにしてもよい。また、スキャナ10からの読み取り開始のための操作としては、操作パネル16を用いるものに代え、読取対象の原稿がスキャナ10にセットされたことを検知した場合に、それをコンピュータ20に通知するものとしてもよい。また、スキャナ10は、CPU12を持たないものとし、コンピュータ20からの制御でスキャナエンジン15を動作させるものとしてもよい。またカラースキャナに代えて、モノクロスキャナとしてもよいし、フィルムを読み取るフィルムスキャナとしてもよい。
コンピュータ20は、ハードウェア資源として、USBインターフェース21、表示装置22、入力装置23、補助記憶装置24、CPU25、ROM26、RAM27を有する。コンピュータ20は、汎用的なパーソナルコンピュータを採用可能である。USBインターフェース21は、USB規格に従って周辺装置との間でデータの送受信を行う。表示装置22は、コンピュータ20にインストールされているソフトウェアに基づき、スキャナ10を操作するための各種ユーザインターフェース(UI)など種々の情報を表示する。入力装置23は、キーボード、ポインティングデバイス等で実現され、ユーザからの操作を示す情報を入力する。補助記憶装置24は、内蔵又は外付けのハードディスク等で実現され、スキャナ10の制御プログラムなどスキャナ10の動作に関わる各種情報を記憶する。CPU25は、補助記憶装置24やROM26に記憶されている各種プログラムを、RAM27にロードし、それを実行することでコンピュータ20の動作を制御する。ROM26はコンピュータ20を動作させるための各種プログラムや各種情報を記憶する。RAM27はCPU25のワークエリアとして使用されるほか、各種情報を記憶する。
次に、図2を用いて、図1に示したコンピュータ20においてソフトウェアによって実現される機能の構成を説明する。図2に示す各機能は、例えばCPU25がRAM27をワーク領域としてROM26や補助記憶装置24に記憶された(インストールされた)プログラムを読み込み実行することで実現される。
コンピュータ20の機能は、OS30、アプリケーション40、スキャナドライバ50、第1のボタン監視プログラム60、第2のボタン監視プログラム70、USBインターフェース制御部80に大きく分けられる。
OS30は、コンピュータ20の動作の基本的な部分を司り、表示装置22への出力や入力装置23からの入力の制御、補助記憶装置24などの各種メモリの管理機能などを含む。また、OS30は、TWAINデータソースマネージャ(TWAIN DSM)31、ボタン監視プログラム制御部32、アプリケーション起動部33を備えている。
TWAIN DSM31は、アプリケーション40、スキャナドライバ50を制御する。TWAIN DSM31は、TWAIN規格に従ってアプリケーション40とスキャナドライバ50との通信を実現するAPIである。TWAIN DSM31は、TWAIN規格に準拠したコマンドによりスキャナドライバ50の起動が指示されると、ボタン監視プログラム60にクローズ要求を行う。ボタン監視プログラム制御部32は、スキャナ10などの周辺装置が操作されたかどうかを監視する監視プログラムがコンピュータ20に存在する場合に、その監視プログラムの起動や終了を行う。アプリケーション起動部33は、指定したアプリケーションを起動する機能を提供するAPIにより実現される。
アプリケーション40は、入力された画像データを処理するソフトウェアである。アプリケーション40は、TWAIN DSM31を介してTWAIN規格に準拠したデータソース(スキャナドライバ)に指示して当該データソースから画像データを取得することが可能である。そして、取得した画像データを編集したり補正したりし、その結果を表示装置22に表示させたり、画像ファイルとして補助記憶装置24に記憶させたりする。また、アプリケーション40としては、入力された画像データに含まれる文字情報を認識してそれを文字コードに変換する文字認識ソフト等もある。
スキャナドライバ50は、スキャナ10を制御するためのコマンドの送信やスキャナ10からの画像データの受信等の制御を行うスキャナドライバである。スキャナドライバ50におけるコマンドの送信や画像データの受信は、USBインターフェース制御部80を介して行われる。スキャナドライバ50は、TWAIN規格に準拠した動作を行うTWAINモードと、TWAIN規格外の動作(例えば、RAWデータによる読取画像データの生成等)も可能な非TWAINモードとを有する。スキャナドライバ50は、画像読取装置を特定するためのデバイス情報と対応付けられるが、ここではスキャナ10を示すデバイス情報と対応付けられているものとする。このスキャナ10を示すデバイス情報はスキャナドライバ50と関連付けられた所定のファイルに記録される。ただし、このファイルは、スキャナドライバ50がTWAINモードで動作しTWAINドライバとして機能する際にはデバイス情報が記録されるが、非TWAINモードで動作する際には記録されない。従って、スキャナドライバ50がTWAINモードとして動作する場合には、OS30のTWAIN DSM31によるUSBポートの排他制御が行われるが、非TWAINモードとして動作する場合には、排他制御が行われない。また、スキャナドライバ50は、画像データ取得部51と、TWAIN通信制御部52と、起動プロセス識別部53と、イベント送信部54とを含む。
画像データ取得部51は、スキャナ10により読み取られた画像データを、USBインターフェース制御部80を介して取得する。画像データ取得部51により取得された画像データは、RAM27に記憶された後、TWAIN通信制御部52の制御に従いアプリケーション40に転送される。
TWAIN通信制御部52は、スキャナドライバ50とアプリケーション40のTWAIN規格に準拠したコマンド群の授受を行う。TWAIN通信制御部52は、アプリケーション40から読取解像度やカラーモード、原稿サイズ等の読取設定を受け付け、スキャナドライバ50に設定する。また、アプリケーション40からの画像転送要求に対して、スキャナ10が読み取った画像データがアプリケーション40に転送されるよう制御する。この読取設定の情報や画像データの転送はTWAIN DSM31を介して行われる。
起動プロセス識別部53は、OS30上で現在動作している(起動されている)種々のプログラムを特定する情報を、OS30が管理しているプロセス情報を参照することによって識別する。起動プロセス識別部53は、当該プロセス情報に含まれるいずれのプログラムがスキャナ10と通信するためのUSBポートをオープンしているかも識別可能である。
イベント送信部54は、所定のアプリケーションに対し、プロセス間通信(動作中のプログラム間での通信)を利用して予め定義しておいたイベント情報を送信する。
なお、スキャナドライバ50は、TWAIN対応のアプリケーションからの指示に従った起動だけではなく、ユーザによる直接の操作でスキャナドライバ50を起動させ、さらにユーザからの読み取り指示がなされた場合にも読み取り指示を行うことが可能である。ユーザによる直接の操作とは、ユーザが入力装置23を用いてスキャナドライバ50を起動させ、スキャナドライバ50が有するUI(ユーザインターフェース)画面を表示装置22に表示させ、その画面を介してユーザが読取指示行うことである。この直接の操作が行われた場合に、スキャナドライバ50を非TWAINモードで動作させることができる。
第1のボタン監視プログラム60、第2のボタン監視プログラム70は、スキャナ10を制御するためのコマンドの送信やスキャナ10の状態を表すデータの受信等を行う(以下、単にボタン監視プログラム60または70とする)。このコマンドの送信や状態を表すデータの受信は、USBインターフェース制御部80を介して行われる。また、ボタン監視プログラム60、70は周辺装置を特定するためのデバイス情報と対応付けられるが、ここではスキャナ10を示すデバイス情報と対応付けられているものとする。このスキャナ10を示すデバイス情報はボタン監視プログラム60、70とそれぞれ関連付けられた所定のファイルに記録される。なお、ここでのスキャナ10の状態は、「ボタン」の押下等に限定されるものではなく、ユーザによる何らかの操作があったことを取得できるものであればよい。また、本実施形態では、ボタン監視プログラム60はコンピュータ20(補助記憶装置24)内に複数同時に存在し得る。しかしながら、本実施形態のOS30は、USBインターフェース21を介して接続されたスキャナ10の状態を監視するボタン監視プログラムとしてはいずれか1つのボタン監視プログラムのみを起動させる。以下では、ボタン監視プログラム60、70は任意の1つのみが起動されるものとして説明する。
ボタン監視プログラム60は、ボタンイベント監視部61とイベント受信部62とを有する。なお、ボタン監視プログラム70もボタンイベント監視部71とイベント受信部72とを有するが、ボタンイベント監視部61とイベント受信部62とそれぞれ同様の機能を有するものであるので、以下では説明を省略する。
ボタンイベント監視部61は、スキャナ10の操作パネル16におけるユーザの操作によって発生したボタンイベントの有無を定期的に監視する。ここでは、監視対象のユーザによる操作を“ボタン”の押下として説明するが、上述したようにボタンの押下には限らず、ユーザによる原稿の読み取りを意図した操作であればどのような操作でも構わない。ボタンイベント監視部61は、操作パネル16における読み取り開始等のボタンイベントを検知した場合、OS30のアプリケーション起動部33を介して所定のアプリケーションを起動するよう指示する。ここで、例えば、予め用意しておいたスキャナ10の読取設定に関するファイルを、起動したアプリケーションに渡すことでボタンイベントの検知に連動させてスキャナドライバ50から所望の形式の画像データの取得を行うこともできる。
イベント受信部62は、所定のアプリケーションからプロセス間通信によって予め定義されているイベント情報を受信する。ボタン監視プログラム60は、イベント受信部62で受信したイベント情報がクローズ要求を示すものであると判断した場合、USBインターフェース制御部80を介してUSBポートをオープンする。
また、ボタン監視プログラム60、70は、スキャナ10がUSBインターフェース21を介して接続されたことをOS30が検知すると、所定の通信規格に準拠した手順でUSBポートをオープンする(プラグ&プレイ)。なお、ここでのUSBポートとは、USBインターフェース21を介して通信するための論理的なチャネルのことを指す。このUSBポートのオープンによりUSBインターフェース21を介して接続されているスキャナ10と情報をやり取りするための転送用のパイプが確保される。そして、ここではスキャナ10と通信を行うためのUSBポートは1つのスキャナドライバまたは1つのボタン監視プログラムによって排他的に使用される。ここではスキャナ10との接続開始時には、まずボタン監視プログラムが、スキャナ10からのボタンイベントの監視のためにUSBポートを使用する。もし、ボタン監視プログラムが複数存在していた場合、いずれか1つが所定の条件に従って選択され、起動される。また、ボタン監視プログラム60、70は、USBインターフェース21による接続が絶たれた場合、及びスキャナドライバ50が起動された場合、所定の通信規格に準拠した手順でUSBポートのクローズを行う。
次に、スキャナドライバ50を非TWAINモードで動作させてスキャナ10に読取処理を行わせる場合の処理の流れについて説明する。ここではスキャナドライバ50は、TWAIN規格に準拠したコマンドを用いずにスキャナ10に読取処理を実行させる。図3は、この場合のコンピュータ20における処理のシーケンスの流れを示す。以下のシーケンスは、コンピュータ20のCPU25がROM26、補助記憶装置24に記憶されているプログラムをRAM27にロードし、それを実行することにより行われる処理の流れを示す。
まず、スキャナ10がUSBインターフェース21を介して接続されると、OS30によって1つのボタン監視プログラム(ここではボタン監視プログラム60とする)が起動される。続いてボタン監視プログラム60はスキャナ10と通信を行うための論理的チャネルであるUSBポートをオープンし(A101)、スキャナ10におけるボタンイベントの発生を監視するためのポーリングを繰り返し行う。
ここでユーザからの指示によりスキャナドライバ50が起動されると、表示装置22に、スキャナドライバ50が提供する、読取指示を行うためのUI画面が表示される。このUI画面を介してユーザが読取指示を行うと、スキャナドライバ50は非TWAINモードで動作する。ここではボタン監視プログラム60がUSBポートを確保している間に、スキャナドライバ50が非TWAINモードで起動されたことになる。つまり、TWAIN規格に準拠しない要求に従ってスキャナドライバ50は起動指示がなされている。
ここでは、スキャナドライバ50は、TWAINドライバとして起動されないので、スキャナドライバ50が起動されただけでは、OS30(TWAIN DSM31)によるUSBポートの排他制御は行われない。これはスキャナドライバ50が非TWAINモードで動作する場合、上述したOS30の排他制御を可能とする所定のファイルにデバイス情報を記録しないためである。
そこで、ここでは、スキャナドライバ50が現在USBポートをオープンしている通信プログラム(ボタン監視プログラム)を識別し、そのプログラムに対し、プロセス間通信によりクローズ要求を示すイベントをイベント送信部54により送信する(A201)。USBポートをオープンしているボタン監視プログラムの識別の手順は後述する。
ボタン監視プログラム60のイベント受信部62がA201におけるクローズ要求を示すイベントを受信すると、自身が使用している既にオープンしているUSBポートをクローズする(A102)。そして、ボタン監視プログラム60は、A201におけるクローズ要求に対する応答として、成功を示す情報をスキャナドライバ50に送信する(A202)。
そして、スキャナドライバ50は、USBポートのクローズが成功したことを確認すると、自身がUSBポートを使用可能となり、自身が読取処理を行うため、USBポートをオープンする(A203)。そして、スキャナドライバ50のUI画面で指定された読取設定等に従って、スキャナ10による読取処理を実行させ、読取画像データを取得する。そして、スキャナ10からの読取画像データの取得が終了すると、USBポートをクローズする(A204)。そして、ユーザによる指定に従って、画像ファイルとして当該画像データを補助記憶装置24に保存するなどの処理を行う。なお、画像ファイルを生成して保存する処理は、USBポートをクローズさせる前に行ってもよい。また、画像データの処理としてはファイル保存には限らず、他の処理としてもよい。また、処理内容は予め指定してあった処理を行うようにしてもよいし、読取画像データを受け取った後にユーザからの指示で指定された処理を行うようにしてもよい。
そして、スキャナドライバ50は、読取処理(ここでは読取画像データの取得及びファイル保存)が終了すると、ボタン監視プログラム60に対してオープン要求のイベントを送信する(A205)。これを受けたボタン監視プログラム60はUSBポートをオープンする(A103)。そして、ボタン監視プログラム60によるUSBポートのオープンが成功すると、ボタン監視プログラム60は、オープン要求のイベント送信への応答として成功したことを示す情報を送信する(A206)。ボタン監視プログラム60がUSBポートをオープンし、自身が占有した状態になって以降は、スキャナ10におけるイベントを監視するためのポーリングを再開し、上記起動時の処理と同様の処理を行う。
以上のようなシーケンスにおいて、スキャナドライバ50が、A201におけるイベント送信先のプログラムを識別する処理の詳細について説明する。図4はこの場合の処理の第1の例の流れを示すフローチャートである。このフローチャートは、コンピュータ20のCPU25がROM26、補助記憶装置24に記憶されているプログラムをRAM27にロードし、それを実行することにより行われる処理の流れを示す。
スキャナドライバ50は、非TWAINモードで起動され、ユーザにより読取指示がなされると、S401において、OS30が管理しているプロセス情報の中から、現在起動しているボタン監視プログラム(起動プロセス)を確認する。この確認は、OS30が提供しているAPIを介して、現在起動中の複数のプログラムの中からUSBポートをオープンしているプログラムのIDを識別することにより行われる。もし、スキャナ10と通信するためにUSBポートをオープンする可能性のある通信プログラムがボタン監視プログラム60、70のいずれかしかないことが予めわかっている場合、いずれのプログラムが起動しているかを識別するだけでもよい。
そして、S402では、USBポートをオープンしていたプログラムがAであるかBであるかを判定する。ここでは、該当するプログラムがボタン監視プログラム60、70のいずれかなので、これらのいずれかがAまたはBに対応するが、ここではAがボタン監視プログラム60、Bがボタン監視プログラム70とする。
起動していたプログラムがボタン監視プログラム60であれば、S403において図3のA201におけるイベントの送信先としてボタン監視プログラム60を指定してクローズ要求のイベントを送信する。起動していたプログラムがボタン監視プログラム70であれば、S404において図3のA201におけるイベントの送信先としてボタン監視プログラム70を指定してクローズ要求のイベントを送信する。
そして、その後は図3のA102以降の処理が行われる。S405では、表示装置22に表示させたスキャナドライバ50のUI画面を介してのユーザからの読取指示を待ち、読取指示がなされればスキャナ10による画像の読み取り及び読取画像データの取得等を行われるが、ここでの説明は省略する。
そして、S406では、ユーザがスキャナドライバ50を終了させる処理を行うか、予め指定されていた読取処理が終了したかにより、スキャナドライバ50を終了させるべきか判断する。スキャナドライバ50を終了させるべきと判断された場合、まずスキャナドライバ50がオープンしたUSBポートをクローズさせる。その後、S407において、S403及びS407においてクローズ要求を行ったボタン監視プログラムに対し、オープン要求のイベントを送信し(図3のA205)、スキャナドライバ50を終了させる。
このように、コンピュータ20に複数のボタン監視プログラムが存在しても、起動中のプログラムを識別して、そのプログラムにUSBポートをクローズさせることができる。なお、USBポートを使用するプログラムが3つ以上存在するような環境であっても同様にそれぞれのプログラムのいずれかを識別して、USBポートのクローズを指示すればよい。
次に、スキャナドライバ50が、A201におけるイベント送信先のプログラムを識別する処理の第2の例について説明する。第2の例では、コンピュータ20がUSBインターフェース21を複数有し、それぞれのUSBインターフェースに異なるスキャナが接続可能な場合について説明する。ここでは、複数のスキャナが接続された場合、同時に複数のボタン監視プログラムが起動される。図5はこの場合の処理の流れを示すフローチャートであり、コンピュータ20のCPU25がROM26、補助記憶装置24に記憶されているプログラムをRAM27にロードし、それを実行することにより行われる処理の流れを示す。
S501では、S401と同様にUSBポートをオープンしているプログラムを確認する。なお、ここでは、ボタン監視プログラムが起動していることは確認できるが、いずれのプログラムが複数のUSBインターフェースのうちのいずれに対応したUSBポートをオープンしているかまでは確認できないものとする。ここでの確認結果(S502)は、図4の結果以外に、AとBの両方という結果となる可能性がある。AまたはBであった場合は、S503、S504において、S403、S404と同様の処理を行う。AとBの両方であった場合は、S505に進み、まず、ボタン監視プログラム60を送信先としてクローズ要求のイベント送信を行う。
そして、スキャナドライバ50は、S506において、自身が使用するスキャナを接続しているUSBインターフェースに対応するUSBポートの状態を確認する。この確認の結果、S507においてUSBポートがオープンされたままであったと判断された場合、S508に進み、S505のイベント送信からX秒(Xは予め決められた時間)経過したか判断する。ここでX秒が経過していなかった場合、S506以降の処理を繰り返す。X秒が経過してもUSBポートがオープンされたままであった場合はタイムアウトとし、S509におけるイベント送信先のボタン監視プログラムはスキャナドライバ50が使用しようとしているUSBポートをオープンしていなかったものと決定する。そしてS509に進み、ボタン監視プログラム70を送信先としてクローズ要求のイベント送信を行う。そして、S510においてS506と同様にUSBポートの状態を確認し、S511でUSBポートがクローズされたことを確認すると、S512に進む。また、先のS507でUSBポートがクローズされたことを確認した場合もS512に進む。
そして、S512における処理を行うに当たって図3のA102以降の処理が行われる。S512では、S405と同様にユーザからの読取指示を待ち、S513では、S406と同様にスキャナドライバ50を終了させるか判断する。
S514では、S407と同様に、まず、自身がオープンしていたUSBポートをクローズする。そして、S503、S504、S505、S509のUSBポートのクローズ要求に対しUSBポートをクローズしたボタン監視プログラムに対し、オープン要求を行う。S503でボタン監視プログラム60に対しクローズ要求を行っていた場合は、S514でボタン監視プログラム60に対しオープン要求を行う。S504でボタン監視プログラム70に対しクローズ要求を行っていた場合は、S514でボタン監視プログラム70に対しオープン要求を行う。S505でボタン監視プログラム60に対しクローズ要求を行った結果、S507で否定判定が行われた場合はS514でボタン監視プログラム60に対しオープン要求を行う。S509でボタン監視プログラム70に対しクローズ要求を行った結果、ボタン監視プログラム70がUSBポートをクローズさせた場合は、S514でボタン監視プログラム70に対しオープン要求を行う。そして、いずれかのボタン監視プログラムによるUSBポートのオープンに成功すると、スキャナドライバ50は終了する。
以上のように図5に示したような処理によれば、USBポートを使用するプログラムが複数起動し得る環境であっても適切に起動中のプログラムに対し、USBポートのクローズを指示することができる。なお、図5の例では、複数のボタン監視プログラムが起動されている場合、まずボタン監視プログラム60にクローズ要求を行うようにしたが、この順序はプログラム毎の優先順位等で決定するようにすればよく、種々の順序としてもよい。また、図5の例では、USBポートを使用し得るプログラムが2つの例で説明したが、3つ以上存在する場合でも起動中のプログラムの確認手順を追加して同様の処理とすればよい。
次に、図5で示した第2の例において、ボタン監視プログラムに対するイベント送信の処理にスレッドを用いる例について説明する。図6はこの場合の処理の流れを示すフローチャートであり、コンピュータ20のCPU25がROM26、補助記憶装置24に記憶されているプログラムをRAM27にロードし、それを実行することにより行われる処理の流れを示す。図6(A)は、メインの処理を示し、図6(B)、(C)はイベント送信用のスレッドによる処理を示す。
S601では、S501と同様にUSBポートをオープンしているプログラムを確認する。そして、S602において、起動中のボタン監視プログラムの確認結果を判断する。
この確認結果において、起動中のボタン監視プログラムが1つのみであれば、S603、またはS605でS503、S504と同様にそのボタン監視プログラムに対しクローズ要求のイベントを送信する。S604、S606ではイベント送信の結果、USBポートのクローズに成功したか否かを、イベント送信先のボタン監視プログラムと対応付けてRAM27に保存する。
S602における確認結果において、起動中のボタン監視プログラムが、ボタン監視プログラム60と70の両方であった場合、S607、S608においてそれぞれのボタン監視プログラムに対し、イベント送信を行うためのスレッドを作成する。ここでイベント送信用のスレッドが作成されると、それぞれのスレッドが並行して実行される。ボタン監視プログラム60に対するイベント送信の処理は図6(B)であり、ボタン監視プログラム70に対するイベント送信の処理は図6(C)である。S651、S661ではそれぞれのボタン監視プログラムに対し、USBポートのクローズを要求するイベントを送信する。S652、S662ではイベント送信の結果、USBポートのクローズに成功したか否かをボタン監視プログラムと対応付けてRAM27に保存する。
S609では、S607、S608におけるイベント送信用スレッドの作成から一定時間待機し、S610において、イベント送信用のスレッドによる処理が完了しているか(RAM27に結果が保存されているか)判断し、完了するまで待つ。
そして、S611では、RAM27に保存されているイベント送信の結果、USBポートのクローズに成功した方のボタン監視プログラムを識別する。この識別結果はRAM27に保存しておく。
そして、S612における処理を行うに当たって図3のA102以降の処理が行われる。S612では、S512と同様にユーザからの読取指示を待ち、S613では、S513と同様にスキャナドライバ50を終了させるか判断する。
S614では、スキャナドライバ50がオープンしていたUSBポートをクローズさせる。その後、S604、S606、S611においてRAM27に保存されたイベント送信の結果、USBポートをクローズさせることに成功したボタン監視プログラムに対し、オープン要求のイベントを送信する。そして、ボタン監視プログラムによるUSBポートのオープンに成功すると、スキャナドライバ50は終了する。
以上のように図6に示したような処理によれば、USBポートをオープンしているプログラムの識別を、複数のイベント送信を並行して行えるなど、図5の処理よりも効率的に行える。また、図6の例では、USBポートを使用し得るプログラムが2つの例で説明したが、3つ以上存在する場合でもイベント送信処理用のスレッドを追加して同様の処理とすればよい。
なお、以上の例において、スキャナドライバ50は、TWAINモードと非TWAINモードとを有するものとしたが、非TWAINモードでのみ動作可能なものとしてもよい。また、OS30が、TWAINモードでスキャナドライバが起動されるときにUSBポートの排他制御を行うものとしたが、このような排他制御機能を有さないOSとしてもよい。また、ボタン監視プログラムは、OS30による排他制御を可能とするための所定のファイルにデバイス情報を記録しないものであってもよい。
また、以上の例では、スキャナドライバ50が非TWAINモードで起動されたときに、図4〜6に示したようにボタン監視プログラムがオープンしているUSBポートをクローズさせるものとしたが、このタイミングには限らない。スキャナドライバ50が起動された後、スキャナドライバ50のUI画面を介して読取指示がなされた場合に、ボタン監視プログラムがオープンしているUSBポートをクローズさせるようにしてもよい。
また、以上の例では、USBポートをオープンしているボタン監視プログラムの識別、ボタン監視プログラムに対するクローズ要求を、スキャナドライバ50が行うものとしたが、これには限らない。スキャナドライバ50とは別に起動されるアプリケーションにおいて、非TWAINモードで動作するスキャナドライバの起動が指示されたことを判定し、図3〜図6を用いて説明した処理のうち、読取処理以外の処理を行うようにしてもよい。
また、以上の例では、スキャナとのインターフェースとしてUSBを用いる例について説明したが、通信用チャネルの排他制御を行う必要のあるものであれば、他のインターフェースとしてもよい。これは、ローカルインターフェース、ネットワークインターフェースのいずれでもよい。
また、スキャナとコンピュータとは外部接続されるものにも限らず、以上の例におけるスキャナに相当する機能とコンピュータに相当する機能とが内部的に接続され、一体化されたものとしてもよい。
また、周辺装置として、スキャナ以外のものを用いたものとしてもよい。例えば、周辺装置としてプリンタを用い、プリンタドライバが印刷用の画像データの通信を行う場合と、プリンタにおけるイベントを監視するプログラムがイベントの通信を行う場合とで通信用チャネルの排他制御を行うものであってもよい。即ち、周辺装置との間で画像データの通信を行うデバイスドライバと、周辺装置との間で行う通信を行う他の通信プログラムとの間での排他制御を行うものとすればよい。
また、本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施例の機能を実現するソフトウェア(プログラム)を、ネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(またはCPUやMPU等)がプログラムを読み出して実行する処理である。また、プログラムは、1つのコンピュータで実行させても、複数のコンピュータが連動して実行するようにしてもよい。また、上記した処理の全てをソフトウェアで実現する必要はなく、一部または全部をハードウェアによって実現するようにしてもよい。
また、本発明は上記実施形態に限定されるものではなく、本発明の趣旨に基づき種々の変形(他の実施形態への応用、他の実施形態との組合せ等を含む)も可能である。