EternalWindows
RAS / エントリの編集

電話帳エントリの作成や編集、削除といった作業は、 ユーザーインターフェース経由で行われるものもあれば、そうでないものもあります。 たとえば、エントリの作成はRasEntryDlgという関数を呼び出して明示的に行うことになりますが、 エントリの編集では、RasSetEntryPropertiesを呼び出して暗黙的に行うこともできます。 しかし、RasEntryDlgは作成だけでなく編集の機能を呼び出すことができるため、 この関数を学べば作成と編集の機能を統一的な方法で表示することができます。

BOOL RasEntryDlg(
  LPTSTR lpszPhonebook,
  LPTSTR lpszEntry,
  LPRASENTRYDLG lpInfo
);

lpszPhonebookは、電話帳ファイルのフルパスを指定します。 lpszEntryは、エントリの編集又はコピーを行いたいエントリ名を指定します。 この引数は、RASEDFLAG_NoRenameかRASEDFLAG_CloneEntryを指定したときには、 必ず既存のエントリ名を指定することになります。 それ以外の場合は、NULLを指定することができます。 lpInfoは、RASENTRYDLG構造体のサイズを指定します。 この構造体のdwFlagsメンバに行いたい操作を表すフラグを指定します。 関数の戻り値は、フラグにて選択した操作を終えた場合は0以外が返り、 操作を取り消した場合は0が返ります。 エラー情報は、RASENTRYDLG構造体のdwErrorメンバから参照できます。

RASENTRYDLG構造体のdwFlagsメンバに指定可能な定数を次に示します。

定数 意味
RASEDFLAG_CloneEntry RasEntryDlgの第2引数に指定したエントリのコピーを作成する。
RASEDFLAG_NoRename エントリを編集するプロパティシートを表示する。 この関数の動作は、RasEditPhonebookEntryという関数でも実現可能。
RASEDFLAG_NewEntry 新しい接続ウィザードのプロパティシートを表示する。 RASEDFLAG_NewXXXでRasEntryDlgの第2引数にNULLを指定していた場合、 作成されるエントリのデフォルト名がシステムによって決められる。 この関数の動作は、RasCreatePhonebookEntryという関数でも実現可能。
RASEDFLAG_NewPhoneEntry 新しい接続ウィザードで"プライベートネットワークにダイヤルアップする"を 選んだときに切り替わるシートを表示する。
RASEDFLAG_NewTunnelEntry 新しい接続ウィザードで"インターネットをとおしてプライベートネットワークに 接続する"を選んだときに切り替わるシートを表示する。
RASEDFLAG_NewDirectEntry 最終的には新しい接続ウィザードで"ほかのコンピュータに直接接続する"を 選んだときに切り替わるシートが表示されるが、その前にコンピュータを ホストとして利用するのかゲストとして利用するのかの選択がある。
RASEDFLAG_NewBroadbandEntry 新しい接続ウィザードで"広帯域経由でネットワークに接続する"を 選んだときに切り替わるシートを表示する。

エントリの作成や編集と異なり、削除はRasDeleteEntryで行うことになります。 この関数は、ユーザーインターフェースを表示せず無言でエントリを削除しますから、 呼び出すときは事前にメッセージボックスなどを表示しておくべきです。

DWORD RasDeleteEntry(
  LPCTSTR lpszPhonebook,
  LPCTSTR lpszEntry
);

lpszPhonebookは、電話帳ファイルのフルパスを指定します。 lpszEntryは、削除したい既存のエントリを指定します。 関数が成功した場合は、0が返ります。 ちなみに、作成されたエントリ名は次のレジストリキーに列挙されることになっていますが、 この関数はそのエントリ名をレジストリから削除しません。

HKEY_CURRENT_USER\RemoteAccess\Profile

このキーにエントリ名が残ることを防ぎたい場合は、 明示的にレジストリ関数で削除することになります。

今回のプログラムは、RASEDFLAG_NoRenameを指定してRasEntryDlgを呼び出し、 編集のためのプロパティシートを表示します。 RasEntryDlgを呼び出すためには、 rasdlg.hをインクルードとrasdlg.libをリンクが必要です。

#define UNICODE
#include <windows.h>
#include <rasdlg.h>

#pragma comment (lib, "rasdlg.lib")

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	RASENTRYDLG entryDlg = {0};

	entryDlg.dwSize  = sizeof(RASENTRYDLG);
	entryDlg.dwFlags = RASEDFLAG_NoRename;

	RasEntryDlg(NULL, TEXT("EntryName"), &entryDlg);

	return 0;
}

冒頭のUNICODEの宣言は、RASEDFLAG_NoRenameフラグを扱う際には必須です。 RasEntryDlgがUNICODE文字列だけを受けるという記述はリファレンスにはありませんが、 マルチバイト文字列のエントリ名を指定した場合は、関数が失敗してしまいます。 RASENTRYDLG構造体のdwSizeメンバは、事前に構造体のサイズで初期化します。 RASEDFLAG_NoRenameを指定した場合は、 RasEntryDlgの第2引数に編集対象となるエントリの名前を指定します。

既定のエントリ

インターネットオプションの接続タブからは、 任意のダイヤルアップエントリを既定のエントリとして設定することができます。 RAS関数の中ではこの既定のエントリを取得する関数は存在しませんが、 InetGetAutodialという関数を呼び出せば成攻法とは言い難いものの一応取得可能です。 次に、InetGetAutodialを利用した簡単なサンプルを示します。

#include <windows.h>

typedef HRESULT (WINAPI *LPFNINETGETAUTODIAL)(LPBOOL, LPSTR, DWORD);

int WINAPI WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpszCmdLine, int nCmdShow)
{
	char                szEntryName[256];
	BOOL                bEnable;
	HMODULE             hmod;
	LPFNINETGETAUTODIAL lpfnInetGetAutodial;

	hmod = LoadLibrary(TEXT("Inetcfg.dll"));
	if (hmod == NULL)
		return 0;

	lpfnInetGetAutodial = (LPFNINETGETAUTODIAL)GetProcAddress(hmod, "InetGetAutodial");
	if (lpfnInetGetAutodial == NULL) {
		FreeLibrary(hmod);
		return 0;
	}

	lpfnInetGetAutodial(&bEnable, szEntryName, sizeof(szEntryName));
	
	MessageBoxA(NULL, szEntryName, "既定のエントリ", MB_OK);
	
	FreeLibrary(hmod);
	
	return 0;
}

InetGetAutodialは、Inetcfg.dllというDLLからエクスポートされているため、 LoadLibraryとGetProcAddressのペアを用いることになります。 InetGetAutodialの第1引数は、オートダイヤルが有効かどうかを受け取るBOOL型で、 TRUEの場合はオートダイヤルが有効であるということを意味します。 NULLを指定できないことに注意してください。 第2引数は、既定のエントリ名を受け取るバッファのアドレスですが、 引数の型がANSIのLPSTRになっていることに注意してくさい。 第3引数は、第2引数のサイズを指定します。 なお、リファレンスにはInetGetAutodialは将来のWindowsでサポートされない 可能性があると記されており、またこの関数がどのバージョンのWindowsから 利用可能であるかについては記されていません。 動作に関しては、既定のエントリをRasDeleteEntryで削除したのにも関わらず、 依然として既定のエントリを削除されたエントリと見なしてしまうといった 多少の不具合が見られます。



戻る