ネットワークリストマネージャによるネットワーク接続の有無の確認方法

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!

>

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説