APIを使ったWIA制御
アセンブラの魔女 ⧫ Windows ⧫ WIA ⧫ APIを使ったWIA制御
アセンブラの魔女 ⧫ Windows ⧫ WIA ⧫ APIを使ったWIA制御

 C/C++からWIAを使うにはWIA APIを使います。WIA APIを使うにはWindows SDKをインストールする必要があります。

デバイスとデバイス内のオブジェクト
デバイスへのアクセス
デバイス数を調べる方法
インターフェース
 IEnumWIA_DEV_INFO
 IWiaDevMgr
プロパティ
イベント
 WIAイベント識別子
 イベントへのプログラムの登録
 イベント登録のためのメソッド

 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デバイスマネージャ
IWiaEventCallbackWIAイベントのためのコールバック
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-
RegisterEventCallbackCLSIDWIAアーキテクチャ互換のCOMコンポーネントとして作られたアプリケーションをイベントに登録または登録から削除
RegisterEventCallbackInterface実行中のアプリケーションがコールバックにIWiaEventCallbackインターフェースを使ってイベントに登録または登録を削除
RegisterEventCallbackProgram イベントにプログラムを登録(プログラムをコマンドライン文字列で指定するバージョン)
SelectDeviceDlgWIAデバイスを選択するためのダイアログを表示
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 msdn

 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
);

メンバー説明
lFlagsWIA_REGISTER_EVENT_CALLBACKWIAイベントにアプリケーションを登録
WIA_UNREGISTER_EVENT_CALLBACKWIAイベントに登録されているアプリケーションを登録から削除
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インターフェースのポインタです
pEventObjectIUnknownインターフェースへのポインタが返ります

 IUnknownインターフェースへのポインタが返ります。

 WIAアプリケーションは実行中にWIA_NOTIFICATION_EVENTタイプのイベントの受信を登録するためにこのメソッドを使います。これはイベントのとうろくによってアプリケーションが再スタートすることを防ぎます。プログラムが自分自身でWIAイベントの受信を登録するためにRegisterEventCallbackInterface メソッドを呼び出すと、WIAイベントはWIAしすてむによってそのプログラムに送られるようになります。

 アプリケーションはイベント登録情報(プロパティ)のためのエニュメレータオブジェクトのポインタをEnumRegisterEventInfoメソッドを使って取得することができます。

 アプリケーションはイベントの列挙で返されるWIA_DEV_CAP構造体のulFlags値を調べることでイベントがアクションタイプか通知タイプかを知ることができます。

 アプリケーションはIUnknownポインタを使ってReleaseメソッドを呼び出すことでイベントへの登録を削除することができます。IUnknownポインタはこのメソッドの引数pEventObjecに返されます。

RegisterEventCallbackProgram msdn  RegisterEventCallbackProgramメソッドはアプリケーションがWIAイベントを受信できるように登録します。 これは主にWIA向けに書かれていないアプリケーションとの互換性を確保するために提供されます。
HRESULT RegisterEventCallbackProgram(
  [in]  LONG lFlags,
  [in]  BSTR bstrDeviceID,
  [in]  const GUID *pEventGUID,
  [in]  BSTR bstrCommandline,
  [in]  BSTR bstrName,
  [in]  BSTR bstrDescription,
  [in]  BSTR bstrIcon
);

メンバー説明
lFlagsWIA_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 msdn

 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_CONNECTEDWIAデバイスがマシンに接続された
WIA_EVENT_DEVICE_DISCONNECTEDWIAデバイスとマシンの接続が切断された
WIA_EVENT_ITEM_CREATEDWIAデバイスにアイテムが追加された
WIA_EVENT_ITEM_DELETEDWIAデバイスのアイテムが削除された
WIA_EVENT_POWER_RESUMEコンピュータまたはデバイスの電源がレジュームされた
WIA_EVENT_POWER_SUSPENDコンピュータまたはデバイスの電源がサスペンドされた
WIA_EVENT_SCAN_EMAIL_IMAGEe-mailのための画像スキャンが開始された
WIA_EVENT_SCAN_FAX_IMAGEFaxのための画像スキャンが開始された
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_UPDATEDWIA 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デバイスの制御では以下のいずれかのメソッドを使ってイベントにアプリケーションを登録します。

メソッドイベントタイプ説明
RegisterEventCallbackCLSIDActionCLSIDを使ってアプリケーションを指定する
RegisterEventCallbackInterfaceAction(*1)IWiaEventCallbackインターフェースを使ってコールバックさせる。アプリケーションの実行中に使用する
RegisterEventCallbackProgramActionパスを使ってアプリケーションを指定する。RegisterEventCallbackCLSIDとRegisterEventCallbackProgramの動作は良く似ていますが、 イベントを受け取るアプリケーションをCLSIDで指定するかアプリケーションのファイル名(パス)(とコマンドライン引数)で指定するかが異なります

(*1) IWiaEventCallbackインターフェースはNotoficationタイプのイベントを受信する仕組みも持っていますのでRegisterEventCallbackInterfaceもNotoficationタイプのイベントを受信できるかも知れません。

▼ Property
記事情報
datePublished2011-01-01
dateModified2018-06-20
authorアセンブラの魔女
headlineAPIを使ったWIA制御の紹介ページです
keywordsWIA
keywordsAPI
keywordsWindows
keywordsIEnumWIA_DEV_INFO
keywordsIWiaDevMgr
publisher name= wiredFish, logo.name= wiredFish, logo.url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png size= 208 pixel x 50 pixel
image.url url= https://books-nekoya.jp/Programming/chigu-hagu-title-01.png , size= 208 pixel x 50 pixel