ネットワークリストマネージャによるネットワーク接続の有無の確認方法
Vista 以降利用可能なネットワークリストマネージャとは?
Windows Vista 以降、ネットワークリストマネージャ (Network List Manager, NLM) が実装され、 それが Network List Manager API を通して、プログラムから利用可能です。
NLM は何をするものかというと、欲しいネットワーク、条件にあったネットワークを探す、というのが第一の目的です。 この資料では NLM を用いて、「現在ネットワークに接続しているかどうか」 という状態を取得してみましょう。
ネットワークに接続しているか否か、という点については NLM API のインターフェイスのひとつである INetworkListManager の get_IsConnected メソッドが利用できます。
ネットワークリストマネージャの一番単純な利用方法
NLM は COM で実装されていますので、これを利用するには基本的な COM プログラミングの知識が必要です。
この辺が基本的な C 言語を勉強した直後には、なかなか Windows のコードが書けない理由のひとつです。 よくわからない、という方は当サイトの Windows プログラミング入門 や Windows のおすすめ書籍 などを参考にしてください。
ではさっそく、NLM を利用するコードを書いてみましょう。
以下のコードを nlm1.cpp として保存します。
#include <windows.h> #include <stdio.h> #include <Netlistmgr.h> void main() { HRESULT hr = 0; VARIANT_BOOL vb = 0; INetworkListManager* pNlm = NULL; hr = CoInitialize( NULL ); if( FAILED(hr) ) { printf( "CoInitialize Failed.\n" ); return; } hr = CoCreateInstance( CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (void**) &pNlm ); if( FAILED(hr) ) { printf( "CoCreateInstance Failed.\n" ); CoUninitialize(); return; } hr = pNlm->get_IsConnected ( &vb ); if( SUCCEEDED(hr) ) { if( vb ) { printf("Network Connected!\n" ); } else { printf("Network Not Connected.\n" ); } } else { printf( "get_IsConnected Failed.\n" ); } pNlm->Release(); CoUninitialize(); return; }
makefile は次のとおりです。
TARGETNAME=nlm1 OUTDIR=.\chk LINK32=link.exe ALL : "$(OUTDIR)\$(TARGETNAME).exe" CPPFLAGS=\ /nologo\ /MT\ /W4\ /Fo"$(OUTDIR)\\"\ /Fd"$(OUTDIR)\\"\ /c\ /Zi\ /D_WIN32_WINNT=0x0600 LINK32_FLAGS=\ ole32.lib\ /nologo\ /subsystem:console\ /pdb:"$(OUTDIR)\$(TARGETNAME).pdb"\ /out:"$(OUTDIR)\$(TARGETNAME).exe"\ /DEBUG\ /RELEASE LINK32_OBJS= \ "$(OUTDIR)\$(TARGETNAME).obj" "$(OUTDIR)\$(TARGETNAME).exe" : "$(OUTDIR)" $(LINK32_OBJS) $(LINK32) $(LINK32_FLAGS) $(LINK32_OBJS) "$(OUTDIR)" : if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)" .c{$(OUTDIR)}.obj: $(CPP) $(CPPFLAGS) $< .cpp{$(OUTDIR)}.obj: $(CPP) $(CPPFLAGS) $<
このコードをビルドすると、chk サブディレクトリ内に nlm1.exe ができます。
ネットワーク接続がある場合は、次のように表示されるはずです。
> nlm1.exe Network Connected! >