|
|
||||||||||||||||||
|
2-1-10. モジュールのバージョンを判断するWindowsは、標準のAPI だけではありません。各種のモジュールファイルの支援によって成り立っています。またモジュールは後から追加できますので、OSの GetVersion 関数では対処できません。現在システムにどのモジュールがインストールされていて、どの機能が使用できるか判断する方法を説明します。
代表的なモジュール
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 で現在どちらの版をロードしたか分ります。
|