メイン | 2006年12月 »

前の10件 1  2  3  4

2006年11月 記事一覧

URLショートカットからURLを読み出す

お気に入りなどに登録されているインターネットショートカットからURLを取り出したいことがある。そのような場合はCOMインターフェースのIUniformResourceLocatorを通じてアクセスする。ショートカットファイルの拡張子には「.url」を指定する。

IUniformResourceLocator::GetURLはURLが取得できていないにも関わらず成功を示すS_FALSEを返すことがあるので実装に注意する。

依存環境:ATL
#include "atlstr.h"

#include <shlobj.h>
#include <intshcut.h>



//
//	URLショートカットからのURL読み込み
//
//	pszFileに指定されたURLショートカットを読み込みます。拡張子に「.url」を指定してください。
//
bool	GetInternetShortcut(LPCTSTR pszFile,CAtlString* pstrURL)
{
	HRESULT	hr;
	LPTSTR	pszURL;
	IMalloc*					pIMalloc;
	IPersistFile*				pIPersistFile;
	IUniformResourceLocator*	pIUniformResourceLocator;

	if(pstrURL == NULL)
		return	false;
	*pstrURL = _T("");

	pIUniformResourceLocator = NULL;
	hr = ::CoCreateInstance(CLSID_InternetShortcut,NULL,CLSCTX_INPROC_SERVER,IID_IUniformResourceLocator,(void**)&pIUniformResourceLocator);
	if(pIUniformResourceLocator == NULL || FAILED(hr))
		return	false;

	hr = pIUniformResourceLocator->QueryInterface(IID_IPersistFile,(void**)&pIPersistFile);

	if(pIPersistFile)
	{
	#ifdef  _UNICODE
		hr = pIPersistFile->Load(pszFile,STGM_READ | STGM_SHARE_DENY_NONE);
	#else
		WCHAR*	pwszUnicode;
		int		nLen;

		//Unicode変換
		nLen = ::MultiByteToWideChar(CP_ACP,0,pszFile,-1,NULL,0);
		pwszUnicode = new WCHAR[nLen + 1];
		if(pwszUnicode == NULL)
		{
			pIPersistFile->Release();
			pIUniformResourceLocator->Release();
			return	false;
		}
		nLen = ::MultiByteToWideChar(CP_ACP,0,pszFile,-1,pwszUnicode,nLen + 1);
		if(nLen == 0)
			hr = E_FAIL;

		hr = pIPersistFile->Load(pwszUnicode,STGM_READ | STGM_SHARE_DENY_NONE);

		delete	pwszUnicode;
	#endif
	}

	if(pIUniformResourceLocator)
		hr = pIUniformResourceLocator->GetURL(&pszURL);
	if(hr == S_FALSE)		//S_FALSEが返ることがある!これはSUCCEEDED(hr)なので注意!
		hr = E_FAIL;
	if(SUCCEEDED(hr))
		*pstrURL = pszURL;

	pIMalloc = NULL;
	if(SUCCEEDED(hr))
		hr = ::SHGetMalloc(&pIMalloc); 
	if(pIMalloc && SUCCEEDED(hr))
		pIMalloc->Free(pszURL);

	if(pIMalloc)
		pIMalloc->Release();
	if(pIPersistFile)
		pIPersistFile->Release();
	if(pIUniformResourceLocator)
		pIUniformResourceLocator->Release();

	return	SUCCEEDED(hr) ? true : false;
}



void	Test(void)
{
	bool		ret;
	CAtlString	strURL;

	//COM初期化
	::CoInitialize(NULL);

	ret = GetInternetShortcut(_T("c:\\test.url"),&strURL);
	if(ret)
		::MessageBox(NULL,strURL,_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("URLの読み込みに失敗しました"),_T(""),MB_OK);

	//COM開放
	::CoUninitialize();
}

プロジェクトファイルをダウンロード

ファイル名として禁止されている文字を置き換える

例えば「現在アクセスしているホームページへのショートカットを自動的にお気に入りに登録するアプリケーションを作りたい」などの場合、ホームページのタイトルをそのままファイル名として使うと、タイトル内にファイル名として禁止されている文字が入っている場合に誤動作する危険がある。
このようなときにファイル名に使いたい文字列をこの関数に通すと自動的に禁止された文字列が全角文字に置換されるので誤動作の可能性を減らすことができる。

依存環境:ATL
#include "atlstr.h"

//
//ファイル名として禁止されている文字を変換
//
void	TranslateToSafeFileName(CAtlString& strSafeFileName)
{
	//禁止半角を全角文字に変換
	strSafeFileName.Replace(_T("\\"),_T("¥"));
	strSafeFileName.Replace(_T("/"),_T("/"));
	strSafeFileName.Replace(_T("*"),_T("*"));
	strSafeFileName.Replace(_T(":"),_T(":"));
	strSafeFileName.Replace(_T("?"),_T("?"));
	strSafeFileName.Replace(_T("<"),_T("<"));
	strSafeFileName.Replace(_T(">"),_T(">"));
	strSafeFileName.Replace(_T("\""),_T("”"));
	strSafeFileName.Replace(_T("|"),_T("|"));
}



void	Test(void)
{
	CAtlString	strFile;

	strFile = _T("Googleへのショートカット (http://www.google.co.jp/)");
	TranslateToSafeFileName(strFile);

	::MessageBox(NULL,strFile,_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

拡張子に関連付けられた実行ファイルを取得する

エクスプローラーでファイルをダブルクリックしたときに使われる実行ファイルを取得するには
AssocQueryStringを利用する。ただし取得結果は必ずしもexeファイルになるとは限らない。拡張子によってはdllファイルなどに関連づいていることもある。(例:jpegファイルでshimgvw.dllが取得されるなど)

依存環境:ATL
#include "atlstr.h"

#include "shlwapi.h"

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


//
//	拡張子に関連付けられた実行ファイル取得
//
//	pszExtensionは".txt"のようにする("txt"でも構わない)
//	".bat"を取得すると"%1"になるなど実際のコマンドとならないことがある!
//	拡張子によってはdllファイル名が返ることがある!
//
bool	GetExecutable(LPCTSTR pszExtension,CAtlString* pstrCommand)
{
	DWORD		dwOut;
	HRESULT		hr;
	TCHAR		pszFile[MAX_PATH*2];
	CAtlString	strExt;

	if(pstrCommand == NULL)
		return	false;
	*pstrCommand = _T("");
	if(pszExtension == NULL)
		return	false;

	strExt = pszExtension;
	if(strExt.Left(1) != _T("."))
		strExt = _T(".") + strExt;
	if(strExt.GetLength() == 1)
		return	false;

	//pszFileの代わりにNULLを渡せば必要なバッファーが取得できるはずだが...うまく動かない
	//ことがあるのでMAX_MAX*2の固定長で文字列を取得している
	dwOut = MAX_PATH*2;
	hr = ::AssocQueryString(ASSOCF_NOTRUNCATE,ASSOCSTR_EXECUTABLE,strExt,_T("open"),pszFile,&dwOut);
	if(FAILED(hr) || dwOut == 0)
		return	false;

	*pstrCommand = pszFile;

	return	true;
}




void	Test(void)
{
	bool		ret;
	CAtlString	strCommand;

	ret = GetExecutable(_T(".jpg"),&strCommand);

	if(ret)
		::MessageBox(NULL,strCommand,_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("取得に失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

Internet Explorerの「お気に入りの整理」ウィンドウを開く

Internet Explorerの「お気に入り」メニューにある「お気に入りの整理」を選択すると表示されるウインドウはshdocvw.dllの中に実装されている。単独でも動作する関数なので自分のアプリケーションから利用することができる。

test13.gif

//
//	Internet Explorerの「お気に入りの整理」ウィンドウを開く
//
bool	ShowDoOrganizeFavoritesDialog(HWND hWnd,LPTSTR pszFolder=NULL)
{
	BOOL	ret;
	HMODULE	hDLL;

	BOOL (WINAPI* pfnDoOrganizeFavDlg)(HWND hWnd,LPTSTR pszFolder);

	hDLL = ::LoadLibrary(_T("shdocvw.dll"));
	if(hDLL == NULL)
		return	false;
#ifdef _UNICODE
	(FARPROC&)pfnDoOrganizeFavDlg = ::GetProcAddress(hDLL,"DoOrganizeFavDlgW");
#else
	(FARPROC&)pfnDoOrganizeFavDlg = ::GetProcAddress(hDLL,"DoOrganizeFavDlg");
#endif
	ret = FALSE;
	if(pfnDoOrganizeFavDlg)
		ret = pfnDoOrganizeFavDlg(hWnd,pszFolder);

	::FreeLibrary(hDLL);

	return	ret ? true : false;
}



void	Test(void)
{
	bool	ret;

	ret = ShowDoOrganizeFavoritesDialog(NULL,NULL);

	if(ret == false)
		::MessageBox(NULL,_T("表示に失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

全角半角変換、ひらがなカタカナ変換などの文字列変換をする

LCMapStringを利用すると、全角文字を半角文字に変換したり、ひらがなをカタカナに置き換えることができる(これらの処理はLCMapStringを使わずとも簡単にできるのだが...)。

文字列操作はユニコードビルド時でも非ユニコード文字を扱わなければいけなかったり、その逆も多い。つまりTCHAR系で実装すると使い勝手が悪くなる。そのためここではユニコード用と非ユニコード用、両用の3種類を全ての変換処理に用意した。

依存環境:ATL
#pragma	once

#include "atlstr.h"


class	CDnpStrConv
{
public:

	//
	//	LCMapStringを利用したロケール依存の文字列変換)
	//
	bool	StrConv(LPCTSTR pszSrc,CAtlString* pstrDest,DWORD dwFlags)
	{
	#ifdef	_UNICODE
		return	StrConvW(pszSrc,pstrDest,dwFlags);
	#else
		return	StrConvA(pszSrc,pstrDest,dwFlags);
	#endif
	}


	//
	//	LCMapStringを利用したロケール依存の文字列変換)(非ユニコード用)
	//
	bool	StrConvA(LPCSTR pszSrc,CAtlStringA* pstrDest,DWORD dwFlags)
	{
		char*	pszBuff;
		int		nLen;
		int		ret;
		LCID	dwLocale;

		if(pstrDest == NULL)
			return	false;
		*pstrDest = _T("");
		if(pszSrc == NULL)
			return	false;

		//dwLocale = ::GetUserDefaultLCID();	//このクラス内では日本語用の変換処理しか利用しないので日本用の1041に固定している!
		dwLocale = 1041;						//中国語など多言語用の変換処理を利用するにはそのロケールもしくはUserDefaultを指定すること
		nLen = ::LCMapStringA(dwLocale,dwFlags,pszSrc,-1,NULL,0);
		nLen += 10;
		pszBuff = new char[nLen];

		ret = ::LCMapStringA(dwLocale,dwFlags,pszSrc,-1,pszBuff,nLen);
		if(ret == 0)
		{
			delete	pszBuff;
			return	false;
		}

		*pstrDest = pszBuff;
		delete	pszBuff;

		return	true;
	}


	//
	//	LCMapStringを利用したロケール依存の文字列変換)(ユニコード用)
	//
	bool	StrConvW(LPCWSTR pszSrc,CAtlStringW* pstrDest,DWORD dwFlags)
	{
		WCHAR*	pszBuff;
		int		nLen;
		int		ret;
		LCID	dwLocale;

		if(pstrDest == NULL)
			return	false;
		*pstrDest = _T("");
		if(pszSrc == NULL)
			return	false;

		//dwLocale = ::GetUserDefaultLCID();	//このクラス内では日本語用の変換処理しか利用しないので日本用の1041に固定している!
		dwLocale = 1041;						//中国語など多言語用の変換処理を利用するにはそのロケールもしくはUserDefaultを指定すること
		nLen = ::LCMapStringW(dwLocale,dwFlags,pszSrc,-1,NULL,0);
		nLen += 10;
		pszBuff = new WCHAR[nLen];

		ret = ::LCMapStringW(dwLocale,dwFlags,pszSrc,-1,pszBuff,nLen);
		if(ret == 0)
		{
			delete	pszBuff;
			return	false;
		}

		*pstrDest = pszBuff;
		delete	pszBuff;

		return	true;
	}


	//
	//	メンバー関数定義用一時マクロ
	//
	#define	FN_STRCONV_EXTEND(func_dualchar,func_charA,func_chcarW,dwFlags)	\
		bool	func_dualchar(LPCTSTR pszSrc,CAtlString* pstrDest)			\
		{																	\
			return	StrConv(pszSrc,pstrDest,dwFlags);						\
		}																	\
		bool	func_charA(LPCSTR pszSrc,CAtlStringA* pstrDest)				\
		{																	\
			return	StrConvA(pszSrc,pstrDest,dwFlags);						\
		}																	\
		bool	func_chcarW(LPCWSTR pszSrc,CAtlStringW* pstrDest)			\
		{																	\
			return	StrConvW(pszSrc,pstrDest,dwFlags);						\
		}																	\
		bool	func_dualchar(CAtlString& strText)							\
		{																	\
			return	func_dualchar((CAtlString)strText,&strText);			\
		}																	\
		bool	func_charA(CAtlStringA& strText)							\
		{																	\
			return	func_charA((CAtlStringA)strText,&strText);				\
		}																	\
		bool	func_chcarW(CAtlStringW& strText)							\
		{																	\
			return	func_chcarW((CAtlStringW)strText,&strText);				\
		}


	//	半角全角変換
	FN_STRCONV_EXTEND(Zen2Han,Zen2HanA,Zen2HanW,LCMAP_HALFWIDTH)

	//全角半角変換
	FN_STRCONV_EXTEND(Han2Zen,Han2ZenA,Han2ZenW,LCMAP_FULLWIDTH)

	//カタカナひらがな変換
	FN_STRCONV_EXTEND(Katakana2Hiragana,Katakana2HiraganaA,Katakana2HiraganaW,LCMAP_HIRAGANA)
	FN_STRCONV_EXTEND(Kana2Hira,Kana2HiraA,Kana2HiraW,LCMAP_HIRAGANA)

	//ひらがなカタカナ変換
	FN_STRCONV_EXTEND(Hiragana2Katakana,Hiragana2KatakanaA,Hiragana2KatakanaW,LCMAP_KATAKANA)
	FN_STRCONV_EXTEND(Hira2Kana,Hira2KanaA,Hira2KanaW,LCMAP_KATAKANA)

	//小文字大文字変換
	FN_STRCONV_EXTEND(MakeUpper,MakeUpperA,MakeUpperW,LCMAP_UPPERCASE)

	//大文字小文字変換
	FN_STRCONV_EXTEND(MakeLower,MakeLowerA,MakeLowerW,LCMAP_LOWERCASE)

	//マクロ定義の削除
	#undef	FN_STRCONV_EXTEND
};





void	Test(void)
{
	bool		ret;
	CAtlString	strMessage;
	CDnpStrConv	cCnv;

	ret = cCnv.MakeLower(_T("あいうABCDXYZ123"),&strMessage);
	if(ret)
		::MessageBox(NULL,strMessage,_T(""),MB_OK);

	ret = cCnv.Zen2Han(strMessage);
	if(ret)
		::MessageBox(NULL,strMessage,_T(""),MB_OK);

	ret = cCnv.MakeUpper(strMessage);
	if(ret)
		::MessageBox(NULL,strMessage,_T(""),MB_OK);

	ret = cCnv.Hira2Kana(strMessage);
	if(ret)
		::MessageBox(NULL,strMessage,_T(""),MB_OK);

	ret = cCnv.Kana2Hira(strMessage);
	if(ret)
		::MessageBox(NULL,strMessage,_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

ネットワークドライブ接続・切断ダイアログを表示する

エクスプローラの「ツール」メニューにある「ネットワークドライブの割り当て」メニューや「ネットワークドライブの切断」メニューを選択したときに表示されるダイアログはWNetConnectionDialogやWNetDisconnectDialog関数から利用できる。

test15_01.gif

test15_02.gif

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

//
//	ネットワークドライブの割り当てダイアログ表示
//
bool	ShowNetDriveConnectionDialog(HWND hParent)
{
	DWORD	dwRet;

	dwRet = ::WNetConnectionDialog(hParent,RESOURCETYPE_DISK);

	return	(dwRet == NO_ERROR) ? true : false;
}


//
//	ネットワークドライブの切断ダイアログの表示
//
bool	ShowNetDriveDissconnectDialog(HWND hParent)
{
	DWORD	dwRet;

	dwRet = ::WNetDisconnectDialog(hParent,RESOURCETYPE_DISK);

	return	(dwRet == NO_ERROR) ? true : false;
}




void	Test(void)
{
	ShowNetDriveConnectionDialog(NULL);

	ShowNetDriveDissconnectDialog(NULL);
}

プロジェクトファイルをダウンロード

ネットワークドライブへ接続する

LAN上のパソコンやNASなどから公開されているフォルダをドライブとして接続するにはWNetAddConnection2を使う。この関数はネットワークプリンタの接続にも利用できるものだが今回は使い方をネットワークドライブに限定している。

依存環境:ATL
#include <atlstr.h>
#pragma	comment(lib,"Mpr.lib")


//
//	ネットワークドライブの割り当て
//
//bConnectionKeepはfalseだとWindowsを再起動すると接続は回復しない
//
bool	NetDriveConnect(LPCTSTR pszLocalName,LPCTSTR pszRemoteName,bool bConnectionKeep=false)
{
	DWORD		dwRet;
	DWORD		dwFlags;
	NETRESOURCE	sNetResource;
	CAtlStringA	strLocal;
	CAtlStringA	strRemote;

	strLocal	= pszLocalName;
	strRemote	= pszRemoteName;

	//pszLocalNameは「z:」のようにする。末尾は「:」にする
	if(strLocal.Right(1) != ':')
		strLocal += ":";

	//	pszRemoteNameは「\\\\192.168.11.151\\share」のようにする。末尾を「\\」にするのはNG
	if(strRemote.Right(1) == '\\')
		strRemote = strRemote.Left(strRemote.GetLength() - 1);

	ZeroMemory(&sNetResource,sizeof(NETRESOURCE));
	sNetResource.dwType			= RESOURCETYPE_DISK;
	sNetResource.lpLocalName	= strLocal.GetBuffer(0);
	sNetResource.lpRemoteName	= strRemote.GetBuffer(0);

	dwFlags = (bConnectionKeep) ? CONNECT_UPDATE_PROFILE : 0;
	dwRet = ::WNetAddConnection2(&sNetResource,NULL,NULL,dwFlags);

	return	(dwRet == NO_ERROR) ? true : false;
}






void	Test(void)
{
	bool	ret;

	ret = NetDriveConnect(_T("r:"),_T("\\\\192.168.11.151\\share"));

	if(ret)
		::MessageBox(NULL,_T("接続しました"),_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

ネットワークドライブを切断する

ネットワークドライブとして使われているLAN上のパソコンやNASなどから公開されているフォルダから切断するにはWNetDisconnectDialog1を利用する。

依存環境:ATL
#include <atlstr.h>
#pragma	comment(lib,"Mpr.lib")



//
//	ネットワークドライブの切断
//
//bDisconnectKeepはfalseだとWindowsを再起動すると接続が回復する
//
bool	NetDriveDisconnect(LPCTSTR pszLocalName,LPCTSTR pszRemoteName,bool bDisconnectKeep=false)
{
	DWORD			dwRet;
	DISCDLGSTRUCT	sDiscdlgStruct;
	CAtlStringA		strLocal;
	CAtlStringA		strRemote;

	strLocal	= pszLocalName;
	strRemote	= pszRemoteName;

	//pszLocalNameは「z:」のようにする。末尾は「:」にする
	if(strLocal.Right(1) != ':')
		strLocal += ":";

	//	pszRemoteNameは「\\\\192.168.11.151\\share」のようにする。末尾を「\\」にするのはNG
	if(strRemote.Right(1) == '\\')
		strRemote = strRemote.Left(strRemote.GetLength() - 1);

	ZeroMemory(&sDiscdlgStruct,sizeof(DISCDLGSTRUCT));
	sDiscdlgStruct.cbStructure	= sizeof(DISCDLGSTRUCT);
	sDiscdlgStruct.hwndOwner	= NULL;
	sDiscdlgStruct.lpLocalName	= strLocal.GetBuffer(0);
	sDiscdlgStruct.lpRemoteName	= strRemote.GetBuffer(0);
	sDiscdlgStruct.dwFlags		= (bDisconnectKeep) ? DISC_UPDATE_PROFILE | DISC_NO_FORCE : DISC_NO_FORCE;

	dwRet = ::WNetDisconnectDialog1(&sDiscdlgStruct);

	return	(dwRet == NO_ERROR) ? true : false;
}






void	Test(void)
{
	bool	ret;

	ret = NetDriveDisconnect(_T("r:"),_T("\\\\192.168.11.151\\share"));

	if(ret)
		::MessageBox(NULL,_T("切断しました"),_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

使用中のドライブレターを取得する

ネットワークドライブの割り当てや切断などをするときに、どのドライブレターが使われているのかを調べるときはGetLogicalDrivesを利用する。これにより使われているものとそうでないものとを簡単に判別できる。

//
//	使用中のドライブレター取得
//
//ドライブ名が文字列として列挙されて返る。例:AとC、Dドライブが使われているなら"ACD"
//
bool	GetUsedDriveLetter(TCHAR* pszLetter,int nSize)
{
	int		i;
	int		nIndex;
	TCHAR	cbDrive;
	DWORD	dwDrives;

	if(pszLetter == NULL || nSize <= 0)
		return	false;

	dwDrives = ::GetLogicalDrives();

	ZeroMemory(pszLetter,sizeof(TCHAR) * nSize);
	nIndex = 0;
	cbDrive = _T('A');
	for(i = 0; i <= 'Z' - 'A'; i++)
	{
		if(! ((1 << i) & dwDrives))
			continue;

		pszLetter[nIndex++] = cbDrive + i;
		if(nIndex < nSize)
			continue;

		return	(dwDrives << (i+1)) ? false : true;
	}

	return	true;
}



void	Test(void)
{
	bool	ret;
	TCHAR	pszLetters[256];

	ret = GetUsedDriveLetter(pszLetters,256);

	if(ret)
		::MessageBox(NULL,pszLetters,_T(""),MB_OK);
	else
		::MessageBox(NULL,_T("失敗しました"),_T(""),MB_OK);
}

プロジェクトファイルをダウンロード

2006年11月27日

NICのMACアドレス、接続速度などを取得する

GetIfTableを利用するとパソコンに認識されている全てのネットワークカードのMACアドレス、役割、接続速度などを調べてることができる。この関数は残念ながらWindows 95はサポートしていないため、動作はWindows 98以降となる。2007年に発売のWindows Vistaでもサポートされている。
このクラスを作るに当たって初めはWindows 95でも動作するように実装を進めたのだが...そうすんなりといかず、NetBIOSやSNMPでも環境によってはMACアドレスが取得できなかったため諦めた。

test19.gif

依存環境:ATL
#pragma	once

#include "atlstr.h"
#include "iphlpapi.h"
#pragma comment(lib,"iphlpapi.lib") 


class	CDnpNetworkInterface
{
	_MIB_IFTABLE*	_pInfoBuffer;


protected:



	//	Platform SDK: Internet Protocol Helper
	//
	//	GetIfTable() によるMACアドレスの取得
	//
	//		Windows98以降に対応(Windows 95 非対応!:Windows NT4.0はSP4以降に対応)
	//
	//※Windows 95はWinSock1を利用する。WinSock2やNetBiosだとNGなこともある
	//※Windows VistaからはGetIfTable2も利用可能
	//
	bool	GetNicInformation(void)
	{
		DWORD	ret;
		ULONG	dwSize;

		dwSize = 0;
		ret = ::GetIfTable(NULL,&dwSize,TRUE);
		if(ret != NO_ERROR && ret != ERROR_INSUFFICIENT_BUFFER)
			return	false;

		if(_pInfoBuffer)
			delete	(BYTE*)_pInfoBuffer;

		_pInfoBuffer = (_MIB_IFTABLE*)new BYTE[dwSize];
		if(_pInfoBuffer == NULL)
			return	false;

		ZeroMemory(_pInfoBuffer,dwSize);
		ret = ::GetIfTable(_pInfoBuffer,&dwSize,TRUE);
		if(ret != NO_ERROR)
		{
			delete	(BYTE*)_pInfoBuffer;
			_pInfoBuffer = NULL;
			return	false;
		}

		return	true;
	}


	//
	//	クラス内にNICデータを取得済みかチェック
	//
	bool	IsValidInfo(void)
	{
		if(_pInfoBuffer)
			return	true;

		//なければ取得する
		return	GetNicInformation();
	}

public:

	//
	//	コンストラクタ
	//
	CDnpNetworkInterface()
	{
		_pInfoBuffer = NULL;
	}

	//
	//	デストラクタ
	//
	~CDnpNetworkInterface()
	{
		if(_pInfoBuffer)
			delete	(BYTE*)_pInfoBuffer;
	}


	//
	//	検出されたNIC数取得
	//
	DWORD	GetNicCount(void)
	{
		if(IsValidInfo() == false)
			return	0;

		return	_pInfoBuffer->dwNumEntries;
	}


	//
	//	NIC名取得
	//
	bool	GetNicName(DWORD dwIndex,CAtlString* pstrName)
	{
		if(pstrName == NULL)
			return	false;
		*pstrName = _T("");
		if(dwIndex >= GetNicCount())
			return	false;

		*pstrName = (char*)_pInfoBuffer->table[dwIndex].bDescr;

		return	true;
	}


	//
	//	NICのMACアドレス取得
	//
	bool	GetNicMacAddress(DWORD dwIndex,CAtlString* pstrMacAddress,int nFormat=0)
	{
		if(pstrMacAddress == NULL)
			return	false;
		*pstrMacAddress = _T("");
		if(dwIndex >= GetNicCount())
			return	false;

		switch(nFormat)
		{
		case	1:
			pstrMacAddress->Format(_T("%02X %02X %02X %02X %02X %02X")
					,_pInfoBuffer->table[dwIndex].bPhysAddr[0]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[1]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[2]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[3]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[4]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[5]);
			break;

		case	2:
			pstrMacAddress->Format(_T("%02X%02X%02X%02X%02X%02X")
					,_pInfoBuffer->table[dwIndex].bPhysAddr[0]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[1]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[2]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[3]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[4]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[5]);
			break;

		case	0:
		default:
			pstrMacAddress->Format(_T("%02X-%02X-%02X-%02X-%02X-%02X")
					,_pInfoBuffer->table[dwIndex].bPhysAddr[0]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[1]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[2]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[3]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[4]
					,_pInfoBuffer->table[dwIndex].bPhysAddr[5]);
			break;
		}

		return	true;
	}


	//
	//	NICの接続速度取得
	//
	DWORD	GetNicConnectionSpeed(DWORD dwIndex)
	{
		if(dwIndex >= GetNicCount())
			return	0;

		return	_pInfoBuffer->table[dwIndex].dwSpeed;
	}


	//
	//	NICが正常に動いているかチェック(ディスコネクトされていないかなどをチェック)
	//
	bool	IsNicWorking(DWORD dwIndex)
	{
		if(dwIndex >= GetNicCount())
			return	false;

		return	(_pInfoBuffer->table[dwIndex].dwOperStatus == MIB_IF_OPER_STATUS_OPERATIONAL) ? true : false;
	}

};



void	Test(void)
{
	bool		ret;
	DWORD		i;
	DWORD		dwSize;
	DWORD		dwSpeed;
	CAtlString	strName;
	CAtlString	strMacAddress;
	CAtlString	strBuff;
	CAtlString	strMessage;
	CDnpNetworkInterface	cDevice;

	dwSize = cDevice.GetNicCount();
	for(i = 0; i < dwSize; i++)
	{
		ret = cDevice.GetNicName(i,&strName);
		if(ret == false)
			continue;

		ret = cDevice.GetNicMacAddress(i,&strMacAddress);
		if(ret == false)
			continue;

		dwSpeed = cDevice.GetNicConnectionSpeed(i);

		strBuff.Format(_T("概要:%s\nMACアドレス:%s\n接続速度:%dKbps\n"),strName,strMacAddress,dwSpeed/1000);
		strMessage += strBuff;
		if(cDevice.IsNicWorking(i))
			strMessage += _T("動作:正常\n");
		else
			strMessage += _T("動作:停止中\n");

		strMessage += _T("\n");
	}

	::MessageBox(NULL,strMessage,_T(""),MB_OK);
}

ファイルをダウンロード

前の10件 1  2  3  4





usefullcode@gmail.com

About 2006年11月

2006年11月にブログ「UsefullCode.net」に投稿されたすべてのエントリーです。

次の記事は2006年12月です。

他にも多くのエントリーがあります。メインページ記事一覧も見てください。