アークピットのホームページに戻る

WinAPIトピックのトップページに戻る

APIトピックの各章に移動する

ダウンロードのページに移動する
ダウンロードができ
ない場合の対処法
 

ページ移動

2-1-10. モジュールのバージョンを判断する

 Windowsは、標準のAPI だけではありません。各種のモジュールファイルの支援によって成り立っています。またモジュールは後から追加できますので、OSの GetVersion 関数では対処できません。現在システムにどのモジュールがインストールされていて、どの機能が使用できるか判断する方法を説明します。

代表的なモジュール

モジュール バージョン 説明
comctl32.dll 4.00 Windows 95 で始めて搭載された高機能なGUIの追加コントロールモジュールです。ツールバーやツリービューなど便利なコントロールを提供します。
comctl32.dll 4.70 Microsoft Internet Explorer 3.x で拡張されたコントロールモジュールです。完全に上位互換なためファイルを置き換えます。
comctl32.dll 4.71 Microsoft Internet Explorer 4.x で拡張されたコントロールモジュールです。完全に上位互換なためファイルを置き換えます。
riched32.dll 1.00 リッチエディトコントロールを提供するモジュールです。バージョン 1.0(RE1.0と言う)です。
riched20.dll 2.00 リッチエディトコントロールを拡張するモジュールです。しかし完全な上記互換が無いため、別名で提供します。バージョン 2.0(RE2.0と言う)です。

COMCTL32.DLLのバージョンの判断

 現在インストールされているコモンコントロールのバージョンを調べるコード例を下記に示します。コモンコントロールは上位互換があるため、4.70 以上の機能を必要としない場合は、この様なコードも必要ありません。しかしツールバーで、フラットなボタンを採用したいときなどは、必ずバージョンを調べないといけません。
#include <windows.h>
#include <shlwapi.h>
#include <commctrl.h>

//
// コモンコントロールのバージョンを得る
//     (バージョンを400,470,471の番号で得る)
//

INT  GetComCtlVersion(VOID)
{
    HINSTANCE         hComCtl;
    INT               nVersion;
    HRESULT           hr;
    DLLGETVERSIONPROC pDllGetVersion;
    DLLVERSIONINFO    dvi;

    nVersion = 400;
    hComCtl = LoadLibrary(TEXT("comctl32.dll"));
    if (hComCtl)
    {
        pDllGetVersion = (DLLGETVERSIONPROC)GetProcAddress(hComCtl,
                                              TEXT("DllGetVersion"));
        if(pDllGetVersion)
        {
            ZeroMemory(&dvi,sizeof(dvi));
            dvi.cbSize = sizeof(dvi);
            hr = (*pDllGetVersion)(&dvi);
            if(SUCCEEDED(hr))
                nVersion = dvi.dwMajorVersion*100+dvi.dwMinorVersion;
        }
    }
    FreeLibrary(hComCtl);
    return nVersion;
}

リッチエディトコントロールの判断

 コモンコントロールは同名でしたが、リッチエディトコントロールは、提供するモジュールファイル名が違います。よって、LoadLibrary 関数で版を知ることができます。
    HINSTANCE  hRtfLib; // リッチテキストDLLのインスタンスのハンドル
    INT        nReVer;  // リッチエディトコントロールのバージョン(1 or 2)

    if (nReVer == 2)
    {
        hRtfLib  = LoadLibrary("RICHED20.DLL");     // RE2.0
        if (hRtfLib < (HINSTANCE)HINSTANCE_ERROR)
        {
            nReVer = 1;
            hRtfLib  = LoadLibrary("RICHED32.DLL"); // RE1.0
        }
    }
    else
        hRtfLib  = LoadLibrary("RICHED32.DLL");     // RE1.0
 まず、nReVer には1か2のどちらの版を使用するかの値を設定して置きます。そして2(RE2.0)なら、RICHED20.DLL のロードを試み失敗(モジュールファイルが存在しない)したら、RICHED32.DLL のRE1.0をロードします。nReVer が1の場合は、RICHED32.DLL のRE1.0をロードします。最後に、hRtfLib がNULLなら失敗を意味します。そして、nReVer で現在どちらの版をロードしたか分ります。

ページ移動