EternalWindows
コントロールパネル / cplファイル

コントロールパネルアプリケーションとは、 あのコントロールパネルから起動できるアプリケーションのことです。 コントロールパネルには様々なカテゴリが用意されており、 各カテゴリにはそのカテゴリに準じた動作を行うアプリケーションのアイコンが表示されています。 開発したアプリケーションが既存カテゴリにある程度準じた動作を行うような場合、 そのアプリケーションをコントロールパネルからアクセスできるように検討するのも一興です。

コントロールパネルアプリケーションの正体は、.cplという拡張子を持ったDLLです。 このDLLにリソースとして含まれているアイコンや文字列がコントロールパネルに表示され、 起動された場合はダイアログが表示されます。 cplファイルはレジストリにて関連付けが行われているため、 ファイル上でのダブルクリックや右クリックメニューから開くことができます。

上の図は、c:\WINDOWS\system32の中身です。 大半のcplファイルは、このフォルダに存在しています。 inetcpl.cplはインターネットのプロパティであり、 ここで「コントロール パネルで開く」を選択すると、実際にダイアログが表示されます。 次の表は、system32フォルダ内のcplファイルを起動して得た結果です。

タイトル cplファイル
ユーザー補助のオプション access.cpl
プログラムの追加と削除 appwiz.cpl
画面のプロパティ desk.cpl
DirectXのプロパティ directx.cpl
Windows ファイアウォール firewall.cpl
ハードウェアの追加ウイザード hdwwiz.cpl
インターネットのプロパティ inetcpl.cpl
地域と言語のオプション intl.cpl
ゲーム コントローラ joy.cpl
マウスのプロパティ main.cpl
サウンドとオーディオ デバイスのプロパティ mmsys.cpl
ネットワーク接続 ncpa.cpl
ネットワーク セットアップ ウイザード netsetup.cpl
ユーザー アカウント nusrmgr.cpl
ODBC データ ソース アドミニストレータ odbccp32.cpl
電源オプションのプロパティ powercfg.cpl
システムのプロパティ sysdm.cpl
日付と時刻のプロパティ timedate.cpl
Winodws セキュリティ センター wscui.cpl
自動更新 wuaucpl.cpl

プログラムからこれらを起動しようと考えた場合、 なかなか良い策が思い浮かばないものです。 結論からいうとcplファイルを起動するとは、そのcplファイル(DLL)をロードし、 そのcplファイルがエクスポートしている特殊な関数にメッセージを送ることなのですが、 これを成すにはcplファイルの内部を熟知していなければなりません。 以降の節ではcplファイルの内部について説明していますが、 cplファイルを起動するのにcplファイルの内部を知っておくべきというのは、 少し酷というものです。

そこで少し考え方を変えて、cplファイルを起動してくれる機能を持つ プロセスを起動するというのはどうでしょうか。 実は、c:\WINDOWS\system32に存在するcontrol.exeにパラメータとしてcplファイルを指定した場合、 そのcplファイルを起動してくれることになっています。 これを利用して、control.exeにcplファイルを指定するプログラムを次に示します。

#include <windows.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	TCHAR szCplFile[] = TEXT("inetcpl.cpl");

	ShellExecute(NULL, TEXT("open"), TEXT("control"), szCplFile, NULL, SW_SHOWNORMAL);

	return 0;
}

ShellExecuteという関数の第2引数のopenは、 第3引数に指定されている実行ファイルを起動することを意味します。 control.exeではなくcontrolとなっているのは、関数が拡張子なしでも対応しているためです。 また、ShellExecuteはファイルを検索するディレクトリとしてc:\WINDOWS\system32を 考慮しているので、単純にファイル名を指定するだけで構いません。 第4引数にcplファイルを指定した場合はそのファイルが提供するダイアログが表示されますが、 NULLを指定した場合はコントロールパネル自体が表示されることになります。

cplファイルを起動した場合、大抵はダイアログが表示されると思われますが、 多くのダイアログはプロパティーシートとなっており、いくつかのタブを持っています。 タブを指定したい場合は、以下のようにします。

TCHAR szCplFile[] = TEXT("inetcpl.cpl,,1");

タブは0からカウントされるため、上の例の場合だと2番目のタブを選択することになります。

最後に、コントロールパネルのコマンドについて紹介します。 control.exeは、パラメータとしてcplファイルを受け取る以外にも、 以下のようなコマンドを受け取ったときにも動作します (フォルダオプション以下は、Windows2000以上で使用可能)。

タイトル コマンド
画面のプロパティ desktop
画面のプロパティ(デザイン) color
日付と時刻のプロパティ date/time
地域と言語のオプション international
マウスのプロパティ mouse
キーボードのプロパティ keyboard
プリンタと FAX printers
フォント fonts
フォルダオプション folders
電話とモデムのオプション telephony
管理ツール admintools
タスク schedtasks
ネットワーク接続 netconnections
ユーザー アカウント userpasswords
スキャナとカメラ scannercamera

コマンドを指定することにより、より直感的なダイアログの起動が可能になります。 たとえば、フォルダオプションのダイアログを起動したい場合は、 ShellExecuteの第3引数にfoldersを指定します。 次のようになります。

IOpenControlPanelについて

Windows Vistaからは、コントロールパネルのアイテム(ダイアログ)をオープンする方法として、 IOpenControlPanelが登場しました。 次に、これを使用する方法を示します。

#include <windows.h>
#include <shlobj.h>

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HRESULT           hr;
	IOpenControlPanel *pOpenControlPanel;

	CoInitialize(NULL);

	hr = CoCreateInstance(CLSID_OpenControlPanel, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pOpenControlPanel));
	if (FAILED(hr)) {
		CoUninitialize();
		return 0;
	}
	
	pOpenControlPanel->Open(L"Microsoft.InternetOptions", L"3", NULL);

	pOpenControlPanel->Release();
	CoUninitialize();

	return 0;
}

CoCreateInstanceにCLSID_OpenControlPanelを指定すれば、IOpenControlPanelを取得することができます。 これが成功した場合はOpenを呼び出して、第1引数の名前で識別されるアイテムをオープンすることができますが、 NULLを指定した場合はコントロールパネル自体が表示されることになります。 指定できる名前の一覧については、MSDNから確認することができます。 第2引数は表示したいページのインデックスを指定します。

Openの第3引数にはCOMオブジェクトを指定することができますが、その効果はよく分かりません。 OpenはオブジェクトからIServiceProviderを取得し、 さらにIServiceProvider::QueryServiceでIShellBrowserを取得しようとしますが、 これを正しく返しても特に何も起きることはありません。 IShellBrowser::GetWindowの呼び出しは確認しましたが、 それ以外のメソッドは呼ばれることがないようです。



戻る