EternalWindows
コントロールパネル / インターネットプロパティ

これまで、cplファイルをコントロールパネルアプリケーションという 角度から見てきましたが、cplファイルの正体はあくまでDLLです。 そのため、cplファイルの開発者はCPlAppletという専用の関数のみならず、 自分の好きな関数を実装してエクスポートしても何の問題もありません。 しかし、cplファイルをロードする側からすれば、そのcplファイルがCPlApplet以外に どのような関数をエクスポートしているのかは分からないわけですから、 もし呼び出すのであれば、そのエクスポート関数に関するリファレンスが必要になるはずです。 現在のところ、このリファレンスが存在するのはinetcpl.cplだけとなっており、 インターネットプロパティダイアログを表示する2つの関数について記載されています。

BOOL LaunchInternetControlPanel(
  HWND hParent
);

hParentは、ダイアログボックスの親ウインドウとするウインドウハンドルを指定します。 NULLを指定した場合、ダイアログボックスが親ウインドウとなります。 戻り値は、関数が成功したときにはTRUE、失敗したときにはFALSEになります。

LaunchInternetControlPanelは、インターネットプロパティダイアログの「全般」タブを 表示しますが、LaunchConnectionDialogというもう1つの関数は、 インターネットプロパティダイアログの「接続」タブを表示します。

BOOL LaunchConnectionDialog(
  HWND hParent
);

hParentは、ダイアログボックスの親ウインドウとするウインドウハンドルを指定します。 NULLを指定した場合、ダイアログボックスが親ウインドウとなります。 戻り値は、関数が成功したときにはTRUE、失敗したときにはFALSEになります。

今回のプログラムは、先に示したLaunchInternetControlPanelを呼び出して、 インターネットプロパティダイアログを表示します。 inetcpl.cplよりエクスポートされている関数は、 専用のヘッダーファイルやインポートライブラリが存在しないため、 CPlAppleのアドレスを取得するときと同じように、 LoadLibraryとGetProcAddressのペアで関数のアドレスを取得します。

#include <windows.h>

typedef BOOL (WINAPI *LPFNLAUNCHINTERNETCONTROLPANEL)(HWND);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	HMODULE                        hcpl;
	LPFNLAUNCHINTERNETCONTROLPANEL lpfnLaunchInternetControlPanel;

	hcpl = LoadLibrary(TEXT("inetcpl.cpl"));
	if (hcpl == NULL)
		return 0;

	lpfnLaunchInternetControlPanel = (LPFNLAUNCHINTERNETCONTROLPANEL)GetProcAddress(hcpl, "LaunchInternetControlPanel");
	if (lpfnLaunchInternetControlPanel == NULL) {
		FreeLibrary(hcpl);
		return 0;
	}

	lpfnLaunchInternetControlPanel(NULL);
	
	FreeLibrary(hcpl);

	return 0;
}

このプログラムは問題なく動作しますが、インターネットプロパティダイアログを表示するのに、 これだけのコードを書く必要は本来なら全くありません。 本章の最初の節で説明したように、ShellExecuteを次のように呼び出せば、 簡単にダイアログを表示することができるからです。

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

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

ShellExecuteは、タブを付け加えたファイル名にも対応していますから、 必然的にLaunchConnectionDialogを呼び出す必要もなくなったといえます。 しかしながら、これらの関数が直感的にインターネットプロパティを扱えるのも事実ですから、 いずれは公式にヘッダーファイルとインポートライブラリを用意してほしいものです。


戻る