Platform SDK: DirectX

MultiMon システムにおけるデバイスの列挙

[Visual Basic]

ここでは、C++ でのアプリケーション開発について説明する。

[C++]

DirectDrawEnumerateEx 関数を使用すると、マルチモニタを用いたシステム上のデバイスを列挙できる。マルチモニタは、列挙されるべき DirectDraw デバイスのタイプを決定するフラグを指定する。この関数では、列挙されたデバイスごとにアプリケーション定義された DDEnumCallbackEx 関数を呼び出す。

DirectDrawEnumerateEx 関数は、Windows 98、および Windows NT 2000 とそれ以降のオペレーティング システムでサポートされる。また、DirectX 6.0 以降のバージョンでコンパイルされたアプリケーションは、Ddraw.lib で利用できる。関数へ静的にリンクするアプリケーションは常に DirectX 6.0 以降のバージョンで実行し、常に Windows 98 および Windows NT 2000 以降の DirectX のあらゆるバージョンで実行する。Windows 95 の DirectX の以前のバージョンで実行する場合、このようなアプリケーションは失敗する。

アプリケーションに DirectX 5.0 以前のバージョンの実行が必要な場合、DirectDrawEnumerateEx が利用可能であれば参照のために GetProcAddress を使用すべきである。次にこの方法についての例を示す。

    HINSTANCE h = LoadLibrary("ddraw.dll");
 
// ddraw.dll が検索パスに存在しない場合、
// おそらく DirectX はインストールされないので、失敗する。
    if (!h)
        return FALSE;
 
// 取得する関数のバージョンを知らなければならない
// ことに注意する (次に示すテキストを参照)。
// この例では、ANSI バージョンを使用する。
    LPDIRECTDRAWENUMERATEEX lpDDEnumEx;
    lpDDEnumEx = (LPDIRECTDRAWENUMERATEEX) GetProcAddress(h,"DirectDrawEnumerateExA");
 
// 関数がある場合、その関数を呼び出して、
// デスクトップにアタッチされるすべてのディスプレイ デバイスと
// 非ディスプレイ DirectDraw デバイスを列挙する。
    if (lpDDEnumEx)
        lpDDEnumEx(Callback, NULL, 
            DDENUM_ATTACHEDSECONDARYDEVICES |
            DDENUM_NONDISPLAYDEVICES 
            );
    else
    {
        /*
* DirectDraw の古いバージョンで実行する必要がある。
* したがって MultiMon はサポートされない。Fall back on
* 単一のモニタ システム上の標準的なデバイスを列挙するには、
* DirectDrawEnumerate に頼る。
         */
        DirectDrawEnumerate(OldCallback,NULL);
 
/* OldCallback 関数を DDEnumCallbackEx に対する
* ラッパーとすると便利であることに注意する。
         * 
* このような関数は次のようにする。
* BOOL FAR PASCAL OldCallback (GUID FAR *lpGUID,
*        LPSTR pDesc,
*        LPSTR pName,
*        LPVOID pContext) 
         *    {
*   return Callback (lpGUID,pDesc,pName,pContext,NULL) ;
         *    }
         */
    }
 
// LoadLibrary () の呼び出しでライブラリがロードされ場合、
// そのライブラリを活用するには、// FreeLibrary () を使用しなくてはならない。
    FreeLibrary(h);

上記の例では、実行時やロード時に Ddraw.dll にリンクするアプリケーション対して作用する。

DirectDrawEnumerateEx 関数の ANSI、または Unicode バージョンのどちらかのアドレスを取得しなくてはならないことに注意する。この関数は、アプリケーションで使用する文字列型に依存する。対応するコールバック関数を宣言する場合、文字列のパラメータに対する LPTSTR データ型を使用する。_UNICODE シンボルか ANSI 文字列のどちらかを宣言する場合、LPTSTR データ型は Unicode 文字列を使用するためにコンパイルする。LPTSTR データ型を使用することにより、アプリケーションで使用する文字列型にかかわらず、その関数は正確にコンパイルしなければならない。