[PR]

水無瀬の部屋 > Programming > sample > tools > toolsys.cpp
最終更新日: 2007/04/03

   1: //*********************************************************
   2: // プロジェクト: TOOLS
   3: //   ファイル名: toolsys.cpp
   4: //*********************************************************
   5: #include <header/toolsys.h>   //
   6: #include <header/tooldbg.h>   //
   7: #include <header/snprintf.h>  // snprintf(), 
   8: #include <header/toolbase.h>  //
   9: #include <header/toolsysx.h>  //
  10: #include <header/toolwind.h>  //
  11: #include <process.h>          //
  12: 
  13: 
  14: //---------------------------------------------------------
  15: // テスト関数 の 宣言
  16: //---------------------------------------------------------
  17: DECLARE_TESTPROC( test_vkeyname );
  18: 
  19: 
  20: //---------------------------------------------------------
  21: // マクロ定数 の 定義
  22: //---------------------------------------------------------
  23: #define VK_MIN                   ( 0x00 )                    // VK_... の最小値
  24: #define VK_MAX                   ( 0xFF )                    // VK_... の最大値
  25: #define MAX_KEYNAMELENGTH        ( numof("Right Control") ) // キー名の最大幅
  26: #define CLASSNAME_SHELLTRAYWND   ( "Shell_TrayWnd" )         //
  27: #define CLASSNAME_TRAYNOTIFYWND  ( "TrayNotifyWnd" )         //
  28: #define PATH_QUICKLAUNCH         "Microsoft\\Internet Explorer\\Quick Launch"
  29: 
  30: 
  31: //---------------------------------------------------------
  32: // マクロ関数 の 定義
  33: //---------------------------------------------------------
  34: #define SIZE_T_TO_DWORD( u )  ((int)( u ))  // _W64
  35: 
  36: 
  37: //---------------------------------------------------------
  38: // 構造体 の 宣言
  39: //---------------------------------------------------------
  40: typedef int (WINAPI *GetFreeResource_t)(int); 
  41: typedef unsigned (__stdcall BEGINTHREADEXFUNC_t)(void *);
  42: typedef bool (CALLBACK* ENUMDRIVEPROC)( const char *root, void *param );
  43: typedef bool (CALLBACK* ENUMFILEPROC)( const char *filename, const WIN32_FIND_DATA *wfd, void *param );
  44: 
  45: 
  46: //---------------------------------------------------------
  47: // ファイルスコープ関数 の 宣言
  48: //---------------------------------------------------------
  49: static HANDLE CreateFindFileHandle( const char *path, const char *mask, WIN32_FIND_DATA *wfd );
  50: 
  51: 
  52: //------------------------------------------------------------------------------------------------------------------
  53: // a
  54: //------------------------------------------------------------------------------------------------------------------
  55: //*********************************************************
  56: // AddNotifyIcon
  57: //*********************************************************
  58: bool
  59: AddNotifyIcon
  60: 	(
  61: 		NOTIFYICONDATA *nid
  62: 	)
  63: {
  64: 	// パラメタの仮定
  65: 	ASSERT( IsValidNotifyIconData( nid ) );
  66: 
  67: 	return !! Shell_NotifyIcon( NIM_ADD, nid );
  68: }//AddNotifyIcon
  69: 
  70: //*********************************************************
  71: // AddNotifyIconRetry()
  72: //*********************************************************
  73: bool
  74: AddNotifyIconRetry
  75: 	(
  76: 		NOTIFYICONDATA *nid,
  77: 		int             count,
  78: 		int             interval
  79: 	)
  80: {
  81: 	// パラメタの仮定
  82: 	ASSERT( IsValidNotifyIconData( nid ) );
  83: 	ASSERT( 0 <= count );
  84: 	ASSERT( 0 <= interval );
  85: 
  86: 	while( !AddNotifyIcon( nid ) )
  87: 	{
  88: 		if ( count-- <= 0 )
  89: 			return false;
  90: 
  91: 		Sleep( interval );
  92: 	}
  93: 
  94: 	return true;
  95: }//AddNotifyIconRetry
  96: 
  97: //*********************************************************
  98: // AllocClipboardData() => DuplicateClipboardData()
  99: //   クリップボードにある uFormat 型データの複製を得る。
 100: //   使用後は関数 free() で破棄せよ。
 101: //
 102: // HWND hwndOwner
 103: //   クリップボードを専有するウィンドウ。
 104: //   HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
 105: //
 106: // UINT uFormat
 107: //   クリップボードから取得するデータの型。
 108: //   CF_TEXT, ...
 109: //
 110: //*********************************************************
 111: void *
 112: AllocClipboardData
 113: 	(
 114: 		HWND hwndOwner, // クリップボードを専有するウィンドウ
 115: 		UINT uFormat    // 取得するデータの型
 116: 	)
 117: {
 118: 	// パラメタの仮定
 119: 	ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
 120: 
 121: 	if ( !OpenClipboard( hwndOwner ) )
 122: 		return null;
 123: 
 124: 	void *pCopy = null;
 125: 	if ( IsClipboardFormatAvailable( uFormat ) )
 126: 	{
 127: 		HANDLE hMem = GetClipboardData( uFormat );
 128: 		if ( hMem )
 129: 		{
 130: 			SIZE_T dwMemSize = GlobalSize( hMem );
 131: 			if ( 0 < dwMemSize )
 132: 			{
 133: 				const void *pMem = GlobalLock( hMem );
 134: 				if ( pMem )
 135: 				{
 136: 					pCopy = memdup( pMem, dwMemSize );
 137: 					GlobalUnlock( hMem ); // VERIFY( 0 == GlobalUnlock( hMem ) ); とは限らない
 138: 				}
 139: 			}
 140: 		}
 141: 	}
 142: 
 143: 	VERIFY( CloseClipboard() );
 144: 
 145: 	return pCopy;
 146: }//AllocClipboardData
 147: 
 148: //*********************************************************
 149: // AllocRegKeyData
 150: //*********************************************************
 151: void *
 152: AllocRegKeyData
 153: 	(
 154: 		      HKEY  hKey,
 155: 		const char *name
 156: 	)
 157: {
 158: 	// パラメタの仮定
 159: 	ASSERT( IsValidRegKeyHandle( hKey ) );
 160: 	ASSERT( !name || IsValidRegistryValueName( name ) );
 161: 
 162: 	//
 163: 	DWORD size;
 164: 	if ( !GetRegKeyDataSize( hKey, name, &size ) )
 165: 		return null;
 166: 
 167: 	//
 168: 	void *buffer = malloc( size );
 169: 	if ( !buffer ) 
 170: 		return null;
 171: 
 172: 	//
 173: 	if ( !GetRegKeyData( hKey, name, buffer, size ) )
 174: 	{
 175: 		free( buffer );
 176: 		return null;
 177: 	}
 178: 
 179: 	return buffer;
 180: }//AllocRegKeyData
 181: 
 182: //*********************************************************
 183: // AllocRegKeyString
 184: //*********************************************************
 185: char *
 186: AllocRegKeyString
 187: 	(
 188: 		      HKEY  hKey,
 189: 		const char *name
 190: 	)
 191: {
 192: 	// パラメタの仮定
 193: 	ASSERT( IsValidRegKeyHandle( hKey ) );
 194: 	ASSERT( !name || IsValidRegistryValueName( name ) );
 195: 
 196: 	//
 197: 	char *string = (char *)AllocRegKeyData( hKey, name );
 198: 	ASSERT( IsValidStringPtr( string ) );
 199: 	return string;
 200: }//AllocRegKeyString
 201: 
 202: 
 203: //------------------------------------------------------------------------------------------------------------------
 204: // b
 205: //------------------------------------------------------------------------------------------------------------------
 206: //*********************************************************
 207: // BeginThreadEx
 208: //   スレッドを作成する
 209: //   関数が成功するとスレッドのハンドルを返す
 210: //   関数が失敗すると NULL を返す
 211: //
 212: // SECURITY_ATTRIBUTES *pAttributes
 213: //
 214: // DWORD dwStackSize
 215: //   スレッドが所有するスタックの バイト数 を指定する
 216: //   値 0 を指定するとデフォルトのサイズになる。
 217: //
 218: // LPTHREAD_START_ROUTINE ThreadFunc
 219: //
 220: // void *pParam
 221: //   関数 ThreadFunc に渡すパラメタ
 222: //
 223: // DWORD dwFlags
 224: //   CREATE_SUSPENDED …… スレッドをサスペンド状態で作成する
 225: //
 226: // DWORD *dwID
 227: //
 228: //*********************************************************
 229: HANDLE
 230: BeginThreadEx
 231: 	(
 232: 		SECURITY_ATTRIBUTES    *pAttributes,
 233: 		DWORD                   dwStackSize,
 234: 		LPTHREAD_START_ROUTINE  ThreadFunc,
 235: 		void                   *pParam,
 236: 		DWORD                   dwFlags,
 237: 		DWORD                  *dwID
 238: 	)
 239: {
 240: 	// パラメタの仮定
 241: 	ASSERT( IsValidCodePtr( ThreadFunc ) );
 242: 	ASSERT( !pAttributes || IsValidPtr( pAttributes, sizeof( *pAttributes ) ) );
 243: 	ASSERT( IsValidPtr( dwID, sizeof( *dwID ) ) );
 244: 
 245: 	return (HANDLE)_beginthreadex
 246: 		(
 247: 			pAttributes,
 248: 			dwStackSize,
 249: 			(BEGINTHREADEXFUNC_t *)ThreadFunc,
 250: 			pParam,
 251: 			dwFlags,
 252: 			(unsigned *)dwID
 253: 		);
 254: }//BeginThreadEx
 255: 
 256: 
 257: //------------------------------------------------------------------------------------------------------------------
 258: // c
 259: //------------------------------------------------------------------------------------------------------------------
 260: //*********************************************************
 261: // CloseRegKey
 262: //*********************************************************
 263: bool
 264: CloseRegKey
 265: 	(
 266: 		HKEY hKey
 267: 	)
 268: {
 269: 	// パラメタの仮定
 270: 	ASSERT( IsValidRegKeyHandle( hKey ) );
 271: 
 272: 	return ERROR_SUCCESS == RegCloseKey
 273: 		(
 274: 			hKey
 275: 		);
 276: }//CloseRegKey
 277: 
 278: //*********************************************************
 279: // ClearClipboardData()
 280: //   クリップボードを空にする。
 281: //
 282: // HWND hwndOwner
 283: //   クリップボードを専有するウィンドウ。
 284: //   HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
 285: //
 286: //*********************************************************
 287: bool
 288: ClearClipboardData
 289: 	(
 290: 		HWND hwndOwner // クリップボードを専有するウィンドウ
 291: 	)
 292: {
 293: 	// パラメタの仮定
 294: 	ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
 295: 
 296: 	if ( !OpenClipboard( hwndOwner ) )
 297: 	{
 298: 		DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
 299: 			"関数 OpenClipboard() が失敗しました。" );
 300: 		return false;
 301: 	}
 302: 
 303: 	VERIFY( EmptyClipboard() );
 304: 	VERIFY( CloseClipboard() );
 305: 
 306: 	return true;
 307: }//ClearClipboardData
 308: 
 309: //*********************************************************
 310: // CreateHandCursor()
 311: //   指カーソル を作る。
 312: //   作成した 指カーソルへのハンドル を返す。
 313: //   使用後は関数 DestroyCursor() で破棄する。
 314: //
 315: // HINSTANCE hInstance
 316: //   カーソル を作成する モジュール の インスタンス
 317: //
 318: // 使用例:
 319: //	HINSTANCE hInstance = GetModuleHandle( null );
 320: //	HCURSOR hCursor = CreateHandCursor( hInstance );
 321: //	if ( hCursor )
 322: //	{
 323: //		…… 省略 ……
 324: //
 325: //		VERIFY( DestroyCursor( hCursor ) );
 326: //	}
 327: //
 328: //*********************************************************
 329: HCURSOR // 指カーソル への ハンドル
 330: CreateHandCursor
 331: 	(
 332: 		HINSTANCE hInstance // カーソル を作成する モジュール の インスタンス
 333: 	)
 334: {
 335: 	// カーソル の ビットパターン
 336: 	//  AND XOR    <表示> 
 337: 	//   0   0  ……  黒
 338: 	//   0   1  ……  白
 339: 	//   1   0  ……  透明
 340: 	//   1   1  ……  反転
 341: 
 342: #define m( a, b, c, d ) (((((((( 0 a, (((((((( 0 b, (((((((( 0 c, (((((((( 0 d
 343: #define X )*2+1
 344: #define _ )*2
 345: 
 346: 	// AND マスク
 347: 	const BYTE maskAND[ ] = 
 348: 		{
 349: 			m( X X X X X X _ _, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 350: 			m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 351: 			m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 352: 			m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 353: 			m( X X X X X _ _ _, _ X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 354: 			m( X X X X X _ _ _, _ _ _ X X X X X, X X X X X X X X, X X X X X X X X ), 
 355: 			m( X X X X X _ _ _, _ _ _ _ _ _ X X, X X X X X X X X, X X X X X X X X ), 
 356: 			m( X X X X X _ _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ), 
 357: 			m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ), 
 358: 			m( X _ _ _ X _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 359: 			m( X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 360: 			m( X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 361: 			m( X X _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 362: 			m( X X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 363: 			m( X X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 364: 			m( X X X X _ _ _ _, _ _ _ _ _ _ _ _, _ _ X X X X X X, X X X X X X X X ), 
 365: 			m( X X X X _ _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ), 
 366: 			m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ), 
 367: 			m( X X X X X _ _ _, _ _ _ _ _ _ _ _, _ X X X X X X X, X X X X X X X X ), 
 368: 			m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ), 
 369: 			m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ), 
 370: 			m( X X X X X X _ _, _ _ _ _ _ _ _ _, X X X X X X X X, X X X X X X X X ), 
 371: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 372: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 373: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 374: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 375: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 376: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 377: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 378: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 379: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 380: 			m( X X X X X X X X, X X X X X X X X, X X X X X X X X, X X X X X X X X ), 
 381: 		};
 382: 
 383: 	// XOR マスク
 384: 	const BYTE maskXOR[ ] = 
 385: 		{
 386: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 387: 			m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 388: 			m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 389: 			m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 390: 			m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 391: 			m( _ _ _ _ _ _ X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 392: 			m( _ _ _ _ _ _ X X, _ X X _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 393: 			m( _ _ _ _ _ _ X X, _ X X _ X X _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 394: 			m( _ _ _ _ _ _ X X, _ X X _ X X _ X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 395: 			m( _ _ _ _ _ _ X X, _ X X _ X X _ X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 396: 			m( _ _ X X _ _ X X, X X X X X X _ X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 397: 			m( _ _ X X X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 398: 			m( _ _ _ X X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 399: 			m( _ _ _ _ X _ X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 400: 			m( _ _ _ _ X X X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 401: 			m( _ _ _ _ _ X X X, X X X X X X X X, X _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 402: 			m( _ _ _ _ _ X X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 403: 			m( _ _ _ _ _ _ X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 404: 			m( _ _ _ _ _ _ X X, X X X X X X X X, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 405: 			m( _ _ _ _ _ _ _ X, X X X X X X X _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 406: 			m( _ _ _ _ _ _ _ X, X X X X X X X _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 407: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 408: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 409: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 410: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 411: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 412: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 413: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 414: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 415: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 416: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 417: 			m( _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _, _ _ _ _ _ _ _ _ ), 
 418: 		};
 419: 
 420: #undef m // #define m( a, b, c, d )
 421: #undef X // #define X
 422: #undef _ // #define _
 423: 
 424: 
 425: #define HANDCURSOR_WIDTH     ( 32 ) // 指カーソルの幅
 426: #define HANDCURSOR_HEIGHT    ( 32 ) // 指カーソルの高さ
 427: 
 428: 	COMPILE_ASSERT( numof( maskXOR ) == numof( maskAND ) );
 429: 	COMPILE_ASSERT( (HANDCURSOR_WIDTH * HANDCURSOR_HEIGHT) == (CHAR_BIT * numof( maskAND )) );
 430: 	COMPILE_ASSERT( (HANDCURSOR_WIDTH * HANDCURSOR_HEIGHT) == (CHAR_BIT * numof( maskXOR )) );
 431: 
 432: 	const int HANDCURSOR_HOTSPOT_X = 7; // ホットスポットの x 座標
 433: 	const int HANDCURSOR_HOTSPOT_Y = 0; // ホットスポットの y 座標
 434: 	return CreateCursor
 435: 			(
 436: 				hInstance,            // モジュール の インスタンス
 437: 				HANDCURSOR_HOTSPOT_X, // ホットスポットの x 座標
 438: 				HANDCURSOR_HOTSPOT_Y, // ホットスポットの y 座標
 439: 				HANDCURSOR_WIDTH,     // カーソルの幅
 440: 				HANDCURSOR_HEIGHT,    // カーソルの高さ
 441: 				maskAND,              // AND マスク
 442: 				maskXOR               // XOR マスク
 443: 			);
 444: 
 445: #undef HANDCURSOR_WIDTH
 446: #undef HANDCURSOR_HEIGHT
 447: }//CreateHandCursor
 448: 
 449: //*********************************************************
 450: // CreateMutexOnce()
 451: //
 452: // const char *name
 453: //   ミューテックス名。
 454: //   名前には '\' 以外の任意の文字が使用できる。
 455: //   大文字・小文字は区別される。
 456: //   最大文字数は MAX_PATH 文字。
 457: //
 458: //*********************************************************
 459: HANDLE // ミューテックス へのハンドル
 460: CreateMutexOnce
 461: 	(
 462: 		const char *name // ミューテックス名
 463: 	)
 464: {
 465: 	// パラメタの仮定
 466: 	ASSERT( IsValidMutexName( name ) );
 467: 
 468: 	HANDLE hMutex = CreateMutex( null, true, name );
 469: 	if ( !hMutex || (ERROR_ALREADY_EXISTS == GetLastError()) )
 470: 	{
 471: 		// ハンドルはオープンされているのでミューテックスを解放する。
 472: 		if ( hMutex )
 473: 		{
 474: 			VERIFY( CloseHandle( hMutex ) );
 475: 		}
 476: 
 477: 		return null;
 478: 	}
 479: 
 480: 	return hMutex;
 481: }//CreateMutexOnce
 482: 
 483: //*********************************************************
 484: // CreateNoDropCursor()
 485: //   ドロップ不可カーソル を作る。
 486: //   作成した カーソルへのハンドル を返す。
 487: //   使用後は関数 DestroyCursor() で破棄する。
 488: //
 489: // HINSTANCE hInstance
 490: //   カーソル を作成する モジュール の インスタンス
 491: //
 492: // 使用例:
 493: //	HINSTANCE hInstance = GetModuleHandle( null );
 494: //	HCURSOR hCursor = CreateNoDropCursor( hInstance );
 495: //	if ( hCursor )
 496: //	{
 497: //		…… 省略 ……
 498: //
 499: //		VERIFY( DestroyCursor( hCursor ) );
 500: //	}
 501: //
 502: //*********************************************************
 503: HCURSOR // カーソル への ハンドル
 504: CreateNoDropCursor
 505: 	(
 506: 		HINSTANCE hInstance // カーソル を作成する モジュール の インスタンス
 507: 	)
 508: {
 509: 	// カーソル の ビットパターン
 510: 	//  AND XOR    <表示> 
 511: 	//   0   0  ……  黒
 512: 	//   0   1  ……  白
 513: 	//   1   0  ……  透明
 514: 	//   1   1  ……  反転
 515: 
 516: #define m( a, b, c, d ) (((((((( 0 a, (((((((( 0 b, (((((((( 0 c, (((((((( 0 d
 517: #define X )*2+1
 518: #define _ )*2
 519: 
 520: 	// AND マスク
 521: 	const BYTE maskAND[ ] = 
 522: 		{
 523: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 524: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 525: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 526: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 527: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 528: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 529: 			m( X X X X X X X X,X X X X X _ _ _,_ _ _ X X X X X,X X X X X X X X ), 
 530: 			m( X X X X X X X X,X X X _ _ _ _ _,_ _ _ _ _ X X X,X X X X X X X X ), 
 531: 			m( X X X X X X X X,X X _ _ _ _ _ _,_ _ _ _ _ _ X X,X X X X X X X X ), 
 532: 			m( X X X X X X X X,X _ _ _ _ _ _ _,_ _ _ _ _ _ _ X,X X X X X X X X ), 
 533: 			m( X X X X X X X X,_ _ _ _ _ _ X X,X X _ _ _ _ _ _,X X X X X X X X ), 
 534: 			m( X X X X X X X _,_ _ _ _ _ _ X X,X X X X _ _ _ _,_ X X X X X X X ), 
 535: 			m( X X X X X X X _,_ _ _ _ _ _ _ X,X X X X X _ _ _,_ X X X X X X X ), 
 536: 			m( X X X X X X _ _,_ _ _ _ _ _ _ _,X X X X X _ _ _,_ _ X X X X X X ), 
 537: 			m( X X X X X X _ _,_ _ X X _ _ _ _,_ X X X X X _ _,_ _ X X X X X X ), 
 538: 			m( X X X X X X _ _,_ _ X X X _ _ _,_ _ X X X X _ _,_ _ X X X X X X ), 
 539: 			m( X X X X X X _ _,_ _ X X X X _ _,_ _ _ X X X _ _,_ _ X X X X X X ), 
 540: 			m( X X X X X X _ _,_ _ X X X X X _,_ _ _ _ X X _ _,_ _ X X X X X X ), 
 541: 			m( X X X X X X _ _,_ _ _ X X X X X,_ _ _ _ _ _ _ _,_ _ X X X X X X ), 
 542: 			m( X X X X X X X _,_ _ _ X X X X X,X _ _ _ _ _ _ _,_ X X X X X X X ), 
 543: 			m( X X X X X X X _,_ _ _ _ X X X X,X X _ _ _ _ _ _,_ X X X X X X X ), 
 544: 			m( X X X X X X X X,_ _ _ _ _ _ X X,X X X _ _ _ _ _,X X X X X X X X ), 
 545: 			m( X X X X X X X X,X _ _ _ _ _ _ _,_ _ _ _ _ _ _ X,X X X X X X X X ), 
 546: 			m( X X X X X X X X,X X _ _ _ _ _ _,_ _ _ _ _ _ X X,X X X X X X X X ), 
 547: 			m( X X X X X X X X,X X X _ _ _ _ _,_ _ _ _ _ X X X,X X X X X X X X ), 
 548: 			m( X X X X X X X X,X X X X X _ _ _,_ _ _ X X X X X,X X X X X X X X ), 
 549: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 550: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 551: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 552: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 553: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 554: 			m( X X X X X X X X,X X X X X X X X,X X X X X X X X,X X X X X X X X ), 
 555: 		};
 556: 
 557: 	// XOR マスク
 558: 	const BYTE maskXOR[ ] = 
 559: 		{
 560: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 561: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 562: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 563: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 564: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 565: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 566: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ X X X,X X X _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 567: 			m( _ _ _ _ _ _ _ _,_ _ _ X X _ _ _,_ _ _ X X _ _ _,_ _ _ _ _ _ _ _ ), 
 568: 			m( _ _ _ _ _ _ _ _,_ _ X _ _ _ _ _,_ _ _ _ _ X _ _,_ _ _ _ _ _ _ _ ), 
 569: 			m( _ _ _ _ _ _ _ _,_ X _ _ _ _ X X,X X _ _ _ _ X _,_ _ _ _ _ _ _ _ ), 
 570: 			m( _ _ _ _ _ _ _ _,X _ _ _ X X _ _,_ _ X X _ _ _ X,_ _ _ _ _ _ _ _ ), 
 571: 			m( _ _ _ _ _ _ _ X,_ _ _ _ _ X _ _,_ _ _ _ X _ _ _,X _ _ _ _ _ _ _ ), 
 572: 			m( _ _ _ _ _ _ _ X,_ _ X _ _ _ X _,_ _ _ _ _ X _ _,X _ _ _ _ _ _ _ ), 
 573: 			m( _ _ _ _ _ _ X _,_ _ X X _ _ _ X,_ _ _ _ _ X _ _,_ X _ _ _ _ _ _ ), 
 574: 			m( _ _ _ _ _ _ X _,_ X _ _ X _ _ _,X _ _ _ _ _ X _,_ X _ _ _ _ _ _ ), 
 575: 			m( _ _ _ _ _ _ X _,_ X _ _ _ X _ _,_ X _ _ _ _ X _,_ X _ _ _ _ _ _ ), 
 576: 			m( _ _ _ _ _ _ X _,_ X _ _ _ _ X _,_ _ X _ _ _ X _,_ X _ _ _ _ _ _ ), 
 577: 			m( _ _ _ _ _ _ X _,_ X _ _ _ _ _ X,_ _ _ X _ _ X _,_ X _ _ _ _ _ _ ), 
 578: 			m( _ _ _ _ _ _ X _,_ _ X _ _ _ _ _,X _ _ _ X X _ _,_ X _ _ _ _ _ _ ), 
 579: 			m( _ _ _ _ _ _ _ X,_ _ X _ _ _ _ _,_ X _ _ _ X _ _,X _ _ _ _ _ _ _ ), 
 580: 			m( _ _ _ _ _ _ _ X,_ _ _ X _ _ _ _,_ _ X _ _ _ _ _,X _ _ _ _ _ _ _ ), 
 581: 			m( _ _ _ _ _ _ _ _,X _ _ _ X X _ _,_ _ _ X _ _ _ X,_ _ _ _ _ _ _ _ ), 
 582: 			m( _ _ _ _ _ _ _ _,_ X _ _ _ _ X X,X X X _ _ _ X _,_ _ _ _ _ _ _ _ ), 
 583: 			m( _ _ _ _ _ _ _ _,_ _ X _ _ _ _ _,_ _ _ _ _ X _ _,_ _ _ _ _ _ _ _ ), 
 584: 			m( _ _ _ _ _ _ _ _,_ _ _ X X _ _ _,_ _ _ X X _ _ _,_ _ _ _ _ _ _ _ ), 
 585: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ X X X,X X X _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 586: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 587: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 588: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 589: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 590: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 591: 			m( _ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _,_ _ _ _ _ _ _ _ ), 
 592: 		};
 593: 
 594: #undef m // #define m( a, b, c, d )
 595: #undef X // #define X
 596: #undef _ // #define _
 597: 
 598: 
 599: #define NODROPCURSOR_WIDTH     ( 32 ) // カーソルの幅
 600: #define NODROPCURSOR_HEIGHT    ( 32 ) // カーソルの高さ
 601: 
 602: 	COMPILE_ASSERT( numof( maskXOR ) == numof( maskAND ) );
 603: 	COMPILE_ASSERT( (NODROPCURSOR_WIDTH * NODROPCURSOR_HEIGHT) == (CHAR_BIT * numof( maskAND )) );
 604: 	COMPILE_ASSERT( (NODROPCURSOR_WIDTH * NODROPCURSOR_HEIGHT) == (CHAR_BIT * numof( maskXOR )) );
 605: 
 606: 	const int NODROPCURSOR_HOTSPOT_X = 15; // ホットスポットの x 座標
 607: 	const int NODROPCURSOR_HOTSPOT_Y = 15; // ホットスポットの y 座標
 608: 	return CreateCursor
 609: 			(
 610: 				hInstance,              // モジュール の インスタンス
 611: 				NODROPCURSOR_HOTSPOT_X, // ホットスポットの x 座標
 612: 				NODROPCURSOR_HOTSPOT_Y, // ホットスポットの y 座標
 613: 				NODROPCURSOR_WIDTH,     // カーソルの幅
 614: 				NODROPCURSOR_HEIGHT,    // カーソルの高さ
 615: 				maskAND,                // AND マスク
 616: 				maskXOR                 // XOR マスク
 617: 			);
 618: 
 619: #undef NODROPCURSOR_WIDTH
 620: #undef NODROPCURSOR_HEIGHT
 621: }//CreateNoDropCursor
 622: 
 623: //*********************************************************
 624: // CreateNotifyIconData
 625: //*********************************************************
 626: NOTIFYICONDATA *
 627: CreateNotifyIconData
 628: 	(
 629: 		      HWND   hWnd,
 630: 		      UINT   uID,
 631: 		      UINT   uMessage,
 632: 		      HICON  hIcon,
 633: 		const char  *szTip
 634: 	)
 635: {
 636: 	// パラメタの仮定
 637: 	ASSERT( IsValidWindow( hWnd ) );
 638: 	ASSERT( IsValidIconHandle( hIcon ) );
 639: 	ASSERT( IsValidStringPtr( szTip ) );
 640: 	
 641: 	NOTIFYICONDATA *nid = (NOTIFYICONDATA *)malloc( sizeof( *nid ) );
 642: 	if ( !nid )
 643: 	{
 644: 		return null;
 645: 	}
 646: 
 647: 	VERIFY( MakeNotifyIconData
 648: 		( 
 649: 			nid,
 650: 			hWnd,     //
 651: 			uID,      // 
 652: 			uMessage, // 
 653: 			hIcon,    //
 654: 			szTip     // 
 655: 		) );
 656: 
 657: 	ASSERT( IsValidNotifyIconData( nid ) );
 658: 	return nid;
 659: }//CreateNotifyIconData
 660: 
 661: //*********************************************************
 662: // CreateRegKey
 663: //*********************************************************
 664: bool
 665: CreateRegKey
 666: 	(
 667: 		      HKEY    hkeyRoot, 
 668: 		const char   *name,
 669: 		      REGSAM  samDesired,
 670: 		      HKEY   *hKey
 671: 	)
 672: {
 673: 	// パラメタの仮定
 674: 	ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
 675: 	ASSERT( IsValidRegistryKeyName( name ) );
 676: 	ASSERT( IsValidPtr( hKey, sizeof( *hKey ) ) );
 677: 
 678: 	DWORD dwDumy;
 679: 	return ERROR_SUCCESS == RegCreateKeyEx
 680: 		(
 681: 			hkeyRoot,
 682: 			name, 
 683: 			0, // reserved
 684: 			"",
 685: 			REG_OPTION_NON_VOLATILE,
 686: 			samDesired,
 687: 			null,
 688: 			hKey,
 689: 			&dwDumy
 690: 		);
 691: }//CreateRegKey
 692: 
 693: //*********************************************************
 694: // CreateShellLinkFile
 695: //*********************************************************
 696: bool
 697: CreateShellLinkFile
 698: 	(
 699: 		      DWORD  dwClsContext, //
 700: 		const char  *lnkname,      // ファイル名
 701: 		const char  *path,         // リンク先
 702: 		const char  *param,        // 引数
 703: 		const char  *work,         // 作業ディレクトリ
 704: 		      int    nShowCmd,     // 
 705: 		      bool   bRemember     // 
 706: 	)
 707: {
 708: 	// パラメタの仮定
 709: 	ASSERT( IsValidLocalPathString( lnkname ) );
 710: 	ASSERT( strtstri( lnkname, ".lnk" ) );
 711: 	ASSERT( IsPathExist( path ) );
 712: 	ASSERT( !param || IsValidStringPtr( param ) );
 713: 	ASSERT( !work  || IsPathDirectory( work ) );
 714: 
 715: 	//
 716: 	IShellLink *psl = CreateShellLinkInstanceEx( dwClsContext, path, param, work, nShowCmd );
 717: 	if ( ! psl )
 718: 	{
 719: 		DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
 720: 			"関数 CreateShellLinkInstanceEx() が失敗しました。" );
 721: 	}
 722: 	else
 723: 	{
 724: 		if ( ! SaveShellLink( psl, lnkname, bRemember ) )
 725: 		{
 726: 			DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
 727: 				"関数 SaveShellLink() が失敗しました。" );
 728: 		}
 729: 		else
 730: 		{
 731: 			psl->Release();
 732: 			return true;
 733: 		}
 734: 		psl->Release();
 735: 	}
 736: 
 737: 	return false;
 738: }//CreateShellLinkFile
 739: 
 740: //*********************************************************
 741: // CreateShellLinkInstance
 742: // IShellLink の初期化
 743: //*********************************************************
 744: IShellLink *
 745: CreateShellLinkInstance
 746: 	(
 747: 		DWORD dwClsContext
 748: 	)
 749: {
 750: 	// パラメタの仮定
 751: 	ASSERT( CLSCTX_INPROC_SERVER == dwClsContext );
 752: 
 753: 	IShellLink *psl;
 754: 	if ( S_OK != CoCreateInstance( CLSID_ShellLink, null, dwClsContext, IID_IShellLink, (void **)&psl ) )
 755: 	{
 756: 		DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
 757: 			"関数 CoCreateInstance() が失敗しました。" );
 758: 		return null;
 759: 	}
 760: 
 761: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
 762: 	return psl;
 763: }//CreateShellLinkInstance
 764: 
 765: //*********************************************************
 766: // CreateShellLinkInstanceEx
 767: //*********************************************************
 768: IShellLink *
 769: CreateShellLinkInstanceEx
 770: 	(
 771: 		      DWORD  dwClsContext, //
 772: 		const char  *path,         // リンク先
 773: 		const char  *param,        // 引数
 774: 		const char  *work,         // 作業ディレクトリ
 775: 		      int    nShowCmd      // 
 776: 	)
 777: {
 778: 	// パラメタの仮定
 779: 	ASSERT( IsPathExist( path ) );
 780: 	ASSERT( !param || IsValidStringPtr( param ) );
 781: 	ASSERT( !work  || IsPathDirectory( work ) );
 782: 
 783: 	//
 784: 	IShellLink *psl = CreateShellLinkInstance( dwClsContext );
 785: 	if ( !psl )
 786: 	{
 787: 		DBG_TRACE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
 788: 			"関数 CreateShellLinkInstance() が失敗しました。" );
 789: 		return null;
 790: 	}
 791: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
 792: 
 793: 	// 情報の設定
 794: 	if ( (S_OK == psl->SetPath( path ))
 795: 	  && (!param || (S_OK == psl->SetArguments( param )))
 796: 	  && (!work  || (S_OK == psl->SetWorkingDirectory( work )))
 797: 	  && (S_OK == psl->SetShowCmd( nShowCmd )) )
 798: 	{
 799: 		return psl;
 800: 	}
 801: 
 802: 	psl->Release();
 803: 	return null;
 804: }//CreateShellLinkInstanceEx
 805: 
 806: //*********************************************************
 807: // CreateTemporaryFile()
 808: //   一時ファイルを作成する。
 809: //   作成した一時ファイルへのストリームを返す。
 810: //   作成したファイルは使用者が削除せよ。
 811: //*********************************************************
 812: FILE * // 作成したファイルへのストリーム
 813: CreateTemporaryFile
 814: 	(
 815: 		      char *path,
 816: 		      int   bufsize,
 817: 		const char *mode
 818: 	)
 819: {
 820: 	// パラメタの仮定
 821: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
 822: 	ASSERT( IsValidStringBufferPtr( path, bufsize ) );
 823: 	DESTROY_TEXT_BUFFER( path, bufsize ); // [破壊]
 824: 
 825: 	// 複数のプロセスで作業ファイル名が競合しないよう
 826: 	// プロセス毎に異なる値を使いたい
 827: 	const DWORD dwId = GetCurrentProcessId();
 828: 	const int offset = (0xFFFF & (dwId ^ (dwId << 2) ^ (dwId << 4) ^ (dwId << 6)));
 829: 
 830: 	//
 831: 	{for( int i = 0; i < 1000; ++i )
 832: 	{
 833: 		// 000-999
 834: 		char ext[ MAX_PATH_BUF ];
 835: 		VERIFY( 0 < snprintf( ext, numof( ext ), ".%03d", (i + offset) % 1000 ) );
 836: 		ASSERT( 4 == strlen( ext ) );
 837: 
 838: 		GetModuleFile( path, bufsize, ext );
 839: 		if ( !IsPathExist( path ) )
 840: 		{
 841: 			FILE *fp = fopen( path, mode );
 842: 			if ( fp )
 843: 			{
 844: 				return fp;
 845: 			}
 846: 		}
 847: 	}}
 848: 
 849: 	return null;
 850: }//CreateTemporaryFile
 851: 
 852: //*********************************************************
 853: // CursorInRect
 854: //  矩形 rect はスクリーン座標
 855: //*********************************************************
 856: bool
 857: CursorInRect
 858: 	(
 859: 		const RECT *rect
 860: 	)
 861: {
 862: 	// パラメタの仮定
 863: 	ASSERT( IsValidReadPtr( rect, sizeof( *rect ) ) );
 864: 
 865: 	POINT pt;
 866: 	VERIFY( GetCursorPos( &pt ) );
 867: 	return boolean_cast( PtInRect( rect, pt ) );
 868: }//CursorInRect
 869: 
 870: 
 871: //------------------------------------------------------------------------------------------------------------------
 872: // d
 873: //------------------------------------------------------------------------------------------------------------------
 874: //*********************************************************
 875: // DeleteNotifyIcon
 876: //*********************************************************
 877: bool
 878: DeleteNotifyIcon
 879: 	(
 880: 		NOTIFYICONDATA *nid
 881: 	)
 882: {
 883: 	// パラメタの仮定
 884: 	ASSERT( IsValidNotifyIconData( nid ) );
 885: 
 886: 	return !! Shell_NotifyIcon( NIM_DELETE, nid );
 887: }//DeleteNotifyIcon
 888: 
 889: //*********************************************************
 890: // DeleteRegKey
 891: //*********************************************************
 892: bool
 893: DeleteRegKey
 894: 	(
 895: 		      HKEY  hKey,
 896: 		const char *name
 897: 	)
 898: {
 899: 	// パラメタの仮定
 900: 	ASSERT( IsValidRegKeyHandle( hKey ) );
 901: 	ASSERT( IsValidRegistryKeyName( name ) );
 902: 
 903: 	return ERROR_SUCCESS == RegDeleteKey
 904: 		(
 905: 			hKey,
 906: 			name
 907: 		);
 908: }//DeleteRegKey
 909: 
 910: //*********************************************************
 911: // DrawLine
 912: //*********************************************************
 913: bool
 914: DrawLine
 915: 	(
 916: 		HDC   hDC,
 917: 		POINT ptFrom,
 918: 		POINT ptTo
 919: 	)
 920: {
 921: 	// パラメタの仮定
 922: 	ASSERT( hDC );
 923: 
 924: 	VERIFY( MoveToEx( hDC, ptFrom.x, ptFrom.y, null ) );
 925: 	return !! LineTo( hDC, ptTo.x, ptTo.y );
 926: }//DrawLine
 927: 
 928: //*********************************************************
 929: // DuplicateDirectory
 930: // ディレクトリ TemplateDirectory と同じ属性を持つ
 931: // ディレクトリ NewDirectory を作成する
 932: //*********************************************************
 933: bool
 934: DuplicateDirectory
 935: 	(
 936: 		const char                *TemplateDirectory,
 937: 		const char                *NewDirectory,
 938: 		      SECURITY_ATTRIBUTES *pSecurity
 939: 	)
 940: {
 941: 	// パラメタの仮定
 942: 	ASSERT( IsValidLocalPathString( NewDirectory ) );
 943: 	ASSERT( IsPathDirectory( TemplateDirectory ) );
 944: 	ASSERT( !pSecurity || IsValidPtr( pSecurity, sizeof( *pSecurity ) ) );
 945: 
 946: 	// ディレクトリを作成
 947: 	if ( !CreateDirectoryEx( TemplateDirectory, NewDirectory, pSecurity ) )
 948: 		return false; // ディレクトリの作成に失敗
 949: 	ASSERT( IsPathDirectory( NewDirectory ) );
 950: 
 951: 	// 属性の複写
 952: 	const DWORD dwFileAttributes = GetFileAttributes( TemplateDirectory );
 953: 	return !! SetFileAttributes( NewDirectory, dwFileAttributes );
 954: }//DuplicateDirectory
 955: 
 956: 
 957: //------------------------------------------------------------------------------------------------------------------
 958: // e
 959: //------------------------------------------------------------------------------------------------------------------
 960: //*********************************************************
 961: // EnumFile
 962: //*********************************************************
 963: bool
 964: EnumFile
 965: 	(
 966: 		const char         *path,
 967: 		const char         *mask,
 968: 		      ENUMFILEPROC  proc,
 969: 		      void         *param
 970: 	)
 971: {
 972: 	// パラメタの仮定
 973: 	ASSERT( IsPathDirectory( path ) );
 974: 	ASSERT( IsValidStringPtr( mask ) );
 975: 	ASSERT( IsValidCodePtr( proc ) );
 976: 
 977: 	// ディレクトリを走査
 978: 	WIN32_FIND_DATA wfd;
 979: 	HANDLE hFind = CreateFindFileHandle( path, mask, &wfd );
 980: 	if ( INVALID_HANDLE_VALUE != hFind )
 981: 	{
 982: 		bool bContinue = true;
 983: 		do // while( FindNextFile( hFind, &wfd ) );
 984: 		{
 985: 			if ( !streql( ".",  wfd.cFileName )
 986: 			  && !streql( "..", wfd.cFileName ) )
 987: 			{
 988: 				char filename[ MAX_PATH_BUF ];
 989: 				MakeFullPath( filename, numof( filename ), path, wfd.cFileName );
 990: 				ASSERT( ! IsPathTailSeparator( filename ) );
 991: 				ASSERT( IsPathDescendant( filename, path ) );
 992: 
 993: 				bContinue = proc( filename, &wfd, param );
 994: 			}
 995: 		}while( bContinue && FindNextFile( hFind, &wfd ) );
 996: 		ASSERT( !bContinue || (ERROR_NO_MORE_FILES == GetLastError()) );
 997: 		VERIFY( FindClose( hFind ) );
 998: 	}
 999: 
1000: 	return true;
1001: }//EnumFile
1002: 
1003: //*********************************************************
1004: // EnumLogicalDrives
1005: //*********************************************************
1006: bool
1007: EnumLogicalDrives
1008: 	(
1009: 		ENUMDRIVEPROC  proc,
1010: 		void          *param 
1011: 	)
1012: {
1013: 	// パラメタの仮定
1014: 	ASSERT( IsValidCodePtr( proc ) );
1015: 
1016: 	DWORD drives = GetLogicalDrives();
1017: 	{for( int i = 0; 0 != drives; ++i, drives >>= 1 )
1018: 	{
1019: 		char root[] = "A:\\";
1020: 		root[ 0 ] = static_cast<char>( 'A' + i );
1021: 		if ( !proc( root, param ) )
1022: 		{
1023: 			return false;
1024: 		}
1025: 	}}
1026: 
1027: 	return true;
1028: }//EnumLogicalDrives
1029: 
1030: //*********************************************************
1031: // EnumRegKey
1032: //*********************************************************
1033: bool
1034: EnumRegKey
1035: 	(
1036: 		HKEY    hKey,
1037: 		DWORD   index, 
1038: 		char   *buffer,
1039: 		DWORD   bufsize
1040: 	)
1041: {
1042: 	// パラメタの仮定
1043: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1044: 	ASSERT( 0 < bufsize );
1045: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1046: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1047: 
1048: 	FILETIME ft;
1049: 	return ERROR_SUCCESS == RegEnumKeyEx
1050: 		(
1051: 			hKey, 
1052: 			index,
1053: 			buffer,
1054: 			&bufsize,
1055: 			null, // reserved
1056: 			null,
1057: 			null,
1058: 			&ft
1059: 		);
1060: }//EnumRegKey
1061: 
1062: //*********************************************************
1063: // EnumRegValueName
1064: //*********************************************************
1065: bool
1066: EnumRegValueName
1067: 	(
1068: 		HKEY   hKey,
1069: 		DWORD  index, 
1070: 		char  *buffer,
1071: 		DWORD  bufsize
1072: 	)
1073: {
1074: 	// パラメタの仮定
1075: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1076: 	ASSERT( 0 < bufsize );
1077: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1078: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1079: 
1080: 	return ERROR_SUCCESS == RegEnumValue
1081: 		(
1082: 			hKey,
1083: 			index,
1084: 			buffer,
1085: 			&bufsize,
1086: 			0,
1087: 			null,
1088: 			null,
1089: 			null
1090: 		);
1091: }//EnumRegValueName
1092: 
1093: 
1094: //------------------------------------------------------------------------------------------------------------------
1095: // f
1096: //------------------------------------------------------------------------------------------------------------------
1097: //*********************************************************
1098: // FindShellTrayWnd
1099: // タスクトレイのハンドルを返す
1100: //*********************************************************
1101: HWND
1102: FindShellTrayWnd
1103: 	(
1104: 		void
1105: 	)
1106: {
1107: 	HWND hParent = FindWindow( CLASSNAME_SHELLTRAYWND, "" );
1108: 	return FindWindowEx( hParent, null, CLASSNAME_TRAYNOTIFYWND, "" );
1109: }//FindShellTrayWnd
1110: 
1111: //*********************************************************
1112: // fsize
1113: // 失敗時には INVALID_FILE_SIZE を返す。
1114: //*********************************************************
1115: DWORD
1116: fsize
1117: 	(
1118: 		const char  *path,
1119: 		      DWORD *dwSizeHigh
1120: 	)
1121: {
1122: 	// パラメタの仮定
1123: 	ASSERT( IsPathFile( path ) );
1124: 	ASSERT( !dwSizeHigh || IsValidPtr( dwSizeHigh, sizeof( *dwSizeHigh ) ) );
1125: 
1126: 	//
1127: 	DWORD dwSizeLow = INVALID_FILE_SIZE;
1128: 	if ( dwSizeHigh )
1129: 	{
1130: 		*dwSizeHigh = INVALID_FILE_SIZE;
1131: 	}
1132: 
1133: 	//
1134: 	HANDLE hFile = CreateFile( path, GENERIC_READ, 0, null, OPEN_EXISTING, 0, null );
1135: 	if ( INVALID_HANDLE_VALUE != hFile )
1136: 	{
1137: 		dwSizeLow = GetFileSize( hFile, dwSizeHigh );
1138: 		VERIFY( CloseHandle( hFile ) );
1139: 		return dwSizeLow;
1140: 	}
1141: 	else
1142: 	{
1143: 		WIN32_FIND_DATA wfd;
1144: 		if ( !GetFileInformation( path, &wfd ) )
1145: 		{
1146: 			return INVALID_FILE_SIZE;
1147: 		}
1148: 
1149: 		if ( dwSizeHigh )
1150: 		{
1151: 			*dwSizeHigh = wfd.nFileSizeHigh;
1152: 		}
1153: 
1154: 		return wfd.nFileSizeLow;
1155: 	}
1156: }//fsize
1157: 
1158: 
1159: //------------------------------------------------------------------------------------------------------------------
1160: // g
1161: //------------------------------------------------------------------------------------------------------------------
1162: //*********************************************************
1163: // GetClientCursorPos
1164: //*********************************************************
1165: bool
1166: GetClientCursorPos
1167: 	(
1168: 		HWND   hWnd, 
1169: 		POINT *pt
1170: 	)
1171: {
1172: 	// パラメタの仮定
1173: 	ASSERT( IsValidWindow( hWnd ) );
1174: 	ASSERT( IsValidPtr( pt, sizeof( *pt ) ) );
1175: 
1176: 	VERIFY( GetCursorPos( pt ) );
1177: 	return boolean_cast( ScreenToClient( hWnd, pt ) );
1178: }//GetClientCursorPos
1179: 
1180: //*********************************************************
1181: // GetCreateParam
1182: //*********************************************************
1183: void *
1184: GetCreateParam
1185: 	(
1186: 		LPARAM lParam
1187: 	)
1188: {
1189: 	// パラメタの仮定
1190: 	ASSERT( IsValidPtr( (CREATESTRUCT *)lParam, sizeof( CREATESTRUCT ) ) );
1191: 
1192: 	// 設定を
1193: 	const CREATESTRUCT *cs = reinterpret_cast<CREATESTRUCT *>( lParam );
1194: 	return cs->lpCreateParams;
1195: }//GetCreateParam
1196: 
1197: //*********************************************************
1198: // GetCurrentProcessPriorityClass
1199: //*********************************************************
1200: DWORD
1201: GetCurrentProcessPriorityClass
1202: 	(
1203: 		void 
1204: 	)
1205: {
1206: 	HANDLE hCurrentProcess = GetCurrentProcess();
1207: 	return !! GetPriorityClass( hCurrentProcess );
1208: }//GetCurrentProcessPriorityClass
1209: 
1210: //*********************************************************
1211: // GetFileInformation
1212: // パス path の WIN32_FIND_DATA を取得する
1213: //*********************************************************
1214: bool
1215: GetFileInformation
1216: 	(
1217: 		const char            *path,
1218: 		      WIN32_FIND_DATA *wfd
1219: 	)
1220: {
1221: 	// パラメタの仮定
1222: 	ASSERT( IsValidLocalPathString( path ) );
1223: 	ASSERT( IsValidPtr( wfd, sizeof( *wfd ) ) );
1224: 	DESTROY_BUFFER( wfd, sizeof( *wfd ) ); // [破壊]
1225: 
1226: 	HANDLE hFind = FindFirstFile( path, wfd );
1227: 	if ( INVALID_HANDLE_VALUE == hFind )
1228: 	{
1229: 		return false; // ファイルが見つからず
1230: 	}
1231: 
1232: 	VERIFY( FindClose( hFind ) );
1233: 	return true;
1234: }//GetFileInformation
1235: 
1236: //*********************************************************
1237: // 関数名:
1238: //     GetFreeResource
1239: //
1240: // 戻り値:
1241: //     bool …… 関数が成功すると 真  を、
1242: //               関数が失敗すると 偽 を返す。
1243: //
1244: // 引数:
1245: //     nSystem …… 使用可能な システムリソース の量(単位%)
1246: //     nGdi    …… 使用可能な GDIリソース   の量(単位%)
1247: //     nUser   …… 使用可能な USERリソース の量(単位%)
1248: //*********************************************************
1249: bool
1250: GetFreeResource
1251: 	(
1252: 		int *nSystem,
1253: 		int *nGdi,
1254: 		int *nUser
1255: 	)
1256: {
1257: 	// パラメタの仮定
1258: 	ASSERT( nSystem || nGdi || nUser );
1259: 
1260: 	HINSTANCE hInstance = LoadLibrary( "rsrc32.dll" ); // rsrc32.dll をロード
1261: 	if ( hInstance )
1262: 	{
1263: 		GetFreeResource_t pGetFreeResource; // リソースを取得できる関数
1264: 		pGetFreeResource = (GetFreeResource_t)GetProcAddress( hInstance, "_MyGetFreeSystemResources32@4" ); // 関数をロード
1265: 		if ( pGetFreeResource )
1266: 		{
1267: 			const int GFR_SYSTEM = ( 0 ); // システムリソース
1268: 			const int GFR_GDI    = ( 1 ); // GDIリソース
1269: 			const int GFR_USER   = ( 2 ); // USERリソース
1270: 
1271: 			if ( nSystem )
1272: 				*nSystem = pGetFreeResource( GFR_SYSTEM ); // 使用可能なシステムリソース量を取得
1273: 			if ( nGdi )
1274: 				*nGdi = pGetFreeResource( GFR_GDI    ); // 使用可能なGDIリソース量を取得
1275: 			if ( nUser )
1276: 				*nUser = pGetFreeResource( GFR_USER   ); // 使用可能なUSERリソース量を取得
1277: 			FreeLibrary( hInstance );
1278: 			return true;
1279: 		}
1280: 		FreeLibrary( hInstance );
1281: 	}
1282: 	return false;
1283: }//GetFreeResource
1284: 
1285: //*********************************************************
1286: // GetLocalFileTime()
1287: //   現在の ローカル日時 を FILETIME 形式 で取得する。
1288: //
1289: //
1290: //*********************************************************
1291: bool
1292: GetLocalFileTime
1293: 	(
1294: 		FILETIME *ftLocal
1295: 	)
1296: {
1297: 	// パラメタの仮定
1298: 	ASSERT( IsValidPtr( ftLocal, sizeof( *ftLocal ) ) );
1299: 	DESTROY_BUFFER( ftLocal, sizeof( *ftLocal ) ); // [破壊]
1300: 
1301: 	SYSTEMTIME stLocal;
1302: 	GetLocalTime( &stLocal );
1303: 	return !! SystemTimeToFileTime( &stLocal, ftLocal );
1304: }//GetLocalFileTime
1305: 
1306: //*********************************************************
1307: // GetLongFileName
1308: // 短いファイル名(8.3形式)から長いファイル名を取得する
1309: //*********************************************************
1310: bool
1311: GetLongFileName
1312: 	(
1313: 		const char  *shortname,
1314: 		      char  *longname,
1315: 		      DWORD  bufsize
1316: 	)
1317: {
1318: 	// パラメタの仮定
1319: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1320: 	ASSERT( IsValidStringBufferPtr( longname, bufsize ) );
1321: 	ASSERT( IsPathExist( shortname ) );
1322: 	ASSERT( strlen(shortname) <= MAX_PATH );
1323: 	ASSERT( (longname > strtail(shortname)) || (shortname > longname + bufsize) );
1324: 	DESTROY_TEXT_BUFFER( longname, bufsize ); // [破壊]
1325: 
1326: 	//
1327: 	longname[0] = '\0';
1328: 
1329: 	//
1330: 	IMalloc *pMalloc;
1331: 	if ( NOERROR != SHGetMalloc( &pMalloc ) )
1332: 		return false; // 失敗
1333: 
1334: 	IShellFolder *pshf;
1335: 	if ( NOERROR == SHGetDesktopFolder( &pshf ) )
1336: 	{
1337: 		WCHAR wcShortName[ MAX_PATH_BUF ];
1338: #pragma memo( "MultiByteToWideChar()" )
1339: 		MultiByteToWideChar( CP_ACP, 0, shortname, -1, wcShortName, min(MAX_PATH, bufsize) );
1340: 
1341: 		// pidl を取得
1342: 		ULONG chEaten;
1343: 		ITEMIDLIST *pidl;
1344: 		if ( NOERROR == pshf->ParseDisplayName( null, null, wcShortName, &chEaten, &pidl, null ) )
1345: 		{
1346: 			// パス名を pidl より取得
1347: 			if ( GetPathFromIDList( pidl, longname, bufsize ) )
1348: 			{
1349: 				ASSERT( IsPathExist( longname ) );
1350: 				ASSERT( strlen(longname) < bufsize );
1351: 
1352: 				pMalloc->Free( pidl );
1353: 				pshf->Release();
1354: 				pMalloc->Release();
1355: 				return true; // 成功
1356: 			}
1357: 			pMalloc->Free( pidl );
1358: 		}
1359: 		pshf->Release();
1360: 	}
1361: 	pMalloc->Release();
1362: 	
1363: 	// 失敗
1364: 	longname[0] = '\0';
1365: 	return false;
1366: }//GetLongFileName
1367: 
1368: //*********************************************************
1369: // GetModuleFile
1370: // 実行ファイルのフルパス名を取得する
1371: //   extension = ".ext", null
1372: //
1373: //   bufsize = numof(buf)
1374: //*********************************************************
1375: bool
1376: GetModuleFile
1377: 	(
1378: 		      char *buffer,
1379: 		      int   bufsize,
1380: 		const char *extension
1381: 	)
1382: {
1383: 	// パラメタの仮定
1384: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1385: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1386: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1387: 	ASSERT( !extension || IsValidLocalPathString( extension ) );
1388: 	ASSERT( !extension || ('.' == extension[ 0 ]) ); // [WARN]
1389: 	ASSERT( !extension || (buffer > strtail(extension)) || (extension > buffer + bufsize) );
1390: 
1391: 	// 実行ファイル名を取得
1392: 	HMODULE hModule = GetModuleHandle( null );
1393: 	if ( ! GetModuleFileName( hModule, buffer, bufsize ) )
1394: 	{
1395: 		ERROR_REPORT( "%s(%d) : %s \r\n", __FILE__, __LINE__,
1396: 			"GetModuleFileName() が失敗しました。" );
1397: 		return false;
1398: 	}
1399: 	ASSERT( IsPathFile( buffer ) );
1400: 
1401: 	// extension が指定されていれば拡張子を変更
1402: 	if ( extension )
1403: 	{
1404: 		VERIFY( *extension == *SwapFileExtension( buffer, bufsize, extension ) );
1405: 		ASSERT( IsValidLocalPathString( buffer ) );
1406: 	}
1407: 
1408: 	// 小文字化
1409: 	StrLower( buffer );
1410: 
1411: 	//
1412: 	ASSERT( IsValidLocalPathString( buffer ) );
1413: 	ASSERT( strlen( buffer ) < static_cast<size_t>( bufsize ) );
1414: 	return true;
1415: }//GetModuleFile
1416: 
1417: //*********************************************************
1418: // GetModuleFileLocation
1419: // 実行ファイルのあるフォルダ名をフルパス形式で取得する
1420: //   bufsize = numof(buf)
1421: //*********************************************************
1422: bool
1423: GetModuleFileLocation
1424: 	(
1425: 		char *buffer,
1426: 		int   bufsize
1427: 	)
1428: {
1429: 	// パラメタの仮定
1430: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1431: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1432: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1433: 
1434: 	// 実行ファイルのパス名を取得
1435: 	HMODULE hModule = GetModuleHandle( null );
1436: 	VERIFY( 0 < GetModuleFileName( hModule, buffer, bufsize ) );
1437: 	ASSERT( IsPathFile( buffer ) );
1438: 
1439: 	// フルパス名からをファイル名を切り落とす
1440: 	VERIFY( buffer < CutFileName( buffer ) );
1441: 	ASSERT( IsPathDirectory( buffer ) );
1442: 	ASSERT( strlen(buffer) < (size_t)bufsize );
1443: 
1444: 	return true;
1445: }//GetModuleFileLocation
1446: 
1447: //*********************************************************
1448: // GetModuleFileVersionInfo()
1449: //*********************************************************
1450: void *
1451: GetModuleFileVersionInfo
1452: 	(
1453: 		HINSTANCE   hInstance,
1454: 		DWORD     **dwTrans
1455: 	)
1456: {
1457: 	// パラメタの仮定
1458: //	ASSERT( IsValidInstanceHandle( hInstance ) );
1459: 	ASSERT( IsValidPtr( dwTrans, sizeof( *dwTrans ) ) );
1460: 
1461: 	// 実行ファイル名を取得
1462: 	char filename[ MAX_PATH_BUF ]; // 実行ファイル名
1463: 	if ( !GetModuleFileName( hInstance, filename, numof( filename ) ) )
1464: 	{
1465: 		return null;
1466: 	}
1467: 
1468: 	ASSERT( IsPathFile( filename ) );
1469: 	return GetVersionInfo( filename, dwTrans );
1470: }//GetModuleFileVersionInfo
1471: 
1472: //*********************************************************
1473: // GetQuickLaunchDirectory()
1474: //*********************************************************
1475: bool
1476: GetQuickLaunchDirectory
1477: 	(
1478: 		char   *buffer,
1479: 		size_t  bufsize
1480: 	)
1481: {
1482: 	// パラメタの仮定
1483: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1484: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1485: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1486: 
1487: 	//
1488: 	char base[ MAX_PATH_BUF ];
1489: 	if ( ! GetSpecialFolder( HWND_DESKTOP, CSIDL_APPDATA, base, numof(base) ) )
1490: 		return false;
1491: 	ASSERT( IsValidLocalPathString( base ) );
1492: 
1493: 	//
1494: 	MakeFullPath( buffer, bufsize, base, PATH_QUICKLAUNCH );
1495: 
1496: 	ASSERT( IsValidLocalPathString( buffer ) );
1497: 	return true;
1498: }//GetQuickLaunchDirectory
1499: 
1500: //*********************************************************
1501: // GetRegKeyData
1502: //*********************************************************
1503: bool
1504: GetRegKeyData
1505: 	(
1506: 		      HKEY   hKey,
1507: 		const char  *name,
1508: 		      void  *buffer,
1509: 		      DWORD  bufsize
1510: 	)
1511: {
1512: 	// パラメタの仮定
1513: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1514: 	ASSERT( 0 < bufsize );
1515: 	ASSERT( !name || IsValidRegistryValueName( name ) );
1516: 	ASSERT( IsValidPtr( buffer, bufsize ) );
1517: 	DESTROY_BUFFER( buffer, bufsize ); // [破壊]
1518: 
1519: 	return ERROR_SUCCESS == RegQueryValueEx
1520: 		(
1521: 			hKey,
1522: 			name,
1523: 			null, // reserved
1524: 			null, 
1525: 			(BYTE *)buffer,
1526: 			&bufsize 
1527: 		);
1528: }//GetRegKeyData
1529: 
1530: //*********************************************************
1531: // GetRegKeyDataSize
1532: //*********************************************************
1533: bool
1534: GetRegKeyDataSize
1535: 	(
1536: 		      HKEY   hKey,
1537: 		const char  *name,
1538: 		      DWORD *size
1539: 	)
1540: {
1541: 	// パラメタの仮定
1542: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1543: 	ASSERT( !name || IsValidRegistryValueName( name ) );
1544: 	ASSERT( IsValidPtr( size, sizeof( *size ) ) );
1545: 
1546: 	return ERROR_SUCCESS == RegQueryValueEx
1547: 		(
1548: 			hKey,
1549: 			name,
1550: 			null, // reserved
1551: 			null,
1552: 			null,
1553: 			size 
1554: 		);
1555: }//GetRegKeyDataSize
1556: 
1557: //*********************************************************
1558: // GetRegKeyDataType
1559: //*********************************************************
1560: bool
1561: GetRegKeyDataType
1562: 	(
1563: 		      HKEY   hKey,
1564: 		const char  *name,
1565: 		      DWORD *type
1566: 	)
1567: {
1568: 	// パラメタの仮定
1569: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1570: 	ASSERT( !name || IsValidRegistryValueName( name ) );
1571: 	ASSERT( IsValidPtr( type, sizeof( *type ) ) );
1572: 
1573: 	return ERROR_SUCCESS == RegQueryValueEx
1574: 		(
1575: 			hKey,
1576: 			name,
1577: 			null, // reserved
1578: 			type,
1579: 			null,
1580: 			null 
1581: 		);
1582: }//GetRegKeyDataType
1583: 
1584: //*********************************************************
1585: // GetRegKeyString
1586: //*********************************************************
1587: bool
1588: GetRegKeyString
1589: 	(
1590: 		      HKEY   hKey,
1591: 		const char  *name,
1592: 		      char  *buffer, 
1593: 		      DWORD  bufsize
1594: 	)
1595: {
1596: 	// パラメタの仮定
1597: 	ASSERT( IsValidRegKeyHandle( hKey ) );
1598: 	ASSERT( 0 < bufsize );
1599: 	ASSERT( !name || IsValidRegistryValueName( name ) );
1600: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1601: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1602: 
1603: 	return GetRegKeyData
1604: 		(
1605: 			hKey,
1606: 			name,
1607: 			buffer,
1608: 			bufsize
1609: 		);
1610: }//GetRegKeyString
1611: 
1612: //*********************************************************
1613: // GetSpecialFolder
1614: //   CSIDL_STARTUP, CSIDL_FAVORITES, etc... 
1615: //*********************************************************
1616: bool
1617: GetSpecialFolder
1618: 	(
1619: 		HWND  hWnd, 
1620: 		int   nFolder,
1621: 		char *buffer,
1622: 		int   bufsize
1623: 	)
1624: {
1625: 	// パラメタの仮定
1626: 	ASSERT( IsEnoughPathBufferSize( bufsize ) ); // [WARN]
1627: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1628: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1629: 
1630: 	IMalloc *pMalloc;
1631: 	if ( NOERROR != SHGetMalloc( &pMalloc ) )
1632: 		return false;
1633: 
1634: 	ITEMIDLIST *pidl;
1635: 	if ( NOERROR == SHGetSpecialFolderLocation( hWnd, nFolder, &pidl ) )
1636: 	{
1637: 		if ( GetPathFromIDList( pidl, buffer, bufsize ) )
1638: 		{
1639: 			pMalloc->Free( pidl );
1640: 			pMalloc->Release();
1641: 			return true;
1642: 		}
1643: 		pMalloc->Free( pidl );
1644: 	}
1645: 	pMalloc->Release();
1646: 	return false;
1647: }//GetSpecialFolder
1648: 
1649: //*********************************************************
1650: // GetVersionInfo
1651: //   char    *fullpath // バージョン情報を取得したいファイル
1652: //   DWORD **dwTrans   // 言語情報
1653: //*********************************************************
1654: void *
1655: GetVersionInfo
1656: 	(
1657: 		const char   *filepath,
1658: 		      DWORD **dwTrans
1659: 	)
1660: {
1661: 	// パラメタの仮定
1662: 	ASSERT( IsValidLocalPathString( filepath ) );
1663: 	ASSERT( IsValidPtr( dwTrans, sizeof( *dwTrans ) ) );
1664: 
1665: 	DWORD dwDumy;
1666: 	const DWORD dwSize = GetFileVersionInfoSize( const_cast<char *>( filepath ), &dwDumy );
1667: 	if ( dwSize <= 0 )
1668: 	{
1669: 		return null;
1670: 	}
1671: 
1672: 	void *pVersionInfo = (void *)malloc( dwSize );
1673: 	if ( !pVersionInfo )
1674: 	{
1675: 		return null;
1676: 	}
1677: 
1678: 	if ( GetFileVersionInfo( const_cast<char *>( filepath ), null, dwSize, pVersionInfo ) )
1679: 	{
1680: 		UINT uDumy;
1681: 		if ( VerQueryValue( pVersionInfo, "\\VarFileInfo\\Translation", (void **)dwTrans, &uDumy ) )
1682: 		{
1683: 			ASSERT( IsValidPtr( *dwTrans, sizeof( *dwTrans ) ) );
1684: 			return pVersionInfo;
1685: 		}
1686: 	}
1687: 	free( pVersionInfo );
1688: 
1689: 	return null;
1690: }//GetVersionInfo
1691: 
1692: //*********************************************************
1693: // GetVersionValue
1694: //   Buffer  …… ???
1695: //   Block   …… ???
1696: //   Trans   …… ???
1697: //   KeyWord …… 取得したいバージョン情報を指定します。
1698: //     ・"Comments"         // Comments(コメント)
1699: //     ・"CompanyName"      // CompanyName(会社名)
1700: //     ・"FileDescription"  // FileDescription(説明)
1701: //     ・"FileVersion"      // FileVersion(ファイルバージョン)
1702: //     ・"InternalName"     // InternalName(内部名)
1703: //     ・"LegalCopyright"   // LegalCopyright(著作権)
1704: //     ・"LegalTrademarks"  // LegalTrademarks(商標)
1705: //     ・"OriginalFilename" // OriginalFilename(正式ファイル名)
1706: //     ・"PrivateBuild"     // PrivateBuild(プライベート情報)
1707: //     ・"ProductName"      // ProductName(製品名)
1708: //     ・"ProductVersion"   // ProductVersion(製品バージョン)
1709: //     ・"SpecialBuild"     // SpecialBuild(スペシャルビルド情報)
1710: //*********************************************************
1711: bool
1712: GetVersionValue
1713: 	(
1714: 		      char  *buffer,
1715: 		      int    bufsize,
1716: 		      void  *block,
1717: 		      DWORD  dwTrans,
1718: 		const char  *keyword
1719: 	)
1720: {
1721: 	// パラメタの仮定
1722: 	ASSERT( 0 < bufsize );
1723: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1724: 	ASSERT( block );
1725: 	ASSERT( IsValidStringPtr( keyword ) );
1726: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1727: 
1728: 	// Make[Translation]String
1729: 	char path[ MAX_PATH_BUF ];
1730: 	VERIFY( 0 < snprintf( path, numof(path)-1, 
1731: 		"\\StringFileInfo\\%04x%04x\\%s", LOWORD(dwTrans), HIWORD(dwTrans), keyword ) );
1732: 	ASSERT( IsValidStringPtr( path ) );
1733: 
1734: 	UINT uDumy;
1735: 	char *pValue;
1736: 	if ( !VerQueryValue( block, path, (void **)&pValue, &uDumy ) )
1737: 	{
1738: 		buffer[ 0 ] = '\0';
1739: 		return false; // 失敗
1740: 	}
1741: 
1742: 	strcopy( buffer, bufsize, pValue );
1743: 	ASSERT( IsValidStringPtr( keyword ) );
1744: 	ASSERT( IsValidStringPtr( buffer ) );
1745: 	return true;
1746: }//GetVersionValue
1747: 
1748: //*********************************************************
1749: // GetVirtualKeyNameText()
1750: //   仮想キー vkey の名前を表す文字列を得る。
1751: //   取得したキー名の 文字列長 を返す。
1752: //   キー名を取得できなかった場合は 0 を返す。
1753: //
1754: // char *buffer
1755: //   キー名を格納するバッファへのポインタ
1756: //
1757: // int bufsize
1758: //   バッファのサイズをバイト数で指定する
1759: //
1760: // UINT vkey
1761: //   仮想キー・コード
1762: //   VK_LBUTTON, VK_OEM_CLEAR, ...
1763: //
1764: // bool extend
1765: //   拡張キーボードの拡張キーを区別する。
1766: //   ホットキーの HOTKEYF_EXT 修飾と同義?
1767: //   VK_NUMPAD0, VK_MULTIPLY, ...
1768: //
1769: //*********************************************************
1770: int // 文字列長
1771: GetVirtualKeyNameText
1772: 	(
1773: 		char  *buffer,  // バッファ
1774: 		int    bufsize, // バッファのサイズ
1775: 		UINT   vkey,    // 仮想キー
1776: 		bool   extend   // キー拡張
1777: 	)
1778: {
1779: 	CALLONCE_TESTPROC( test_vkeyname ); // [テスト]
1780: 
1781: 	// パラメタの仮定
1782: 	ASSERT( 0 < bufsize );
1783: //	ASSERT( MAX_VIRTUALKEYCODENAMELENGTH < bufsize );
1784: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1785: 	ASSERT( (VK_MIN <= vkey) && (vkey <= VK_MAX) ); // 根拠なし
1786: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1787: 
1788: 	// VK_ => scan code
1789: 	const UINT scan = MapVirtualKey( vkey, 0 );
1790: 	if ( 0 == scan )
1791: 		return 0; // 変換できず
1792: 
1793: 	// keyboard message の lParam へ
1794: 	//  16-23 scan code
1795: 	//  24    拡張キーボードの拡張キーを区別する
1796: 	//  25    左右の ctrl, shift を区別しない
1797: 	const LONG lParam = ((scan << 16) | ( extend ? BIT(24) : 0 ));
1798: 	if ( 0 == lParam )
1799: 		return 0; // 変換できず
1800: 
1801: 	// lParam に対応する文字列を得る
1802: 	const int length = GetKeyNameText( lParam, buffer, bufsize );
1803: 	ASSERT( (0 <= length) && (length < bufsize) );
1804: 	ASSERT( (0 == length) || IsValidStringPtr( buffer ) );
1805: 	ASSERT( (0 == length) || (length == (int)strlen( buffer )) );
1806: 	ASSERT( length < MAX_KEYNAMELENGTH );
1807: 
1808: 	return length;
1809: }//GetVirtualKeyNameText
1810: 
1811: //*********************************************************
1812: // GetVolumeName
1813: //*********************************************************
1814: bool
1815: GetVolumeName
1816: 	(
1817: 		const char  *root,
1818: 		      char  *buffer,
1819: 		      DWORD  bufsize
1820: 	)
1821: {
1822: 	// パラメタの仮定
1823: 	ASSERT( 0 < bufsize );
1824: //	ASSERT( IsPathDirectory( root ) ); // ドライブにディスクが挿入されているとは限らない
1825: 	ASSERT( IsValidStringBufferPtr( buffer, bufsize ) );
1826: 	DESTROY_TEXT_BUFFER( buffer, bufsize ); // [破壊]
1827: 
1828: 	DWORD dw1, dw2;
1829: 	return !! GetVolumeInformation( root, buffer, bufsize, null, &dw1, &dw2, null, null );
1830: }//GetVolumeName
1831: 
1832: 
1833: //------------------------------------------------------------------------------------------------------------------
1834: // h
1835: //------------------------------------------------------------------------------------------------------------------
1836: 
1837: //------------------------------------------------------------------------------------------------------------------
1838: // i
1839: //------------------------------------------------------------------------------------------------------------------
1840: //*********************************************************
1841: // IME_Enable
1842: //*********************************************************
1843: bool
1844: IME_Enable
1845: 	(
1846: 		HWND hWnd,
1847: 		bool bEnable
1848: 	)
1849: {
1850: 	// パラメタの仮定
1851: 	ASSERT( IsValidWindow( hWnd ) );
1852: 
1853: 	HIMC hIMC = ImmGetContext( hWnd );
1854: 	const bool bSucceed = !! ImmSetOpenStatus( hIMC, bEnable );
1855: 	VERIFY( ImmReleaseContext( hWnd, hIMC ) );
1856: 	return bSucceed;
1857: }//IME_Enable
1858: 
1859: //*********************************************************
1860: // IME_IsEnabled
1861: //*********************************************************
1862: bool
1863: IME_IsEnabled
1864: 	(
1865: 		HWND hWnd
1866: 	)
1867: {
1868: 	// パラメタの仮定
1869: 	ASSERT( IsValidWindow( hWnd ) );
1870: 
1871: 	HIMC hIMC = ImmGetContext( hWnd );
1872: 	const bool bEnabled = !! ImmGetOpenStatus( hIMC );
1873: 	VERIFY( ImmReleaseContext( hWnd, hIMC ) );
1874: 
1875: 	return bEnabled;
1876: }//IME_IsEnabled
1877: 
1878: //*********************************************************
1879: // IME_SetCompositionWindowPos
1880: //*********************************************************
1881: bool
1882: IME_SetCompositionWindowPos
1883: 	(
1884: 		HIMC   hIMC, 
1885: 		POINT *ptPos
1886: 	)
1887: {
1888: 	// パラメタの仮定
1889: 	ASSERT( IsValidReadPtr( ptPos, sizeof( *ptPos ) ) );
1890: 
1891: 	COMPOSITIONFORM cf;
1892: 	memzero( &cf, sizeof( cf ) );
1893: 	cf.dwStyle       = CFS_POINT;
1894: 	cf.ptCurrentPos  = *ptPos;
1895: 	return boolean_cast( ImmSetCompositionWindow( hIMC, &cf ) );
1896: }//IME_SetCompositionPos
1897: 
1898: //*********************************************************
1899: // IsPathDirectory
1900: // パスがディレクトリを指していれば真を返す
1901: //*********************************************************
1902: bool
1903: IsPathDirectory
1904: 	(
1905: 		const char *path
1906: 	)
1907: {
1908: 	// パラメタの仮定
1909: 	ASSERT( IsValidLocalPathString( path ) );
1910: 
1911: 	if ( !IsPathExist( path ) )
1912: 		return false; // パスが存在しない
1913: 
1914: 	const DWORD dwFileAttributes = GetFileAttributes( path );
1915: 	return FILE_ATTRIBUTE_DIRECTORY == (FILE_ATTRIBUTE_DIRECTORY & dwFileAttributes);
1916: }//IsPathDirectory
1917: 
1918: //*********************************************************
1919: // IsPathExist
1920: // パスが存在すれば真を返す
1921: //*********************************************************
1922: bool
1923: IsPathExist
1924: 	(
1925: 		const char *path
1926: 	)
1927: {
1928: 	// パラメタの仮定
1929: 	ASSERT( IsValidLocalPathString( path ) );
1930: 
1931: 	const DWORD dwFileAttributes = GetFileAttributes( path );
1932: 	return INVALID_FILE_ATTRIBUTES != dwFileAttributes;
1933: }//IsPathExist
1934: 
1935: //*********************************************************
1936: // IsPathFile
1937: // パスがファイルを指していれば真を返す
1938: //*********************************************************
1939: bool
1940: IsPathFile
1941: 	(
1942: 		const char *path
1943: 	)
1944: {
1945: 	// パラメタの仮定
1946: 	ASSERT( IsValidLocalPathString( path ) );
1947: 
1948: 	if ( !IsPathExist( path ) )
1949: 		return false; // パスが存在しない
1950: 
1951: 	const DWORD dwFileAttributes = GetFileAttributes( path );
1952: 	return 0 == (FILE_ATTRIBUTE_DIRECTORY & dwFileAttributes);
1953: }//IsPathFile
1954: 
1955: //*********************************************************
1956: // IsPathMyself
1957: // パスがファイルを指していれば真を返す
1958: //*********************************************************
1959: bool
1960: IsPathMyself
1961: 	(
1962: 		const char *path
1963: 	)
1964: {
1965: 	// パラメタの仮定
1966: 	ASSERT( IsValidLocalPathString( path ) );
1967: 	ASSERT( IsPathFile( path ) );
1968: 
1969: 	char myself[ MAX_PATH_BUF ];
1970: 	VERIFY( GetModuleFile( myself, numof(myself), null ) );
1971: 	ASSERT( IsPathFile( myself ) );
1972: 
1973: 	return streqli( path, myself );
1974: }//IsPathMyself
1975: 
1976: //*********************************************************
1977: // IsRegKeyExist
1978: //*********************************************************
1979: bool
1980: IsRegKeyExist
1981: 	(
1982: 		      HKEY   hkeyRoot,
1983: 		const char *name
1984: 	)
1985: {
1986: 	// パラメタの仮定
1987: 	ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
1988: 	ASSERT( IsValidStringPtr( name ) );
1989: 
1990: 	// open できなければキーが無いことにする。
1991: 	HKEY hKey;
1992: 	if ( !OpenRegKey( hkeyRoot, name, KEY_ALL_ACCESS, &hKey ) )
1993: 	{
1994: 		return false;
1995: 	}
1996: 
1997: 	VERIFY( CloseRegKey( hKey ) );
1998: 	return true;
1999: }//IsRegKeyExist
2000: 
2001: //*********************************************************
2002: // IsSignalObject()
2003: //*********************************************************
2004: bool
2005: IsSignalObject
2006: 	(
2007: 		HANDLE handle
2008: 	)
2009: {
2010: 	// パラメタの仮定
2011: 	ASSERT( handle );
2012: 
2013: 	return WAIT_OBJECT_0 == WaitForSingleObject( handle, 0 );
2014: }//IsSignalObject
2015: 
2016: //*********************************************************
2017: // IsValidBitmapHandle
2018: // ハンドル hBitmap が HBITMAP として有効であれば 真 を返す
2019: //*********************************************************
2020: bool
2021: IsValidBitmapHandle
2022: 	(
2023: 		HBITMAP hBitmap
2024: 	)
2025: {
2026: 	VALID_TEST( hBitmap );
2027: 	VALID_TEST( OBJ_BITMAP == GetObjectType( hBitmap ) );
2028: 	VALID_TEST( sizeof( BITMAP ) == GetObject( hBitmap, sizeof( BITMAP ), null ) );
2029: 
2030: 	return true;
2031: }//IsValidBitmapHandle
2032: 
2033: //*********************************************************
2034: // IsValidBrushHandle
2035: // ハンドル hBrush が HBRUSH として有効であれば 真 を返す
2036: //*********************************************************
2037: bool
2038: IsValidBrushHandle
2039: 	(
2040: 		HBRUSH hBrush
2041: 	)
2042: {
2043: 	VALID_TEST( hBrush );
2044: 	VALID_TEST( OBJ_BRUSH == GetObjectType( hBrush ) );
2045: 	VALID_TEST( sizeof( LOGBRUSH ) == GetObject( hBrush, sizeof( LOGBRUSH ), null ) );
2046: 
2047: 	return true;
2048: }//IsValidBrushHandle
2049: 
2050: //*********************************************************
2051: // IsValidCursorHandle
2052: // ハンドル hCursor が HCURSOR として有効であれば 真 を返す
2053: //*********************************************************
2054: bool
2055: IsValidCursorHandle
2056: 	(
2057: 		HCURSOR hCursor
2058: 	)
2059: {
2060: 	VALID_TEST( hCursor );
2061: 
2062: 	return true;
2063: }//IsValidCursorHandle
2064: 
2065: //*********************************************************
2066: // IsValidDeviceContextHandle
2067: // ハンドル hDC が HDC として有効であれば 真 を返す
2068: //*********************************************************
2069: bool
2070: IsValidDeviceContextHandle
2071: 	(
2072: 		HDC hDC
2073: 	)
2074: {
2075: 	VALID_TEST( hDC );
2076: 
2077: 	const DWORD dwType = GetObjectType( hDC );
2078: 	VALID_TEST( ( OBJ_DC        == dwType )
2079: 	         || ( OBJ_METADC    == dwType )
2080: 	         || ( OBJ_MEMDC     == dwType )
2081: 	         || ( OBJ_ENHMETADC == dwType ) );
2082: 
2083: 	return true;
2084: }//IsValidDeviceContextHandle
2085: 
2086: //*********************************************************
2087: // IsValidDialogTemplate
2088: //*********************************************************
2089: bool
2090: IsValidDialogTemplate
2091: 	(
2092: 		const DLGTEMPLATE *dlg
2093: 	)
2094: {
2095: 	VALID_TEST( IsValidReadPtr( dlg, sizeof( *dlg ) ) );
2096: 	VALID_TEST( 0 <= dlg->cdit );
2097: 	VALID_TEST( 0 <= dlg->cx );
2098: 	VALID_TEST( 0 <= dlg->cy );
2099: 
2100: 	return true;
2101: }//IsValidDialogTemplate
2102: 
2103: //*********************************************************
2104: // IsValidDialogItemTemplate
2105: //*********************************************************
2106: bool
2107: IsValidDialogItemTemplate
2108: 	(
2109: 		const DLGITEMTEMPLATE *item
2110: 	)
2111: {
2112: 	VALID_TEST( IsValidReadPtr( item, sizeof( *item ) ) );
2113: 	ASSERT( WS_CHILD == (WS_CHILD & item->style) );
2114: 	VALID_TEST( 0 <= item->cx );
2115: 	VALID_TEST( 0 <= item->cy );
2116: 
2117: 	return true;
2118: }//IsValidDialogItemTemplate
2119: 
2120: //*********************************************************
2121: // IsValidFontHandle
2122: // ハンドル hFont が HFONT として有効であれば 真 を返す
2123: //*********************************************************
2124: bool
2125: IsValidFontHandle
2126: 	(
2127: 		HFONT hFont
2128: 	)
2129: {
2130: 	VALID_TEST( hFont );
2131: 	VALID_TEST( OBJ_FONT == GetObjectType( hFont ) );
2132: 	VALID_TEST( sizeof( LOGFONT ) == GetObject( hFont, sizeof( LOGFONT ), null ) );
2133: 
2134: 	return true;
2135: }//IsValidFontHandle
2136: 
2137: //*********************************************************
2138: // IsValidGlobalMemoryHandle
2139: //*********************************************************
2140: bool
2141: IsValidGlobalMemoryHandle
2142: 	(
2143: 		HGLOBAL hGlobal,
2144: 		DWORD   size
2145: 	)
2146: {
2147: 	// パラメタの仮定
2148: 	ASSERT( 0 < size );
2149: 
2150: 	VALID_TEST( hGlobal );
2151: 
2152: 	const UINT flags = GlobalFlags( hGlobal );
2153: 	VALID_TEST( GMEM_INVALID_HANDLE != flags );
2154: 	VALID_TEST( 0 == (GMEM_DISCARDED & flags ) );
2155: 
2156: 	// 仮定されるサイズを保持しているか
2157: 	VALID_TEST( size <= GlobalSize( hGlobal ) );
2158: 
2159: 	return true;
2160: }//IsValidGlobalMemoryHandle
2161: 
2162: //*********************************************************
2163: // IsValidIconHandle
2164: // ハンドル hIcon が HICON として有効であれば 真 を返す
2165: //*********************************************************
2166: bool
2167: IsValidIconHandle
2168: 	(
2169: 		HICON hIcon
2170: 	)
2171: {
2172: 	VALID_TEST( hIcon );
2173: 
2174: 	return true;
2175: }//IsValidIconHandle
2176: 
2177: //*********************************************************
2178: // IsValidInstanceHandle
2179: //*********************************************************
2180: bool
2181: IsValidInstanceHandle
2182: 	(
2183: 		HINSTANCE hInstance
2184: 	)
2185: {
2186: 	VALID_TEST( hInstance );
2187: 
2188: 	return true;
2189: }//IsValidInstanceHandle
2190: 
2191: //*********************************************************
2192: // IsValidLocalMemory
2193: //*********************************************************
2194: bool 
2195: IsValidLocalMemory
2196: 	(
2197: 		HLOCAL hLocal
2198: 	)
2199: {
2200: 	VALID_TEST( hLocal );
2201: 	VALID_TEST( LMEM_INVALID_HANDLE != LocalFlags( hLocal ) );
2202: 
2203: 	return true;
2204: }//IsValidLocalMemory
2205: 
2206: //*********************************************************
2207: // IsValidLocalMemoryEx
2208: //*********************************************************
2209: bool
2210: IsValidLocalMemoryEx
2211: 	(
2212: 		HLOCAL hLocal,
2213: 		int    nMinSize,
2214: 		int    nMaxSize
2215: 	)
2216: {
2217: 	// パラメタの仮定
2218: 	ASSERT( 0 < nMinSize );
2219: 	ASSERT( nMinSize <= nMaxSize );
2220: 
2221: 	VALID_TEST( hLocal );
2222: 	VALID_TEST( IsValidLocalMemory( hLocal ) );
2223: 
2224: 	const int size = (int)LocalSize( hLocal );
2225: 	VALID_TEST( (nMinSize <= size) && (size <= nMaxSize) );
2226: 
2227: 	return true;
2228: }//IsValidLocalMemoryEx
2229: 
2230: //*********************************************************
2231: // IsValidMemoryDeviceContextHandle
2232: // ハンドル hMemDC が HMEMDC として有効であれば 真 を返す
2233: //*********************************************************
2234: bool
2235: IsValidMemoryDeviceContextHandle
2236: 	(
2237: 		HDC hMemDC
2238: 	)
2239: {
2240: 	VALID_TEST( hMemDC );
2241: 	VALID_TEST( OBJ_MEMDC == GetObjectType( hMemDC ) );
2242: 
2243: 	return true;
2244: }//IsValidMemoryDeviceContextHandle
2245: 
2246: //*********************************************************
2247: // IsValidMutexName
2248: //*********************************************************
2249: bool // 
2250: IsValidMutexName
2251: 	(
2252: 		const char *name // ミューテックス名
2253: 	)
2254: {
2255: 	VALID_TEST( IsValidStringPtr( name ) );
2256: 	VALID_TEST( strlen( name ) < MAX_PATH );
2257: 	VALID_TEST( null == jmschr( name, '\\' ) );
2258: 
2259: 	return true;
2260: }//IsValidMutexName
2261: 
2262: //*********************************************************
2263: // IsValidNotifyIconData
2264: //*********************************************************
2265: bool
2266: IsValidNotifyIconData
2267: 	(
2268: 		const NOTIFYICONDATA *nid
2269: 	)
2270: {
2271: 	VALID_TEST( IsValidReadPtr( nid, sizeof( *nid ) ) );
2272: 	VALID_TEST( sizeof( *nid ) == nid->cbSize );
2273: 	VALID_TEST( IsValidWindow( nid->hWnd ) );
2274: 	VALID_TEST( IsValidIconHandle( nid->hIcon ) );
2275: 	VALID_TEST( IsValidStringPtr( nid->szTip ) );
2276: 	VALID_TEST( strlen( nid->szTip ) < numof( nid->szTip ) );
2277: 
2278: 	return true;
2279: }//IsValidNotifyIconData
2280: 
2281: //*********************************************************
2282: // IsValidRegistryKeyName
2283: //*********************************************************
2284: bool
2285: IsValidRegistryKeyName
2286: 	(
2287: 		const char *name 
2288: 	)
2289: {
2290: 	VALID_TEST( name );
2291: 	VALID_TEST( IsValidStringPtr( name ) );
2292: 
2293: 	return true;
2294: }//IsValidRegistryKeyName
2295: 
2296: //*********************************************************
2297: // IsValidRegistryValueName
2298: //*********************************************************
2299: bool
2300: IsValidRegistryValueName
2301: 	(
2302: 		const char *name 
2303: 	)
2304: {
2305: 	VALID_TEST( name );
2306: 	VALID_TEST( IsValidStringPtr( name ) );
2307: 
2308: 	return true;
2309: }//IsValidRegistryValueName
2310: 
2311: //*********************************************************
2312: // IsValidRegKeyHandle
2313: //*********************************************************
2314: bool
2315: IsValidRegKeyHandle
2316: 	(
2317: 		HKEY hKey 
2318: 	)
2319: {
2320: 	VALID_TEST( hKey );
2321: 
2322: 	return true;
2323: }//IsValidRegKeyHandle
2324: 
2325: //*********************************************************
2326: // IsValidResourceName
2327: //*********************************************************
2328: bool
2329: IsValidResourceName
2330: 	(
2331: 		const char *name
2332: 	)
2333: {
2334: 	VALID_TEST( name );
2335: 	VALID_TEST( IS_INTRESOURCE( name )
2336: 	         || IsValidStringPtr( name ) );
2337: 
2338: 	return true;
2339: }//IsValidResourceName
2340: 
2341: 
2342: //------------------------------------------------------------------------------------------------------------------
2343: // j
2344: //------------------------------------------------------------------------------------------------------------------
2345: 
2346: //------------------------------------------------------------------------------------------------------------------
2347: // k
2348: //------------------------------------------------------------------------------------------------------------------
2349: 
2350: //------------------------------------------------------------------------------------------------------------------
2351: // l
2352: //------------------------------------------------------------------------------------------------------------------
2353: //*********************************************************
2354: // LoadIconImage()
2355: //   アイコンをロードする。
2356: //   ロードしたアイコンのハンドルを返す。
2357: //   ロードに失敗すると null を返す。
2358: //   ロードしたアイコンは DestroyIcon() で破棄せよ。
2359: //
2360: // HINSTANCE hInstance
2361: //   ロードするアイコンを含むモジュールのハンドル
2362: //
2363: // const char *name
2364: //   ロードするアイコンリソースの名前
2365: //   または OEM アイコンの識別値
2366: //
2367: // int width
2368: //   アイコンのピクセル幅
2369: //
2370: // int height
2371: //   アイコンのピクセル高
2372: //
2373: // UINT flags
2374: //   LR_DEFAULTSIZE, LR_LOADMAP3DCOLORS, LR_LOADTRANSPARENT, LR_MONOCHROME, ...
2375: //
2376: //*********************************************************
2377: HICON // アイコンのハンドル
2378: LoadIconImage
2379: 	(
2380: 		      HINSTANCE  hInstance, // アイコンを含むモジュール
2381: 		const char      *name,      // アイコンリソースの名前
2382: 		      int        width,     // ピクセル幅
2383: 		      int        height,    // ピクセル高
2384: 		      UINT       flags      // 
2385: 	)
2386: {
2387: 	// パラメタの仮定
2388: 	ASSERT( IsValidResourceName( name ) );
2389: 	ASSERT( LR_LOADFROMFILE != (LR_LOADFROMFILE & flags) ); // NT が非対応
2390: 	
2391: 	return (HICON)LoadImage( hInstance, name, IMAGE_ICON, width, height, flags );
2392: }//LoadIconImage
2393: 
2394: //*********************************************************
2395: // LoadShellLink
2396: //   dwMode = STGM_READ, ... 
2397: //*********************************************************
2398: bool
2399: LoadShellLink
2400: 	(
2401: 		      IShellLink *psl,
2402: 		const WCHAR      *wcLinkName,
2403: 		      DWORD       dwMode
2404: 	)
2405: {
2406: 	// パラメタの仮定
2407: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
2408: 	ASSERT( IsValidStringPtr( (char *)wcLinkName ) );
2409: 
2410: 	IPersistFile *ppf = ShellLink_QueryPersistFileInterface( psl );
2411: 	if ( !ppf )
2412: 		return false;
2413: 
2414: 	const HRESULT hResult = ppf->Load( wcLinkName, dwMode );
2415: 	ppf->Release();
2416: 
2417: 	return S_OK == hResult;
2418: }//LoadShellLink
2419: 
2420: //*********************************************************
2421: // LoadShellLinkInstance()
2422: // ショートカット path へのインタフェイスを取得する
2423: //*********************************************************
2424: IShellLink *
2425: LoadShellLinkInstance
2426: 	(
2427: 		      DWORD  dwClsContext, //
2428: 		const char  *path,         // インタフェイス を取得する ファイル への パス
2429: 		      DWORD  dwMode        // 読込モード
2430: 	)
2431: {
2432: 	// パラメタの仮定
2433: 	ASSERT( IsPathFile( path ) );
2434: 	ASSERT( CLSCTX_INPROC_SERVER == dwClsContext );
2435: 	ASSERT( STGM_READ == dwMode );
2436: 
2437: 	// IShellLink の初期化
2438: 	IShellLink *psl = CreateShellLinkInstance( dwClsContext );
2439: 	if ( !psl )
2440: 	{
2441: 		return false; // [失敗]
2442: 	}
2443: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
2444: 
2445: 	// ショートカットのロード
2446: 	const int count = MultiByteToWideChar( CP_ACP, 0, path, -1, null, 0 );
2447: 	if ( 0 < count )
2448: 	{
2449: 		WCHAR *wcPath = (WCHAR *)malloc( (1 + count) * sizeof( *wcPath ) );
2450: 		if ( wcPath )
2451: 		{
2452: 			VERIFY( count == MultiByteToWideChar( CP_ACP, 0, path, -1, wcPath, count ) );
2453: 			if ( LoadShellLink( psl, wcPath, dwMode ) )
2454: 			{
2455: 				free( wcPath );
2456: 				return psl; // [成功]
2457: 			}
2458: 			free( wcPath );
2459: 		}
2460: 	}
2461: 
2462: 	psl->Release();
2463: 	return null; // [失敗]
2464: }//LoadShellLinkInstance
2465: 
2466: 
2467: //------------------------------------------------------------------------------------------------------------------
2468: // m
2469: //------------------------------------------------------------------------------------------------------------------
2470: //*********************************************************
2471: // MakeDialogTemplate
2472: //*********************************************************
2473: bool
2474: MakeDialogTemplate
2475: 	 (
2476: 		DLGTEMPLATE *dlg,
2477: 		WORD         count,
2478: 		DWORD        dwStyleEx,
2479: 		DWORD        dwStyle,
2480: 		short        x,
2481: 		short        y,
2482: 		short        cx,
2483: 		short        cy
2484: 	)
2485: {
2486: 	// パラメタの仮定
2487: 	ASSERT( IsValidPtr( dlg, sizeof( *dlg ) ) );
2488: 	ASSERT( 0 <= count );
2489: 	ASSERT( 0 <= cx );
2490: 	ASSERT( 0 <= cy );
2491: 
2492: 	dlg->style           = dwStyle;
2493: 	dlg->dwExtendedStyle = dwStyleEx;
2494: 	dlg->cdit            = count;
2495: 	dlg->x               = x;
2496: 	dlg->y               = y;
2497: 	dlg->cx              = cx;
2498: 	dlg->cy              = cy;
2499: 	
2500: 	ASSERT( IsValidDialogTemplate( dlg ) );
2501: 	return true;
2502: }//MakeDialogTemplate
2503: 
2504: //*********************************************************
2505: // MakeDialogItemTemplate
2506: //*********************************************************
2507: bool
2508: MakeDialogItemTemplate
2509: 	(
2510: 		DLGITEMTEMPLATE *item,
2511: 		WORD             wID,
2512: 		DWORD            dwStyleEx,
2513: 		DWORD            dwStyle,
2514: 		short            x,
2515: 		short            y,
2516: 		short            cx,
2517: 		short            cy
2518: 	)
2519: {
2520: 	// パラメタの仮定
2521: 	ASSERT( IsValidPtr( item, sizeof( *item ) ) );
2522: 	ASSERT( WS_CHILD == (WS_CHILD & dwStyle) );
2523: 	ASSERT( 0 <= cx );
2524: 	ASSERT( 0 <= cy );
2525: 	
2526: 	item->style           = dwStyle;
2527: 	item->dwExtendedStyle = dwStyleEx;
2528: 	item->x               = x;
2529: 	item->y               = y;
2530: 	item->cx              = cx;
2531: 	item->cy              = cy;
2532: 	item->id              = wID;
2533: 
2534: 	ASSERT( IsValidDialogItemTemplate( item ) );
2535: 	return true;
2536: }//MakeDialogItemTemplate
2537: 
2538: //*********************************************************
2539: // MakeNotifyIconData
2540: // 構造体 NOTIFYICONDATA を初期化する
2541: //*********************************************************
2542: bool
2543: MakeNotifyIconData
2544: 	(
2545: 		      NOTIFYICONDATA *nid,
2546: 		      HWND            hWnd,
2547: 		      UINT            uID,
2548: 		      UINT            uMessage,
2549: 		      HICON           hIcon,
2550: 		const char           *szTip
2551: 	)
2552: {
2553: 	// パラメタの仮定
2554: 	ASSERT( IsValidPtr( nid, sizeof( *nid ) ) );
2555: 	ASSERT( IsValidWindow( hWnd ) );
2556: 	ASSERT( IsValidIconHandle( hIcon ) );
2557: 	ASSERT( IsValidStringPtr( szTip ) );
2558: 
2559: 	memzero( nid, sizeof( *nid ) );
2560: 	nid->cbSize           = sizeof( *nid );
2561: 	nid->hWnd             = hWnd;
2562: 	nid->uID              = uID;
2563: 	nid->uFlags           = NIF_ICON | NIF_MESSAGE | NIF_TIP;
2564: 	nid->uCallbackMessage = uMessage;
2565: 	nid->hIcon            = hIcon;
2566: 	strcopy( nid->szTip, numof( nid->szTip ), szTip );
2567: 
2568: 	ASSERT( IsValidNotifyIconData( nid ) );
2569: 	return true;
2570: }//MakeNotifyIconData
2571: 
2572: //*********************************************************
2573: // ModifyNotifyIcon
2574: //*********************************************************
2575: bool
2576: ModifyNotifyIcon
2577: 	(
2578: 		NOTIFYICONDATA *nid
2579: 	)
2580: {
2581: 	// パラメタの仮定
2582: 	ASSERT( IsValidNotifyIconData( nid ) );
2583: 
2584: 	return !! Shell_NotifyIcon( NIM_MODIFY, nid );
2585: }//ModifyNotifyIcon
2586: 
2587: //*********************************************************
2588: // MoveFileToRecycleBin
2589: // pFrom は "\0\0" で終了する '\0' で区切られた文字列
2590: //*********************************************************
2591: bool
2592: MoveFileToRecycleBin
2593: 	(
2594: 		      HWND  hWnd,
2595: 		const char *pFrom,
2596: 		      WORD  wFlags
2597: 	)
2598: {
2599: 	// パラメタの仮定
2600: 	ASSERT( !hWnd || IsValidWindow( hWnd ) );
2601: 	ASSERT( IsValidLocalPathString( pFrom ) );
2602: 
2603: #ifdef _DEBUG // デバッグ時のみ
2604: 	{for( const char *p = pFrom; '\0' != *p; p = 1 + strtail( p ) )
2605: 	{
2606: 		ASSERT( IsValidLocalPathString( p ) );
2607: 	}}
2608: #endif // #ifdef _DEBUG
2609: 
2610: 	SHFILEOPSTRUCT shfos;
2611: 	memzero( &shfos, sizeof( shfos ) );
2612: 	shfos.hwnd   = hWnd;
2613: 	shfos.wFunc  = FO_DELETE;
2614: 	shfos.pFrom  = pFrom;
2615: 	shfos.pTo    = null;
2616: 	shfos.fFlags = static_cast<WORD>( wFlags | FOF_ALLOWUNDO );
2617: 	VERIFY( 0 == SHFileOperation( &shfos ) );
2618: 	VERIFY( 0 == shfos.fAnyOperationsAborted );
2619: 	return true;
2620: }//MoveFileToRecycleBin
2621: 
2622: 
2623: //------------------------------------------------------------------------------------------------------------------
2624: // n
2625: //------------------------------------------------------------------------------------------------------------------
2626: 
2627: //------------------------------------------------------------------------------------------------------------------
2628: // o
2629: //------------------------------------------------------------------------------------------------------------------
2630: //*********************************************************
2631: // OpenFileLocation
2632: // ファイルのあるフォルダを開きます
2633: //*********************************************************
2634: bool
2635: OpenFileLocation
2636: 	(
2637: 		      HWND  hWnd,
2638: 		const char *filepath,
2639: 		      int   nShow
2640: 	)
2641: {
2642: 	// パラメタの仮定
2643: 	ASSERT( !hWnd || IsValidWindow( hWnd ) );
2644: 	ASSERT( IsPathExist( filepath ) );
2645: 
2646: 	char path[ MAX_PATH_BUF ];
2647: 	strcopy( path, numof( path ), filepath );
2648: 	CutFileName( path );
2649: 	ASSERT( IsPathDirectory( path ) );
2650: 
2651: 	return SHELLEXECUTE_SUCCEEDED( MyShellExecute( hWnd, "open", path, null, null, nShow ) );
2652: }//OpenFileLocation
2653: 
2654: //*********************************************************
2655: // OpenRegKey
2656: // samDesired, KEY_ALL_ACCESS
2657: //   HKEY_CLASSES_ROOT, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_USERS ……
2658: //*********************************************************
2659: bool
2660: OpenRegKey
2661: 	(
2662: 		      HKEY    hkeyRoot,
2663: 		const char   *name,
2664: 		      REGSAM  samDesired,
2665: 		      HKEY   *phKey
2666: 	)
2667: {
2668: 	// パラメタの仮定
2669: 	ASSERT( IsValidRegKeyHandle( hkeyRoot ) );
2670: 	ASSERT( IsValidRegistryKeyName( name ) );
2671: 	ASSERT( IsValidPtr( phKey, sizeof( *phKey ) ) );
2672: 
2673: 	return ERROR_SUCCESS == RegOpenKeyEx
2674: 		(
2675: 			hkeyRoot,
2676: 			name, 
2677: 			0, // reserved
2678: 			samDesired,
2679: 			phKey
2680: 		);
2681: }//OpenRegKey
2682: 
2683: //*********************************************************
2684: // OpenSpecialFolder
2685: //   nID = CSIDL_SENDTO, CSIDL_FAVORITES, ...
2686: //*********************************************************
2687: bool
2688: OpenSpecialFolder
2689: 	(
2690: 		HWND hWnd, 
2691: 		int  nID,
2692: 		int  nShow
2693: 	)
2694: {
2695: 	bool bSuccess;
2696: 
2697: 	char path[ MAX_PATH_BUF ];
2698: 	VERIFY( bSuccess = GetSpecialFolder( hWnd, nID, path, numof(path) ) );
2699: 	return bSuccess && SHELLEXECUTE_SUCCEEDED( MyShellExecute( hWnd, "open", path, null, null, nShow) );
2700: }//OpenSpecialFolder
2701: 
2702: //*********************************************************
2703: // OpenWindowProcess
2704: //*********************************************************
2705: HANDLE
2706: OpenWindowProcess
2707: 	(
2708: 		HWND  hWnd,
2709: 		DWORD dwFlag,
2710: 		bool  bInherit
2711: 	)
2712: {
2713: 	// パラメタの仮定
2714: 	ASSERT( IsValidWindow( hWnd ) );
2715: 
2716: 	DWORD dwProcessId;
2717: 	if ( GetWindowThreadProcessId( hWnd, &dwProcessId ) )
2718: 	{
2719: 		return OpenProcess( dwFlag, bInherit, dwProcessId );
2720: 	}
2721: 	return null;
2722: }//OpenWindowProcess
2723: 
2724: 
2725: //------------------------------------------------------------------------------------------------------------------
2726: // p
2727: //------------------------------------------------------------------------------------------------------------------
2728: //*********************************************************
2729: // PrivateProfile_DeleteKey()
2730: //   ini ファイルから キー を削除する。
2731: //   成功すると 真 を返す。
2732: //*********************************************************
2733: bool // 成功すれば 真
2734: PrivateProfile_DeleteKey
2735: 	(
2736: 		const char *filename,
2737: 		const char *section,
2738: 		const char *key
2739: 	)
2740: {
2741: 	// パラメタの仮定
2742: 	ASSERT( IsValidLocalPathString( filename ) );
2743: 	ASSERT( IsValidStringPtr( section ) );
2744: 	ASSERT( '\0' != section[ 0 ] );
2745: 	ASSERT( IsValidStringPtr( key ) );
2746: 	ASSERT( '\0' != key[ 0 ] );
2747: 
2748: 	const bool bSuccess = !! WritePrivateProfileString( section, key, null, filename );
2749: 	ASSERT( !bSuccess || !PrivateProfile_IsExistKey( filename, section, key ) );
2750: 
2751: 	return bSuccess;
2752: }//PrivateProfile_DeleteKey
2753: 
2754: //*********************************************************
2755: // PrivateProfile_DeleteSection()
2756: //   ini ファイルから セクション全体 を削除する。
2757: //   成功すると 真 を返す。
2758: //*********************************************************
2759: bool // 成功すれば 真
2760: PrivateProfile_DeleteSection
2761: 	(
2762: 		const char *filename,
2763: 		const char *section
2764: 	)
2765: {
2766: 	// パラメタの仮定
2767: 	ASSERT( IsValidLocalPathString( filename ) );
2768: 	ASSERT( IsValidStringPtr( section ) );
2769: 	ASSERT( '\0' != section[ 0 ] );
2770: 
2771: 	return !! WritePrivateProfileString( section, null, null, filename );
2772: }//PrivateProfile_DeleteSection
2773: 
2774: //*********************************************************
2775: // PrivateProfile_IsExistKey()
2776: //   キーが存在すれば 真 を返す。
2777: //
2778: //*********************************************************
2779: bool // キーが存在すれば 真
2780: PrivateProfile_IsExistKey
2781: 	(
2782: 		const char *filename,
2783: 		const char *section,
2784: 		const char *key
2785: 	)
2786: {
2787: 	// パラメタの仮定
2788: 	ASSERT( IsValidLocalPathString( filename ) );
2789: 	ASSERT( IsValidStringPtr( section ) );
2790: 	ASSERT( '\0' != section[ 0 ] );
2791: 	ASSERT( IsValidStringPtr( key ) );
2792: 	ASSERT( '\0' != key[ 0 ] );
2793: 
2794: 	// キーが存在すれば常に一定の値が返る
2795: 	// キーが存在しなければデフォルト値が返る
2796: 	const int case_0 = GetPrivateProfileInt( section, key, 0, filename );
2797: 	const int case_1 = GetPrivateProfileInt( section, key, 1, filename );
2798: 
2799: 	return case_0 == case_1;
2800: }//PrivateProfile_IsExistKey
2801: 
2802: //*********************************************************
2803: // PrivateProfile_ReadBoolean
2804: //*********************************************************
2805: bool
2806: PrivateProfile_ReadBoolean
2807: 	(
2808: 		const char *filename,
2809: 		const char *section,
2810: 		const char *key,
2811: 		      bool  defval
2812: 	)
2813: {
2814: 	// パラメタの仮定
2815: 	ASSERT( IsValidLocalPathString( filename ) );
2816: 	ASSERT( IsValidStringPtr( section ) );
2817: 	ASSERT( '\0' != section[ 0 ] );
2818: 	ASSERT( IsValidStringPtr( key ) );
2819: 	ASSERT( '\0' != key[ 0 ] );
2820: 
2821: 	char buffer[ 1024 ];
2822: #pragma memo( "toolini.cpp - GetPrivateProfileSection() の方が安全?" )
2823: 	const int count = GetPrivateProfileString( section, key, "", buffer, numof(buffer)-1, filename );
2824: 	ASSERT( '\0' == buffer[ count ] );
2825: 
2826: 	int result;
2827: 	if ( 1 != sscanf( buffer, "%d", &result ) )
2828: 		return defval; // 読み込みに失敗した
2829: 
2830: 	ASSERT( PrivateProfile_IsExistKey( filename, section, key ) );
2831: 	return boolean_cast( result );
2832: }//PrivateProfile_ReadBoolean
2833: 
2834: //*********************************************************
2835: // PrivateProfile_ReadInteger
2836: //*********************************************************
2837: int
2838: PrivateProfile_ReadInteger
2839: 	(
2840: 		const char *filename,
2841: 		const char *section,
2842: 		const char *key,
2843: 		      int   defval
2844: 	)
2845: {
2846: 	// パラメタの仮定
2847: 	ASSERT( IsValidLocalPathString( filename ) );
2848: 	ASSERT( IsValidStringPtr( section ) );
2849: 	ASSERT( '\0' != section[ 0 ] );
2850: 	ASSERT( IsValidStringPtr( key ) );
2851: 	ASSERT( '\0' != key[ 0 ] );
2852: 
2853: 	char buffer[ 1024 ];
2854: #pragma memo( "toolini.cpp - GetPrivateProfileSection() の方が安全?" )
2855: 	const int count = GetPrivateProfileString( section, key, "", buffer, numof(buffer)-1, filename );
2856: 	ASSERT( '\0' == buffer[ count ] );
2857: 
2858: 	int result;
2859: 	if ( 1 != sscanf( buffer, "%d", &result ) )
2860: 		return defval;
2861: 
2862: 	ASSERT( PrivateProfile_IsExistKey( filename, section, key ) );
2863: 	return result;
2864: }//PrivateProfile_ReadInteger
2865: 
2866: //*********************************************************
2867: // PrivateProfile_WriteBoolean
2868: //*********************************************************
2869: bool
2870: PrivateProfile_WriteBoolean
2871: 	(
2872: 		const char *filename,
2873: 		const char *section,
2874: 		const char *key,
2875: 		      bool  value
2876: 	)
2877: {
2878: 	// パラメタの仮定
2879: 	ASSERT( IsValidLocalPathString( filename ) );
2880: 	ASSERT( IsValidStringPtr( section ) );
2881: 	ASSERT( '\0' != section[ 0 ] );
2882: 	ASSERT( IsValidStringPtr( key ) );
2883: 	ASSERT( '\0' != key[ 0 ] );
2884: 
2885: 	// 文字列に変換する
2886: 	char string[ 256 ];
2887: 	VERIFY( 0 < snprintf( string, numof(string)-1, "%d", (value ? 1 : 0) ) );
2888: 	string[ numof(string)-1 ] = '\0';
2889: 	ASSERT( IsValidStringPtr( string ) );
2890: 
2891: 	// 書き出し
2892: 	const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2893: 	ASSERT( !bSuccess || (value == PrivateProfile_ReadBoolean( filename, section, key, !!value )) );
2894: 
2895: 	return bSuccess;
2896: }//PrivateProfile_WriteBoolean
2897: 
2898: //*********************************************************
2899: // PrivateProfile_WriteInteger
2900: //*********************************************************
2901: bool
2902: PrivateProfile_WriteInteger
2903: 	(
2904: 		const char *filename,
2905: 		const char *section,
2906: 		const char *key,
2907: 		      int   value
2908: 	)
2909: {
2910: 	// パラメタの仮定
2911: 	ASSERT( IsValidLocalPathString( filename ) );
2912: 	ASSERT( IsValidStringPtr( section ) );
2913: 	ASSERT( '\0' != section[ 0 ] );
2914: 	ASSERT( IsValidStringPtr( key ) );
2915: 	ASSERT( '\0' != key[ 0 ] );
2916: 
2917: 	// 文字列に変換する
2918: 	char string[ 256 ];
2919: 	VERIFY( 0 < snprintf( string, numof(string)-1, "%d", value ) );
2920: 	string[ numof(string)-1 ] = '\0';
2921: 	ASSERT( IsValidStringPtr( string ) );
2922: 
2923: 	// 書き出し
2924: 	const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2925: 	ASSERT( !bSuccess || (value == PrivateProfile_ReadInteger( filename, section, key, 1 + value )) );
2926: 
2927: 	return bSuccess;
2928: }//PrivateProfile_WriteInteger
2929: 
2930: //*********************************************************
2931: // PrivateProfile_WriteString
2932: // 空白類文字列が無効になる仕様を文字列 data を二重引用符で囲むことで回避する
2933: //*********************************************************
2934: bool
2935: PrivateProfile_WriteString
2936: 	(
2937: 		const char *filename,
2938: 		const char *section,
2939: 		const char *key,
2940: 		const char *data
2941: 	)
2942: {
2943: 	// パラメタの仮定
2944: 	ASSERT( IsValidLocalPathString( filename ) );
2945: 	ASSERT( IsValidStringPtr( section ) );
2946: 	ASSERT( '\0' != section[ 0 ] );
2947: 	ASSERT( IsValidStringPtr( key ) );
2948: 	ASSERT( '\0' != key[ 0 ] );
2949: 	ASSERT( IsValidStringPtr( data ) );
2950: 
2951: 	// 作業領域の確保
2952: 	const size_t length  = 2 + strlen( data ); // 2 <= '"' + '"'
2953: 	const size_t bufsize = 1 + length;         // 1 <= '\0'
2954: 	char *string = (char *)malloc( bufsize * sizeof( *string ) );
2955: 	if ( !string )
2956: 	{
2957: 		return false;
2958: 	}
2959: 		
2960: 	// 空白類文字列が無効になる仕様を回避するため文字列を二重引用符で囲む
2961: 	// snprintf("%c", '"') は VERIFY が拡張表記 '\"' を処理できないため
2962: 	VERIFY( (int)(length) == snprintf( string, bufsize, "%c%s%c", '"', data, '"' ) );
2963: 	ASSERT( '\0' == string[ length ] );
2964: 	string[ length ] = '\0';
2965: 
2966: 	// 出力する
2967: 	ASSERT( IsValidStringPtr( string ) );
2968: 	const bool bSuccess = !! WritePrivateProfileString( section, key, string, filename );
2969: 
2970: 	// 作業領域の破棄
2971: 	free( string );
2972: 
2973: 	return bSuccess;
2974: }//PrivateProfile_WriteString
2975: 
2976: 
2977: //------------------------------------------------------------------------------------------------------------------
2978: // q
2979: //------------------------------------------------------------------------------------------------------------------
2980: 
2981: //------------------------------------------------------------------------------------------------------------------
2982: // r
2983: //------------------------------------------------------------------------------------------------------------------
2984: 
2985: //------------------------------------------------------------------------------------------------------------------
2986: // s
2987: //------------------------------------------------------------------------------------------------------------------
2988: //*********************************************************
2989: // SaveShellLink
2990: //*********************************************************
2991: bool
2992: SaveShellLink
2993: 	(
2994: 		      IShellLink *psl,
2995: 		const char       *path,
2996: 		      bool        bRemember
2997: 	)
2998: {
2999: 	// パラメタの仮定
3000: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3001: 	ASSERT( IsValidLocalPathString( path ) );
3002: 
3003: 	const int count = MultiByteToWideChar( CP_ACP, 0, path, -1, null, 0 );
3004: 	if ( 0 < count )
3005: 	{
3006: 		WCHAR *wcPath = (WCHAR *)malloc( (1 + count) * sizeof( *wcPath ) );
3007: 		if ( wcPath )
3008: 		{
3009: 			VERIFY( count == MultiByteToWideChar( CP_ACP, 0, path, -1, wcPath, count ) );
3010: 
3011: 			if ( SaveShellLinkW( psl, wcPath, bRemember ) )
3012: 			{
3013: 				free( wcPath );
3014: 				return true;
3015: 			}
3016: 			free( wcPath );
3017: 		}
3018: 	}
3019: 	return false;
3020: }//SaveShellLink
3021: 
3022: //*********************************************************
3023: // SaveShellLinkW
3024: //*********************************************************
3025: bool
3026: SaveShellLinkW
3027: 	(
3028: 		      IShellLink *psl,
3029: 		const WCHAR      *wcLinkName,
3030: 		      bool        bRemember
3031: 	)
3032: {
3033: 	// パラメタの仮定
3034: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3035: 	ASSERT( IsValidStringPtr( (char *)wcLinkName ) );
3036: 
3037: 	IPersistFile *ppf = ShellLink_QueryPersistFileInterface( psl );
3038: 	if ( !ppf )
3039: 		return false;
3040: 
3041: 	const HRESULT hResult = ppf->Save( wcLinkName, bRemember );
3042: 	ppf->Release();
3043: 
3044: 	return S_OK == hResult;
3045: }//SaveShellLinkW
3046: 
3047: //*********************************************************
3048: // SetClipboardText()
3049: //   クリップボードに文字列を格納します。
3050: //
3051: // HWND hwndOwner
3052: //   クリップボードを専有するウィンドウ。
3053: //   HWND_DESKTOP を指定すると現在のタスクがクリップボードを専有する。
3054: //
3055: // const char *string
3056: //   クリップボードに格納する文字列。
3057: //
3058: //*********************************************************
3059: bool
3060: SetClipboardText
3061: 	(
3062: 		      HWND  hwndOwner, // クリップボードを専有するウィンドウ
3063: 		const char *string     // クリップボードに格納する文字列
3064: 	)
3065: {
3066: 	// パラメタの仮定
3067: 	ASSERT( !hwndOwner || IsValidWindow( hwndOwner ) );
3068: 	ASSERT( IsValidStringPtr( string ) );
3069: 
3070: 	// クリップボードに格納できるメモリハンドルは
3071: 	//   HGLOBAL hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE,
3072: 	// に限られている
3073: 	const size_t bufsize = 1 + strlen( string );
3074: 	HGLOBAL hMem = GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE, bufsize );
3075: 	if ( !hMem )
3076: 	{
3077: 		BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3078: 			"関数 GlobalAlloc( GMEM_SHARE | GMEM_MOVEABLE ) が null を返しました。" );
3079: 		return false;
3080: 	}
3081: 
3082: 	//
3083: 	char *buffer = (char *)GlobalLock( hMem );
3084: 	if ( buffer )
3085: 	{
3086: 		strcopy( buffer, bufsize, string );
3087: 		ASSERT( streql( buffer, string ) );
3088: 		GlobalUnlock( hMem ); // VERIFY( 0 == GlobalUnlock( hMem ) ); とは限らない
3089: 
3090: 		if ( OpenClipboard( hwndOwner ) )
3091: 		{
3092: 			VERIFY( EmptyClipboard() );
3093: 			VERIFY( hMem == SetClipboardData( CF_TEXT, hMem ) );
3094: 			VERIFY( CloseClipboard() );
3095: 			return true;
3096: 		}
3097: 		else
3098: 		{
3099: 			BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3100: 				"関数 OpenClipboard() が false を返しました。" );
3101: 		}
3102: 	}
3103: 	else
3104: 	{
3105: 		BACKGROUND_MESSAGE( "%s(%d) : %s \r\n", __FILE__, __LINE__,
3106: 			"関数 GlobalLock() が null を返しました。" );
3107: 	}
3108: 
3109: 	VERIFY( !GlobalFree( hMem ) );
3110: 	return false;
3111: }//SetClipboardText
3112: 
3113: //*********************************************************
3114: // SetCurrentProcessPriorityClass
3115: //*********************************************************
3116: bool
3117: SetCurrentProcessPriorityClass
3118: 	(
3119: 		DWORD dwPriorityClass
3120: 	)
3121: {
3122: 	// パラメタの仮定
3123: 	ASSERT( ( NORMAL_PRIORITY_CLASS   == dwPriorityClass )
3124: 	     || ( IDLE_PRIORITY_CLASS     == dwPriorityClass ) 
3125: 	     || ( HIGH_PRIORITY_CLASS     == dwPriorityClass ) 
3126: 	     || ( REALTIME_PRIORITY_CLASS == dwPriorityClass ) );
3127: 
3128: 	HANDLE hCurrentProcess = GetCurrentProcess();
3129: 	return !! SetPriorityClass( hCurrentProcess, dwPriorityClass );
3130: }//SetCurrentProcessPriorityClass
3131: 
3132: //*********************************************************
3133: // SetRegKeyString
3134: //*********************************************************
3135: bool
3136: SetRegKeyString
3137: 	(
3138: 		      HKEY  hKey,
3139: 		const char *name,
3140: 		const char *string
3141: 	)
3142: {
3143: 	// パラメタの仮定
3144: 	ASSERT( IsValidRegKeyHandle( hKey ) );
3145: 	ASSERT( IsValidStringPtr( string ) );
3146: 	ASSERT( !name || IsValidRegistryValueName( name ) );
3147: 
3148: 	const size_t length = strlen( string );
3149: 	return ERROR_SUCCESS == RegSetValueEx
3150: 		(
3151: 			hKey, 
3152: 			name, 
3153: 			0, // reserved
3154: 			REG_SZ,
3155: 			(const BYTE *)string,
3156: 			SIZE_T_TO_DWORD( (1 + length) * sizeof( *string ) )
3157: 		);
3158: }//SetRegKeyString
3159: 
3160: //*********************************************************
3161: // SetWallPaperFile
3162: //   flags = SPIF_UPDATEINIFILE, SPIF_SENDWININICHANGE, ...
3163: //*********************************************************
3164: bool
3165: SetWallPaperFile
3166: 	(
3167: 		const char *filename,
3168: 		      UINT  flags
3169: 	)
3170: {
3171: 	// パラメタの仮定
3172: 	ASSERT( IsValidStringPtr( filename ) );
3173: 	ASSERT( ('\0' == filename[0]) || IsPathFile( filename ) );
3174: 
3175: 	return !! SystemParametersInfo( SPI_SETDESKWALLPAPER, 0, (void *)filename, flags );
3176: }//SetWallPaperFile
3177: 
3178: //*********************************************************
3179: // ShellLink_QueryPersistFileInterface
3180: //*********************************************************
3181: IPersistFile *
3182: ShellLink_QueryPersistFileInterface
3183: 	(
3184: 		IShellLink *psl
3185: 	)
3186: {
3187: 	// パラメタの仮定
3188: 	ASSERT( IsValidPtr( psl, sizeof( *psl ) ) );
3189: 
3190: 	IPersistFile *ppf;
3191: 	if ( S_OK != psl->QueryInterface( IID_IPersistFile, (void **)&ppf ) )
3192: 		return null;
3193: 
3194: 	ASSERT( IsValidPtr( ppf, sizeof( *ppf ) ) );
3195: 	return ppf;
3196: }//ShellLink_QueryPersistFileInterface
3197: 
3198: //*********************************************************
3199: // 関数名:
3200: //     SHGetFileIcon
3201: //
3202: // 戻り値:
3203: //     HICON …… 取得したアイコンのハンドル
3204: //                使用後は DestroyIcon() で破棄
3205: // 引数:
3206: //     path  …… アイコンを取得するファイルのファイル名
3207: //     flags …… 取得するアイコンの種類
3208: //     ・SHGFI_LARGEICON     // 大きいアイコン
3209: //     ・SHGFI_SMALLICON     // 小さいアイコン
3210: //     ・SHGFI_OPENICON      // 開いているアイコン
3211: //     ・SHGFI_SHELLICONSIZE // [英語] get shell size icon
3212: //     ・SHGFI_LINKOVERLAY   // ショートカット
3213: //     ・SHGFI_SELECTED      // 選択時のアイコン
3214: //*********************************************************
3215: HICON
3216: SHGetFileIcon
3217: 	(
3218: 		const char *path,
3219: 		      UINT  flags
3220: 	)
3221: {
3222: 	// パラメタの仮定
3223: 	ASSERT( IsPathExist( path ) );
3224: 
3225: 	SHFILEINFO shfi;
3226: 	SHGetFileInfo( path, 0, &shfi, sizeof( shfi ), SHGFI_ICON | flags );
3227: 	return shfi.hIcon;
3228: }//SHGetFileIcon
3229: 
3230: //*********************************************************
3231: // 関数名:
3232: //     SHGetInstanceIcon
3233: //
3234: // 戻り値:
3235: //     HICON …… 取得したアイコンのハンドル
3236: //                使用後は DestroyIcon() で破棄
3237: //
3238: // 引数:
3239: //     hInstance …… アイコンを取得するファイルのファイル名
3240: //     flags     …… 取得するアイコンの種類
3241: //     ・SHGFI_LARGEICON     // 大きいアイコン
3242: //     ・SHGFI_SMALLICON     // 小さいアイコン
3243: //     ・SHGFI_OPENICON      // 開いているアイコン
3244: //     ・SHGFI_SHELLICONSIZE // [英語] get shell size icon
3245: //     ・SHGFI_LINKOVERLAY   // ショートカット
3246: //     ・SHGFI_SELECTED      // 選択時のアイコン
3247: //*********************************************************
3248: HICON
3249: SHGetInstanceIcon
3250: 	(
3251: 		HINSTANCE hInstance,
3252: 		UINT      flags
3253: 	)
3254: {
3255: 	// パラメタの仮定
3256: 	ASSERT( IsValidInstanceHandle( hInstance ) );
3257: 
3258: 	char filename[ MAX_PATH_BUF ]; // インスタンスに関連づけられているファイル名
3259: 	if ( !GetModuleFileName( hInstance, filename, numof(filename) ) )
3260: 		return null; // ファイルの取得に失敗
3261: 
3262: 	ASSERT( IsPathFile( filename ) );
3263: 	return SHGetFileIcon( filename, flags );
3264: }//SHGetInstanceIcon
3265: 
3266: 
3267: //------------------------------------------------------------------------------------------------------------------
3268: // t
3269: //------------------------------------------------------------------------------------------------------------------
3270: 
3271: //------------------------------------------------------------------------------------------------------------------
3272: // u
3273: //------------------------------------------------------------------------------------------------------------------
3274: //*********************************************************
3275: // UpdateNotifyIcon
3276: //   消えてしまったアイコンを再登録する
3277: //*********************************************************
3278: bool
3279: UpdateNotifyIcon
3280: 	(
3281: 		NOTIFYICONDATA *nid
3282: 	)
3283: {
3284: 	// パラメタの仮定
3285: 	ASSERT( IsValidNotifyIconData( nid ) );
3286: 
3287: 	DeleteNotifyIcon( nid );
3288: 
3289: 	return AddNotifyIcon( nid );
3290: }//UpdateNotifyIcon
3291: 
3292: 
3293: //------------------------------------------------------------------------------------------------------------------
3294: // v
3295: //------------------------------------------------------------------------------------------------------------------
3296: 
3297: //------------------------------------------------------------------------------------------------------------------
3298: // w
3299: //------------------------------------------------------------------------------------------------------------------
3300: 
3301: //------------------------------------------------------------------------------------------------------------------
3302: // x
3303: //------------------------------------------------------------------------------------------------------------------
3304: 
3305: //------------------------------------------------------------------------------------------------------------------
3306: // y
3307: //------------------------------------------------------------------------------------------------------------------
3308: 
3309: //------------------------------------------------------------------------------------------------------------------
3310: // z
3311: //------------------------------------------------------------------------------------------------------------------
3312: 
3313: 
3314: //******************************************************************************************************************
3315: // private
3316: //******************************************************************************************************************
3317: //*********************************************************
3318: // CreateFindFileHandle
3319: // [確証なし] スタック領域節約のための方策
3320: //*********************************************************
3321: static
3322: HANDLE
3323: CreateFindFileHandle
3324: 	(
3325: 		const char            *path,
3326: 		const char            *mask,
3327: 		      WIN32_FIND_DATA *wfd
3328: 	)
3329: {
3330: 	ASSERT( IsPathDirectory( path ) );
3331: 	ASSERT( IsValidStringPtr( mask ) );
3332: 	ASSERT( IsValidPtr( wfd, sizeof( *wfd ) ) );
3333: 
3334: 	char findmask[ MAX_PATH_BUF ];
3335: 	MakeFullPath( findmask, numof( findmask ), path, mask ); 
3336: 	return FindFirstFile( findmask, wfd );
3337: }//CreateFindFileHandle
3338: 
3339: 
3340: //******************************************************************************************************************
3341: // TEST
3342: //******************************************************************************************************************
3343: 
3344: 
3345: #ifdef _DEBUG // デバッグ時のみ
3346: 
3347: 
3348: //*********************************************************
3349: // test_vkeyname()
3350: //*********************************************************
3351: DEFINE_TESTPROC( test_vkeyname )
3352: {
3353: 	//---------------------------------------------------------
3354: 	// 定数 の テスト
3355: 	//---------------------------------------------------------
3356: 
3357: 	//---------------------------------------------------------
3358: 	// ファイルスコープ関数 の テスト
3359: 	//---------------------------------------------------------
3360: 
3361: 	//---------------------------------------------------------
3362: 	// 公開関数 の テスト
3363: 	//---------------------------------------------------------
3364: 
3365: 	// GetVirtualKeyNameText()
3366: 	{
3367: 		// MapVirtualKey() の範囲を絞り込む
3368: 		//   0x00 <= vkey <= 0xFF
3369: 		{for( int vkey = VK_MAX + 1; vkey < 0xFFFF; ++vkey )
3370: 		{
3371: 			// 常に変換に失敗
3372: 			VERIFY( 0 == MapVirtualKey( vkey, 0 ));
3373: 		}}
3374: 
3375: 		// キー名取得のテスト
3376: 		{for( int vkey = VK_MIN; vkey <= VK_MAX; ++vkey )
3377: 		{
3378: 			{for( int j = 0; j < 2; ++j )
3379: 			{
3380: 				const bool extend = (0 != (j & 1));
3381: 
3382: 				// 十分なバッファ
3383: 				char buffer_1[ MAX_KEYNAMELENGTH+1 ];
3384: 				{
3385: 					const int length = GetVirtualKeyNameText( buffer_1, numof(buffer_1), vkey, extend );
3386: 					VERIFY( length < numof(buffer_1) );
3387: 					VERIFY( (length <= 0) || ('\0' == buffer_1[ length ]) );
3388: 				}
3389: 
3390: 				// バッファが不足
3391: 				char buffer_2[ 2 ];
3392: 				{
3393: 					const int length = GetVirtualKeyNameText( buffer_2, numof(buffer_2), vkey, extend );
3394: 					VERIFY( length < numof(buffer_2) );
3395: 					VERIFY( (length <= 0) || (buffer_1[ 0 ] == buffer_2[ 0 ]) );
3396: 					VERIFY( (length <= 0) || ('\0' == buffer_2[ 1 ]) );
3397: 				}
3398: 			}}
3399: 		}}
3400: 	}
3401: 
3402: }//test_vkeyname
3403: 
3404: 
3405: #endif // #ifdef _DEBUG
3406: 
3407: 
3408: //** end **

参照:


Google
ご意見・ご感想をお聞かせ下さい。匿名で送信できます。

 * 返信が必要な場合には postmaster@katsura-kotonoha.sakura.ne.jp へ直接メールしてください。

水無瀬の部屋 > sample > tools > toolsys.cpp

このページは cpp2web が出力しました。
水無瀬 優 postmaster@katsura-kotonoha.sakura.ne.jp
http://katsura-kotonoha.sakura.ne.jp/prog/code/tools/toolsys_cpp.shtml
『新妻LOVELY×CATION』を応援しています!