レガシー Windows API(概要)について

ここで紹介しているAPIは、Windows95、Windows NT3.5時代のAPI群であり、最新のAPIは含まれていないことに注しして欲しい。なお、当時の解説書は現在よりもより詳細に解説しているため、参考になるはずである。

  • レイアウトを変換する際、崩れているページがあります。
  • 概要およびSampleコードはありますが、APIの解説はありません。

ご要望があれば旧版のWin32 API(HELP形式)をお譲りします。問い合わせフォームより申し込みください。

Windows API コントロール パネル アプリケーションの概要

コントロール パネル アプリケーションは、 ユーザーがWindows環境を構成するための、 特別の目的を持ったダイナミック リンク ライブラリ (DLL) です。Windowsでは標準のコントロール パネル アプリケーションが多数提供されていますが、 ユーザーが特定のハードウェアやソフトウェアの設定や操作モードを調べたり変更できるように、 新しくアプリケーションを作成することもできます。

このガイドではコントロール パネル アプリケーションを記述し、 これらのアプリケーションが作業を完了するために使用し処理する機能やメッセージを説明します。

次に示すトピックでは、 Win32のコントロール パネル アプリケーションについて説明しています。

アプリケーションの責任と操作

アプリケーション エントリ ポイント関数

メッセージ処理

アプリケーションのセットアップ

コントロール パネル アプリケーションの作成

コントロール パネル関数とメッセージ

アプリケーションの責任と操作

コントロール パネル アプリケーションの主な責任は、 ダイアログ ボックスを表示し、 ユーザーが指定した作業を実行することです。この責任にもかかわらず、 コントロール パネル アプリケーションでは、 ユーザーがダイアログ ボックスをアクセスするためのメニューやほかの手段は提供していません。そのかわり、 こういったアプリケーションは別のアプリケーションの制御下で稼働し、 制御する側のアプリケーションが要求したときにだけ、 ダイアログ ボックスを表示します。

通常コントロール パネル アプリケーションは、 ユーザーがこれらのアプリケーションにアクセスするために、 特別に設計されたWindowsのシステム ユーティリティにより制御されます。しかし、 コントロール パネル アプリケーションが期待するような形で、 メッセージを送り、 戻り値を処理することができるようなアプリケーションであれば、 どんなアプリケーションでもコントロール パネル アプリケーションをロードし管理できます。

コントロール パネル アプリケーションのほとんどは、 ダイアログ ボックスを1つ表示し管理して、 ユーザーが1つのシステム構成要素の設定や操作モードを管理できるようにしています。しかし、 どのコントロール パネル アプリケーションでも、 システム構成要素をいくつでも制御できるように、 ダイアログ ボックスをいくつでも持つことができます。個々のダイアログ ボックスを区別するために、 コントロール パネル アプリケーションでは通常はそれぞれのダイアログ ボックスに対して固有のアイコンを、 制御側のアプリケーションに提供します。制御側のアプリケーションはこれらのアイコンを表示し、 ユーザーは、 アイコンを選択すれば、 対応するダイアログ ボックスを選べます。

アプリケーション エントリ ポイント関数

コントロール パネル アプリケーションはすべて、 CPlAppletという標準のエントリ ポイント関数をエクスポートしなければなりません。この関数は、 コントロール パネル (CPL) メッセージという形で要求を受け取り、 アプリケーションの初期化、 ダイアログ ボックスの表示や管理、 アプリケーションの終了などの要求作業を実行します。

制御側のアプリケーションはコントロール パネル アプリケーションを最初にロードすると、 CPlApplet関数のアドレスを受け取り、 それ以降この関数を呼び出したりメッセージを渡すときにこのアドレスを使います。制御側のアプリケーションは次のメッセージを送れます。

メッセージ説明

CPL_DBLCLK指定されたダイアロク ボックスに関連するアイコンをユーザーが選択したことを、 CPlAppletに通知するために送られます。CPlAppletは対応するダイアログ ボックスを表示し、 ユーザーが指定した作業を実行する必要があります。

CPL_EXIT最新のCPL_STOPメッセージの後で、 制御側のアプリケーションがコントロール パネル アプリケーションを含むDLLを解放するためにFreeLibrary関数を使う直前に送られます。CPlAppletは残っているメモリを解放し、 終了準備をする必要があります。

CPL_GETCOUNTCPL_INITメッセージの後で送られ、 CPlAppletがサポートするダイアログ ボックスの数を返すように、 CPlAppletに指示します。

CPL_INITコントロール パネル アプリケーションを含むDLLがロードされた直後に送られ、 メモリ割り当てを含む初期化プロシージャを実行するように、 CPlAppletに指示します。

CPL_INQUIRECPL_GETCOUNTメッセージの後に送られ、 指定されたダイアログ ボックスの情報を提供するように、 CPlAppletに指示します。このメッセージは新しいCPL_NEWINQUIREメッセージに変わりました。

CPL_NEWINQUIRECPL_GETCOUNTメッセージの後に送られ、 指定されたダイアログ ボックスの情報を提供するように、 CPlAppletに指示します。2番目のパラメータ (lParam2) は、 NEWCPLINFO構造体を指すポインタです。

CPL_SELECT指定されたダイアログ ボックスに関連するアイコンをユーザーが選択したことを、 CPlAppletに通知するために送られます。

CPL_STOP制御側のアプリケーションが終了する前に、 各ダイアログ ボックスに対して1回送られます。CPlAppletは、 指定されたダイアログ ボックスに関連するメモリをすべて解放する必要があります。

メッセージ処理

CPlApplet関数は、 制御側のアプリケーションからコントロール パネル アプリケーションに送られるすべてのメッセージを処理します。関数は指定された順序でメッセージが送られることを想定します。制御側のアプリケーションは、 指定された方法でメッセージが処理されることを想定します。

制御側のアプリケーションがコントロール パネル アプリケーションを最初にロードしたときに、 CPlApplet関数はCPL_INITメッセージを受け取ります。関数はメモリ割り当てなどの初期化タスクを実行し、 0以外を返す必要があります。CPlAppletが初期化を完了できない場合は、 0を返し、 通信を終了してDLLを解放するよう、 制御側のアプリケーションに指示しなければなりません。

CPlApplet関数は、 CPL_INITメッセージが正常に終了したときにだけ、 CPL_GETCOUNTメッセージを受け取ります。CPlAppletはコントロール パネル アプリケーションでサポートされるダイアログ ボックスの数を返さなければなりません。CPlAppletは、 コントロール パネル アプリケーションがサポートするダイアログ ボックス1個につき、 CPL_NEWINQUIREメッセージを1つ受け取ります。各メッセージには、 NEWCPLINFO構造体のアドレスと、 制御側のアプリケーションが指定されたダイアログ ボックスを識別するために使う、 一意の識別子が含まれます。

関数はNEWCPLINFO構造体のdwSizeメンバに構造体のサイズを設定し、 hIconメンバにダイアログ ボックスを表すアイコンのハンドルを設定し、 szNameおよびszInfoメンバにダイアログ ボックスの短い名前と記述のそれぞれのアドレスを設定する必要があります。関数がdwHelpContextおよびszHelpFileメンバも設定する場合は、 制御側のアプリケーションでダイアログ ボックスの状況に応じたヘルプを提供します。lDataメンバはアプリケーション定義のデータに使えます。

 CPL_NEWINQUIREメッセージおよびNEWCPLINFO構造体は、 それぞれCPL_INQUIREメッセージおよびCPLINFO構造体に代わるものです。

CplApplet関数は、 ユーザーがダイアログ ボックスを表すアイコンを選択したという通知として、 CPL_SELECTメッセージを受け取ります。関数ではこのメッセージを何回も受け取る可能性があります。メッセージには、 制御側のアプリケーションが以前に提供したダイアログ ボックス識別子と、 CPlAppletが以前に提供したlData値が含まれます。一般に、 コントロール パネル アプリケーションはCPL_SELECTメッセージには返答しません。

CPlApplet関数は、 ユーザーがダイアログ ボックスを表すアイコンを選んだという通知として、 CPL_DBCLKメッセージを受け取ります。関数はこのメッセージを何回も受け取る可能性があります。このメッセージには、 ダイアログ ボックス識別子とlData値が含まれます。関数は対応するダイアログ ボックスを表示し、 それに続くユーザーの入力を処理する必要があります。

制御側のアプリケーションが終了する前に、 CPlApplet関数は、 コントロール パネル アプリケーションでサポートされるダイアログ ボックスのそれぞれに対して、 CPL_STOPメッセージを1回受け取ります。このメッセージには、 ダイアログ ボックスの識別子とlData値が含まれます。関数は指定されたダイアログ ボックスに割り当てたメモリをすべて解放する必要があります。

最後のCPL_STOPメッセージの後、 CPlApple関数はCPL_EXITメッセージを受け取ります。関数は、 割り当てられたメモリが残っていれば、 すべて解放し、 登録したプライベート ウィンドウ クラスがあれば、 すべて登録を解除する必要があります。関数がこのメッセージから戻った直後に、 制御側のアプリケーションはFreeLibrary関数を呼び出して、 コントロール パネル アプリケーションを切り離します。

アプリケーションのセットアップ

コントロール パネル アプリケーションは、 すべてダイナミック リンク ライブラリです。コントロール パネル アプリケーションを含むDLLが存在し、 Windowsのシステム ユーティリティで自動的にロードされることを確認するには、 DLLファイルには.CPLファイル拡張子を付けて、 次のいずれかの方法でセットアップしなければなりません。

Windowsシステム ユーティリティを含むディレクトリにコピーする。

WindowsのSYSTEMディレクトリにコピーする。

レジストリのHKEY_CURRENT_USERキーのMMCPLキーに登録する。

DLLがCPlApplet以外の関数をエクスポートし、 コントロール パネル アプリケーションの範囲を超える機能を提供する場合は、 DLLをレジストリに登録する必要があります。レジストリの詳細はレジストリと初期化ファイルの概要を参照してください。

コントロール パネル アプリケーションの作成

コントロール パネル アプリケーションでは複数のダイアログ ボックスをサポートできますが、 すべての要求は1つのCPlApplet関数を介して処理します。次に示される例では、 コントロール パネル アプリケーションは、 コンピュータに接続されるステレオ システムに対してユーザーが自分の好みを選べるよう、 3つのダイアログ ボックスをサポートしています。この例では、 それぞれのダイアログ ボックスに対応する3つの構造体を含む、 アプリケーション定義のStereoApplets配列を使っています。

それぞれの構造体には、 CPL_NEWINQUIREメッセージが必要とするすべての情報と、 CPL_DBLCLKメッセージが必要とするダイアログ ボックス テンプレートおよびダイアログ ボックス プロシージャが含まれます。コードは、 StereoApplets配列の構造体を設定する方法を示しています。

#define NUM_APPLETS 3

typedef struct tagApplets
{
	int icon;/* icon resource identifier*/
	int namestring;/* name-string resource identifier*/
	int descstring;/* description-string resource identifier*/
	int dlgtemplate;/* dialog box template resource identifier */	
	DLGPROC dlgfn; /* dialog box procedure*/
} APPLETS;

APPLETS StereoApplets[NUM_APPLETS] =
{	
	AMP_ICON, AMP_NAME, AMP_DESC, AMP_DLG, AmpDlgProc,	
	TUNER_ICON, TUNER_NAME, TUNER_DESC, TUNER_DLG, TunerDlgProc,
	TAPE_ICON, TAPE_NAME, TAPE_DESC, TAPE_DLG, TapeDlgProc,
};

LONG CALLBACK CPlApplet(hwndCPL, uMsg, lParam1, lParam2)
HWND hwndCPL;/* handle of Control Panel window */
UINT uMsg;/* message*/
LPARAM lParam1;/* first message parameter*/
LPARAM lParam2;/* second message parameter*/
{
	int i;
	LPNEWCPLINFO lpNewCPlInfo;

	i = (int) lParam1;

	switch (uMsg)
	{
		case CPL_INIT:/* first message, sent once*/
			hinst = GetModuleHandle("ecp.cpl");
			return TRUE;

		case CPL_GETCOUNT:/* second message, sent once */
			return NUM_APPLETS;
			break;

		case CPL_NEWINQUIRE: /* third message, sent once per app */
			lpNewCPlInfo = (LPNEWCPLINFO) lParam2;
			lpNewCPlInfo->dwSize = (DWORD) sizeof(NEWCPLINFO);
			lpNewCPlInfo->dwFlags = 0;
			lpNewCPlInfo->dwHelpContext = 0;
			lpNewCPlInfo->lData = 0;
			lpNewCPlInfo->hIcon =
			LoadIcon(hinst, (LPCTSTR) MAKEINTRESOURCE(StereoApplets[i].icon));
			lpNewCPlInfo->szHelpFile[0] = '\0';
			LoadString(hinst, StereoApplets[i].namestring,
				lpNewCPlInfo->szName, 32);
			LoadString(hinst, StereoApplets[i].descstring,
				lpNewCPlInfo->szInfo, 64);
			break;

		case CPL_SELECT:/* applet icon selected */
			break;

		case CPL_DBLCLK:/* applet icon double-clicked */
			MessageBeep(MB_ICONEXCLAMATION);
			DialogBox(hinst, MAKEINTRESOURCE(StereoApplets[i].dlgtemplate),
			hwndCPL, StereoApplets[i].dlgfn);
			break;

		case CPL_STOP:/* sent once per app. before CPL_EXIT */
			break;

		case CPL_EXIT:/* sent once before FreeLibrary called */
			break;

		default:
			break;
	}
	return  0;
}

▲ページトップに戻る

【本を読んでもよくらからない】 … 個別指導でわかりやすくお教えします