C/C++からWIAを使うにはWIA APIを使います。WIA APIを使うにはWindows SDKをインストールする必要があります。
デバイスとデバイス内のオブジェクトWAI API内ではデバイスとデバイス内のオブジェクト(画像等)はItemという概念で抽象化され、ツリー構造によって表現されます。 それぞれのItemはIWiaItemインターフェースやIWiaItem2インターフェースによって表現されます。 ツリーの最上位の階層にはデバイスを表現するItemが置かれます。デバイスマネージャ(IWiaDevMgr)が直接扱うItemはこれらのデバイスとなります。したがって、IWiaDevMgrのメソッドを使えばデバイスを列挙したり、メソッドを介してデバイスやデバイスの持つItemにアクセスする経路を確保することができます。
デバイスにアクセスするには、デバイスを表現するItem(IWiaItemインターフェースやIWiaItem2インターフェース)をインスタンス化してそれを利用します。デバイスを表現するItemをインスタンス化するにはいくつか方法があります。
一つはIWiaDevMgrの持つSelectDeviceDlgメソッドを使う方法です。このメソッドはデバイス選択のダイアログを表示して、選択されたデバイスのIWiaItemを返します。デバイスマネージャ(IWiaDevMgr)のCreateDeviceメソッドを使ってデバイスのIWiaItemを作ることもできます。 このメソッドはDeviceIDを指定することでデバイスを特定します。この他にもデバイスを表現するItemのインスタンスを作る方法があるかもしれません。
ローカルマシンに接続されているWIAデバイスの数を調べるには、デバイスマネージャ(IWiaDevMgrのEnumDeviceInfoメソッドを使って、 取得したIEnumWIA_DEV_INFOインターフェースのGetCountメソッドを使います。 デバイスマネージャからもっと簡単にデバイス数を調べる方法があってもよさそうですが、 SDKのサンプル(WiaWrap.cpp)をみてもこれ以外の方法はなさそうです。
ULONG getDeviceCount( IWiaDevMgr *pWiaDevMgr ) { HRESULT hr; IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL; ULONG count = 0; // デバイス列挙のためのインターフェイスIEnumWIA_DEV_INFOを取得 hr = pWiaDevMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_LOCAL, // Should be set to WIA_DEVINFO_ENUM_LOCAL &pWiaEnumDevInfo ); if ( !SUCCEEDED( hr ) ) { // エニュメレータの生成に失敗 return 0; } hr = pWiaEnumDevInfo->GetCount( &count ); if ( FAILED( hr ) ) { return 0; } pWiaEnumDevInfo->Release(); return count; }
IEnumWIA_DEV_INFO | デバイスとデバイスのプロパティの列挙 |
IWiaDevMgr | デバイスマネージャ |
IWiaEventCallback | WIAイベントのためのコールバック |
IWiaPropertyStorage | プロパティへのアクセス |
IEnumWIA_DEV_INFOを使うことで、WIAデバイスを列挙したり、デバイスのプロパティを列挙することができます。IEnumWIA_DEV_INFOはIWiaDevMgr(デバイスマネージャ)のEnumDeviceInfoメソッドをから取得することができます。 デバイスの列挙を始める前にResetメソッドを使ってエニュメレータをリセットする必要があります。デバイスのプロパティはプロパティストレージ(IWiaPropertyStorage)を使って取得することができます。IWiaPropertyStorageはNextメソッドを使って取得することができます。Nextメソッドは呼ばれるたびに次のデバイスのプロパティストレージを返し、次のデバイスがなくなると(リストの最後)S_FALSEを返しますので、Resetメソッドを呼んだ後、ループ内でNextメソッドがS_FALSEを返すまで繰り返しNextメソッドを呼び出すことで、それぞれのデバイスのプロパティストレージを列挙することができます。
メソッド | 説明 |
---|---|
Clone | このIEnumWIA_DEV_INFOインターフェースの複製(クローン)を作成 |
GetCount | このエニュメレータに保存されているエレメントの数を取得 |
Next | 次のエレメントに移動してプロパティストレージ(IWiaPropertyStorage)を取得 |
Reset | 列挙動作をリセット。次にNextメソッドを実行すると最初のエレメントのプロパティストレージが取得される |
Skip | - |
以下は個々のデバイスのプロパティストレージを取得するサンプルコードです。
// pWiaDevMgr: IWiaDevMgrのインスタンスへのポインタ IEnumWIA_DEV_INFO *pWiaEnumDevInfo = NULL; IWiaPropertyStorage *pWiaPropertyStorage = NULL; ULONG deviceCount = 0; HRESULT hr; // デバイス列挙のためのインターフェースIEnumWIA_DEV_INFOを取得 pWiaDevMgr->EnumDeviceInfo( WIA_DEVINFO_ENUM_LOCAL, // Should be set to WIA_DEVINFO_ENUM_LOCAL &pWiaEnumDevInfo ); // 列挙を開始するためにエニュメレータをリセット hr = pWiaEnumDevInfo->Reset(); // エラーが発生するかpWiaEnumDevInfo->NextがS_FALSEによってリストの最後を知らせるまでループ while ( hr == S_OK ) { // 次のデバイスのプロパティストレージのポインタを取得 hr = pWiaEnumDevInfo->Next( 1, &pWiaPropertyStorage, NULL ); // リストの最後に達したらpWiaEnumDevInfo->NextはS_FALSEを返すので // pWiaPropertyStorageを使う前に返り値がS_OKであることを確認する if ( hr == S_OK ) { deviceCount++; // pWiaPropertyStorageを使ってプロパティを取得する // デバイスのIWiaPropertyStorage*をリリース pWiaPropertyStorage->Release(); pWiaPropertyStorage = NULL; } else if ( FAILED( hr ) ) { // エラー } } // エニュメレータを開放 pWiaEnumDevInfo->Release(); pWiaEnumDevInfo = NULL;
IWiaDeviceMgr(デバイスマネージャ)インターフェースは、アプリケーションへのWIAイベントの通知を許可(イベントの登録)したり、 ローカルマシンに接続されているWIAデバイスを列挙したりするために用いられます。また、SelectDeviceDlgメソッドのように特定のデバイスを選択する機能も持っています。IWiaDeviceMgrインターフェースを起点として、すべてのWIAデバイスにアクセスすることができますので、アプリケーションは、通常は最初にこのインターフェースのインスタンスを生成します。
Windows Vistaではこのインターフェースに代わりにIWiaDevMgr2を使う必要があります。msdnではこのように書かれていますが、Vista以降WIAの仕様が変更されています(VideoPreviewの機能など)で、Vista以降はIWiaDevMgr2を使う必要があると思います(未確認)。
メソッド | 説明 |
---|---|
CreateDevice | - |
EnumDeviceInfo | それぞれのWIAデバイスの情報の列挙 |
GetImageDlg | - |
RegisterEventCallbackCLSID | WIAアーキテクチャ互換のCOMコンポーネントとして作られたアプリケーションをイベントに登録または登録から削除 |
RegisterEventCallbackInterface | 実行中のアプリケーションがコールバックにIWiaEventCallbackインターフェースを使ってイベントに登録または登録を削除 |
RegisterEventCallbackProgram | イベントにプログラムを登録(プログラムをコマンドライン文字列で指定するバージョン) |
SelectDeviceDlg | WIAデバイスを選択するためのダイアログを表示 |
SelectDeviceDlgID | - |
IWiaDeviceMgrインターフェースのインスタンスを生成するサンプルコードです。WIAを使うアプリケーションは、通常プログラムの冒頭でIWiaDeviceMgrインターフェースのインスタンスを生成することでIWiaDeviceMgrの機能を利用できるようにします。
HRESULT hr = CoCreateInstance( CLSID_WiaDevMgr, NULL, CLSCTX_LOCAL_SERVER, IID_IWiaDevMgr, (void**)ppWiaDevMgr ); if ( FAILED(hr) ) { // Error!! }
EnumDeviceInfoメソッドはデバイス列挙のためのメソッドですが、このメソッド自身はデバイスの列挙を直接行わずに、デバイス列挙のために用いられるIEnumWIA_DEV_INFOインターフェースを返します。
RegisterEventCallbackCLSIDメソッドはWIAイベントをアプリケーションが受信できるように登録するために用いられます。このメソッドで登録されたアプリケーションは実行されていないときでもWIAイベントを受信できるようになります。
HRESULT RegisterEventCallbackCLSID( [in] LONG lFlags, [in] BSTR bstrDeviceID, [in] const GUID *pEventGUID, [in] const GUID *pClsID, [in] BSTR bstrName, [in] BSTR bstrDescription, [in] BSTR bstrIcon );
メンバー | 説明 | |
---|---|---|
lFlags | WIA_REGISTER_EVENT_CALLBACK | WIAイベントにアプリケーションを登録 |
WIA_UNREGISTER_EVENT_CALLBACK | WIAイベントに登録されているアプリケーションを登録から削除 | |
WIA_SET_DEFAULT_HANDLER | アプリケーションをデフォルトのイベントハンドラとして登録 | |
bstrDeviceID | イベント捕捉の対象とするWIAデバイスをデバイスIDで指定。NULLを指定するとすべてのWIAデバイスのWIAイベントを対象とする | |
pEventGUID | アプリケーションをどのイベントに登録するか指定。標準イベントの一覧についてはWIA Event Identifiersを参照してください | |
pClsID | アプリケーションのクラスIDへのポインタ。WIAのランタイムシステムはイベントが発生したときに、登録されたアプリケーションを起動するためにアプリケーションのCLSIDを使います | |
bstrName | 登録するアプリケーションの名前 | |
bstrIcon | 登録するアプリケーションのアイコンに用いる画像ファイルの名前 |
WIAアプリケーションはWIA_ACTION_EVENTタイプのイベントを受信できるように登録するためにこのメソッドを用います。 このメソッドを使ってアプリケーションをイベントに登録すると、アプリケーションが実行されていないときでもイベントを受信できるようになります。
イベントが発生したとき、WIAシステムはイベントを受信するためのどのアプリケーションが登録されているか調べます。このとき、アプリケーションのインスタンスを作るためにCoCreateInstance関数とpClsIDパラメータで指定したクラスIDが用いられます。WIAシステムはアプリケーションのインスタンスを作った後、イベント情報を送るためにアプリケーションのEnumRegisterEventInfoメソッドを呼び出します。
イベントの登録情報を列挙するにはEnumRegisterEventInfoメソッドを使います。アプリケーションはイベントの列挙で返されるWIA_DEV_CAP構造体のulFlags値を調べることで、イベントがアクションタイプか通知タイプかを知ることができます。アプリケーションがCOMコンポーネントでなく、WIAアーキテクチャとの互換性がない場合、このメソッドの代わりにIWiaDevMgr::RegisterEventCallbackProgramメソッドを使います。
msdnの説明ではマルチスレッド環境での制限が述べられていますが、意味が良くわかりません。「マルチスレッドアプリケーションでは、コールバックが登録されたスレッドと同じスレッドでイベント通知コールバックされるかは保証されない」という意味でしょうか?
RegisterEventCallbackCLSIDメソッドはWIAイベントをアプリケーションが受信できるように登録するために用いられます。このメソッドで登録されたアプリケーションは実行されていないときでもWIAイベントを受信できるようになります。
HRESULT RegisterEventCallbackInterface( [in] LONG lFlags, [in] BSTR bstrDeviceID, [in] const GUID *pEventGUID, [in] IWiaEventCallback *pIWiaEventCallback, [out] IUnknown **pEventObject );
メンバー | 説明 | |
---|---|---|
lFlags | 現在この引数は使われていません。ゼロをセットする必要があります | |
bstrDeviceID | イベント捕捉の対象とするWIAデバイスをデバイスIDで指定します。NULLを指定するとすべてのWIAデバイスのWIAイベントを対象とします | |
pEventGUID | アプリケーションをどのイベントに登録するか指定します。標準イベントの一覧についてはWIA Event Identifiersを参照してください | |
pIWiaEventCallback | アプリケーションをどのイベントに登録するか指定します。標準イベントの一覧についてはWIA Event Identifiersを参照してください。WIAシステムがイベントの通知に用いるIWiaEventCallbackインターフェースのポインタです | |
pEventObject | IUnknownインターフェースへのポインタが返ります |
IUnknownインターフェースへのポインタが返ります。
WIAアプリケーションは実行中にWIA_NOTIFICATION_EVENTタイプのイベントの受信を登録するためにこのメソッドを使います。これはイベントのとうろくによってアプリケーションが再スタートすることを防ぎます。プログラムが自分自身でWIAイベントの受信を登録するためにRegisterEventCallbackInterface メソッドを呼び出すと、WIAイベントはWIAしすてむによってそのプログラムに送られるようになります。
アプリケーションはイベント登録情報(プロパティ)のためのエニュメレータオブジェクトのポインタをEnumRegisterEventInfoメソッドを使って取得することができます。
アプリケーションはイベントの列挙で返されるWIA_DEV_CAP構造体のulFlags値を調べることでイベントがアクションタイプか通知タイプかを知ることができます。
アプリケーションはIUnknownポインタを使ってReleaseメソッドを呼び出すことでイベントへの登録を削除することができます。IUnknownポインタはこのメソッドの引数pEventObjecに返されます。
HRESULT RegisterEventCallbackProgram( [in] LONG lFlags, [in] BSTR bstrDeviceID, [in] const GUID *pEventGUID, [in] BSTR bstrCommandline, [in] BSTR bstrName, [in] BSTR bstrDescription, [in] BSTR bstrIcon );
メンバー | 説明 | |
---|---|---|
lFlags | WIA_REGISTER_EVENT_CALLBACK | イベントにアプリケーションを登録 |
WIA_UNREGISTER_EVENT_CALLBACK | イベントへのアプリケーションの登録を削除 | |
WIA_SET_DEFAULT_HANDLER | アプリケーションをイベントのデフォルトハンドラとして登録 | |
bstrDeviceID | イベント捕捉の対象とするWIAデバイスをデバイスIDで指定します。NULLを指定するとすべてのWIAデバイスのWIAイベントを対象とします | |
pEventGUID | アプリケーションをどのイベントに登録するか指定します。標準イベントの一覧についてはWIA Event Identifiersを参照してください | |
bstrCommandline | アプリケーションを呼び出すために必要とされるフルパスとコマンドライン引数を指定します。msdnの説明では、この引数の値は以下の例のようにダブルクォーテーションで囲まれた2つのブロックを持つフォーマットで指定しなければならないと書かれています。
"\"C:\Program Files\MyExe.exe\" /arg1"しかしこのとおりにするとイベントが発生したときに登録したプログラムが起動できません。 WIAのアプリケーション選択ダイアログを表示すると、プログラムはリストに登録されていますが、 それを選択してもプログラムが起動しません。他のデバイスのレジストリを解析してみると、 パス名の前後の「\」や「"」は不要で、以下のように単純にパスとコマンドライン引数を指定すれば良い様です(このほかに「\」をエスケープする必要があります)。 "C:\\Program Files\\MyExe.exe /arg1" | |
bstrName | アプリケーションの名前を指定します。この名前は同じイベントに複数のアプリケーションが登録されたときにユーザーに表示されます | |
bstrDescription | アプリケーションを説明する文字列を指定します。これは同じイベントに複数のアプリケーションが登録されたときにユーザーに表示されます | |
bstrIcon | アプリケーションを表現するアイコンを指定します。アイコンは同じイベントに複数のアプリケーションが登録されたときにユーザーに表示されます。この文字列はアプリケーションの名前とアイコンのインデックス(ゼロから始まる)を含み、それぞれはカンマで区切られます。たとえば、次のようになります。
"MyApp, 0"仕様書には書かれていませんが、これに空の文字列 "" を指定すると、デフォルトのアイコンが適用されます |
このメソッドはWIA_ACTION_EVENTタイプのWIAイベントをアプリケーションが受信できるようにするためにアプリケーションをイベントに登録します。アプリケーションの登録されたイベントが発生したとき、アプリケーションが起動されイベントの情報はアプリケーションに送られます。
アプリケーションはイベント登録情報(プロパティ)のためのエニュメレータオブジェクトのポインタをEnumRegisterEventInfoメソッドを使って取得することができます。
アプリケーションはイベントの列挙で返されるWIA_DEV_CAP構造体のulFlags値を調べることでイベントがアクションタイプか通知タイプかを知ることができます。
プログラムはWIAアーキテクチャのために書かれないアプリケーションとの互換性のためだけにこのメソッドを利用する必要があります。 新しいアプリケーションはWIAアーキテクチャによって提供されるCOMインターフェースを使う必要があります(RegisterEventCallbackInterfaceメソッド、またはRegisterEventCallbackCLSIDメソッド)。
通常このメソッドはインストールプログラムやインストール用のスクリプトによって呼び出されます。インストールプログラムやインストールスクリプトは受信するWIAイベントにアプリケーションを登録します。イベントが発生すると、アプリケーションはWIAランタイムシステムによって起動されます。
RegisterEventCallbackProgramメソッドで登録されるプログラムは次のような呼ばれ方をします。
WIAのランタイムシステムはWIAイベントが発生したときに、登録されているプログラムがあればそれを呼び出します。その際にプログラムのパス(argv[0])も含めて4つのコマンドライン引数を渡します。
引数 | 説明 |
---|---|
argv[0] | Cランタイムシステムで規定される実行プログラムのパス |
argv[1] | RegisterEventCallbackProgramメソッドでの引数bstrCommandlineでプログラムのパスとともに指定した< |
argv[2] | 以下のような書式でWIAランタイムシステムからイベントを発生したデバイスのDeviceIDが渡されます。
/StiDevice:{6BDD1FC6-810F-11D0-BEC7-08002BE2092F}\0000 |
argv[2] | 以下のような書式でWIAランタイムシステムから発生したイベントのEventIDが渡されます。
/StiEvent:{A28BBADE-64B6-11D2-A231-00C04FA31809} |
SelectDeviceDlgメソッドを実行すると、以下のようなダイアログにWIAデバイスの一覧が表示され、 その中からデバイスを選択することができます。このメソッドは選択されたデバイスのDeviceID(BSTR)とそのデバイスにアクセスするためのIWiaItemインターフェースを返します。
msdnのドキュメントでは必要なヘッダはWia.hとありますが、第2引数lDeviceTypeに StiDeviceTypeDefault、StiDeviceTypeScanner、 StiDeviceTypeDigitalCameraを指定するためにはsti.hもincludeする必要があります(これらはSTIの定義を流用しているようです)。
IWiaEventCallbackインターフェースはWIAイベントをアプリケーションが取り出すために用います。アプリケーションはイベントを受信するために、RegisterEventCallbackInterfaceメソッドにIWiaEventCallbackのポインタを渡します。IWiaEventCallbackインターフェースはIUnknownインターフェースを継承します。
メソッド | 説明 |
---|---|
ImageEventCallback | このメソッドはWIAイベントが発生したときにWIAランタイムシステムによって呼び出されます |
QueryInterface |
AddRef |
Release |
ImageEventCallbackメソッドはWIAデバイスイベントが発生したときにWIAランタイムシステムによって呼び出されます。
HRESULT ImageEventCallback( [in] const GUID *pEventGUID, [in] BSTR bstrEventDescription, [in] BSTR bstrDeviceID, [in] BSTR bstrDeviceDescription, [in] DWORD dwDeviceType, [in] BSTR bstrFullItemName, [in, out] ULONG *pulEventType, [in] ULONG ulReserved );
メンバー | 説明 | |
---|---|---|
pEventGUID | イベントIDを指定します。デバイスイベントの一覧については、「WIA Event Identifiers」を参照してください | |
pEventGUID | イベントを説明する文字列を指定します | |
bstrDeviceID | (受信するイベントを発生する)デバイスのデバイスIDを指定します | |
bstrDeviceDescription | (受信するイベントを発生する)デバイスを説明する文字列を指定します | |
dwDeviceType | (受信するイベントを発生する)デバイスのタイプを指定します。設定可能な値については「WIA Device Type Specifiers」を参照してください | |
bstrFullItemName | デバイスを表現するWIAアイテムのフルネームを指定します | |
pulEventType | (対象の)イベントが通知イベントかアクションイベントかを示すULONGへのポインタ | |
1 | 通知イベント | |
2 | アクションイベント | |
3 | 通知/アクションイベント | |
ulReserved | - |
WIAイベントの通知を受信するためにアプリケーションはRegisterEventCallbackInterfaceメソッドの引数にIWiaEventCallbacインターフェースのポインタを渡します。 WIAランタイムシステムはWIAイベントが発生したときに、このインターフェースポインタを使ってこのメソッド(ImageEventCallback)を呼び出します。
GUID: IID_IWiaPropertyStorage
IWiaPropertyStorageインターフェースはアイテム(IWiaItem)で表現されるオブジェクトのプロパティへのアクセスを提供します。このインターフェースはIWiaItemオブジェクトのQueryInterfaceメソッドを使って取得することができます。デバイスマネージャ(IWiaDevMgn)オブジェクトのEnumDeviceInfoメソッドを使って取得したIEnumWIA_DEV_INFOインターフェースからも取得することができます。次のコードはIWiaItemオブジェクトのQueryInterfaceメソッドを使ってIWiaItemオブジェクトのIWiaPropertyStorageインターフェースを取得します。
IWiaPropertyStorage *pWiaPropertyStorage = NULL; HRESULT hr; hr = pWiaItem->QueryInterface( IID_IWiaPropertyStorage, (void**)&pWiaPropertyStorage ); if ( !SUCCEEDED( hr ) ) { // ERROR!! }
メソッド | 説明 |
---|---|
GetCount | プロパティストレージ中に保存されているプロパティの数を返す |
GetPropertyAttributes | - |
GetPropertyStream | - |
SetPropertyStream | - |
上記以外に、プロパティのリード/ライトなどの基本的な操作はIPropertyStorageから継承されたメソッドを利用することができます。
GetCountメソッドを使うと、プロパティストレージ中に保存されているプロパティの数を調べることができます。
// pWiaPropertyStorage: IWiaPropertyStorageインターフェースポインタ ULONG numProp; pWiaPropertyStorage->GetCount( &numProp ); printf( "numProp = %d\n", numProp );
プロパティストレージからプロパティを取得するにはIPropertyStorageインターフェースから継承されたReadMultipleメソッドを使います。
DeviceNameやDeviceIDなどのプロパティはIWiaPropertyStorageを使うことで取得することができます。
プロパティ値へのアクセスでプロパティを特定するにはプロパティIDまたはプロパティの名前を使います。このIDと名前はWindows SDKのWiaDef.hでマクロによって定義されています。プロパティIDにはWIA_DIP_DEV_IDのように「WIA_DIP_」という名前が付けられます。プロパティ名にはWIA_DIP_DEV_ID_STRのようにプロパティIDに付けられた名前の最後に「_STR」が付きます。
WIAイベント識別子はWindows SDKのWiaDef.hでGUIDとして定義されています。
WIA_EVENT_CANCEL_IO | アプリケーションがデータ転送のキャンセルを試みた |
WIA_EVENT_DEVICE_CONNECTED | WIAデバイスがマシンに接続された |
WIA_EVENT_DEVICE_DISCONNECTED | WIAデバイスとマシンの接続が切断された |
WIA_EVENT_ITEM_CREATED | WIAデバイスにアイテムが追加された |
WIA_EVENT_ITEM_DELETED | WIAデバイスのアイテムが削除された |
WIA_EVENT_POWER_RESUME | コンピュータまたはデバイスの電源がレジュームされた |
WIA_EVENT_POWER_SUSPEND | コンピュータまたはデバイスの電源がサスペンドされた |
WIA_EVENT_SCAN_EMAIL_IMAGE | e-mailのための画像スキャンが開始された |
WIA_EVENT_SCAN_FAX_IMAGE | Faxのための画像スキャンが開始された |
WIA_EVENT_SCAN_FILM_IMAGE | フィルムアダプターからのための画像スキャンが開始された |
WIA_EVENT_SCAN_IMAGE | 画像スキャンが開始された |
WIA_EVENT_SCAN_IMAGE2 | 画像スキャンが開始された。このイベントを使ってスキャナは別のアプリケーションを起動する(1つ以上の)スキャンボタンを持つことができる |
WIA_EVENT_SCAN_IMAGE3 | 画像スキャンが開始された。このイベントを使ってスキャナは別のアプリケーションを起動する(1つ以上の)スキャンボタンを持つことができる |
WIA_EVENT_SCAN_IMAGE4 | 画像スキャンが開始された。このイベントを使ってスキャナは別のアプリケーションを起動する(1つ以上の)スキャンボタンを持つことができる |
WIA_EVENT_SCAN_OCR_IMAGE | 画像のOCR処理のために画像のスキャンが開始された |
WIA_EVENT_SCAN_PRINT_IMAGE | 印刷のための画像のスキャンが開始された |
WIA_EVENT_STI_PROXY | 使用不可(WIA内部でのみ使用) |
WIA_EVENT_STORAGE_CREATED | (flash cardのような)ストレージがデバイスに接続された |
WIA_EVENT_STORAGE_DELETED | (flash cardのような)ストレージがデバイスから取り外された |
WIA_EVENT_TREE_UPDATED | WIA Item Treeが更新された |
WIA_EVENT_VOLUME_INSERTED | (flash cardのような)ストレージデバイスがデバイスに挿入された。Windows SDK 7.1ではこのイベントは削除されているようです |
msdn: Registering for Eventsにイベントにアプリケーションを登録する例があります。このサンプルはWIAデバイスの接続イベントをアプリケーションが受信できるようにするためにWIA 1.0 のIWiaDevMgr::RegisterEventCallbackCLSIDメソッドを使います。アプリケーションはイベントに登録するためにWIA 1.0のIWiaDevMgr::RegisterEventCallbackInterface や、同じくWIA 1.0のIWiaDevMgr::RegisterEventCallbackProgramを使うこともできます。
Windows Vista以降ではWIA 2.0でサポートされる以下のメソッドを使うこともできます。
IWiaDevMgr2::RegisterEventCallbackCLSID IWiaDevMgr2::RegisterEventCallbackInterface IWiaDevMgr2::RegisterEventCallbackProgram
このサンプルではCOMのアウトオブプロセスサーバーオブジェクト(out-of-process server object)として登録されたアプリケーションを登録することを想定しています。このサンプルのpWiaDevMgrはIWiaDevMgr (またはIWiaDevMgr2)インターフェースへのポインタです。WIA_REGISTER_EVENT_CALLBACK はこのコールがイベントへのプログラムの登録であることを示す定数です。登録を削除するにはWIA_EVENT_DEVICE_CONNECTED を使います。
このサンプルにおけるRegisterEventCallbackCLSIDメソッドの引数の意味は以下のとおりです。
pCLSID | アプリケーションが登録されているCLSIDへのポインタ |
bstrDescription | アプリケーションの説明 |
bstrIcon | アプリケーションのアイコンに用いられる画像ファイル |
登録されるアプリケーションはIWiaEventCallback::ImageEventCallbackメソッドを実装している必要があります。このメソッドはイベントが発生したときに呼び出されます。アプリケーションは登録されたイベントの情報を列挙するためにIWiaItem::EnumRegisterEventInfo (または IWiaItem2::EnumRegisterEventInfo)メソッドを使うことができます。
APIを使ったWIAデバイスの制御では以下のいずれかのメソッドを使ってイベントにアプリケーションを登録します。
メソッド | イベントタイプ | 説明 |
---|---|---|
RegisterEventCallbackCLSID | Action | CLSIDを使ってアプリケーションを指定する |
RegisterEventCallbackInterface | Action(*1) | IWiaEventCallbackインターフェースを使ってコールバックさせる。アプリケーションの実行中に使用する |
RegisterEventCallbackProgram | Action | パスを使ってアプリケーションを指定する。RegisterEventCallbackCLSIDとRegisterEventCallbackProgramの動作は良く似ていますが、 イベントを受け取るアプリケーションをCLSIDで指定するかアプリケーションのファイル名(パス)(とコマンドライン引数)で指定するかが異なります |
(*1) IWiaEventCallbackインターフェースはNotoficationタイプのイベントを受信する仕組みも持っていますのでRegisterEventCallbackInterfaceもNotoficationタイプのイベントを受信できるかも知れません。