C:\home\SVGCats_src\src\Winx-p.cpp
1|/************************************************************************** 2|* 1. <<< Windows API by C++ (WinXpp) >>> 3|***************************************************************************/ 4| 5|#include <windows.h> 6|#include <WinInet.h> 7|#define _WIN32_IE 0x0400 8|#include <shlobj.h> 9|#include <ComDef.h> 10|#include <shlwapi.h> 11| 12|#define WINDOWSINC_INCLUDE_WINDOWS_H 13|#ifdef USES_MXP_AUTOINC 14| #include <winx.ah> /* Auto include header, Look at mixer-... folder */ 15|#else 16| #include <all.h> 17|#endif 18| 19| 20| 21| 22| 23|/*------------------------------------------------------------------------*/ 24|/* 2. <<< ◆パス関係 >>> */ 25|/*------------------------------------------------------------------------*/ 26| 27| 28|/************************************************************************** 29| 3. <<< [WinX_getAllStartupPath] 全ユーザに対するスタートアップのパスを参照する >>> 30|【補足】 31|・通常、"C:\Documents and Settings\All Users\スタート メニュー\プログラム\スタートアップ" を参照します。 32|***************************************************************************/ 33|char* WinX_getAllStartupPath() 34|{ 35| static char path[_MAX_PATH]; 36| LPITEMIDLIST pidl; 37| 38| SHGetSpecialFolderLocation( NULL, CSIDL_COMMON_STARTUP, &pidl ); 39| SHGetPathFromIDList( pidl, path ); 40| CoTaskMemFree( pidl ); 41| 42| return (char*)(const char*)path; 43|} 44| 45| 46|/************************************************************************** 47| 4. <<< [WinX_getShortCutTarget] ショートカット・ファイルのリンク先を取得する >>> 48|***************************************************************************/ 49|void WinX_getShortCutTarget( const char* shortCut_path, char* target_path ) 50|{ 51| IShellLink* shell; 52| IPersistFile* persis; 53| bool bCo = false; 54| bool bShell = false; 55| bool bPersis = false; 56| WCHAR wcLinkFile[MAX_PATH]; 57| WIN32_FIND_DATA dummy; 58| HRESULT ret; 59| 60| c_try { 61| CoInitialize( NULL ); bCo = true; 62| ret = CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&shell ); 63| if ( ret != S_OK ) error(); 64| ret = shell->QueryInterface( IID_IPersistFile, (void **)&persis ); 65| if ( ret != S_OK ) error(); 66| MultiByteToWideChar( CP_ACP, 0, shortCut_path, -1, wcLinkFile, MAX_PATH ); 67| ret = persis->Load( wcLinkFile, STGM_READ ); 68| if ( ret != S_OK ) error(); 69| shell->GetPath( target_path, MAX_PATH, &dummy, SLGP_UNCPRIORITY ); 70| } 71| c_finally { 72| if ( bPersis ) persis->Release(); 73| if ( bShell ) shell->Release(); 74| if ( bCo ) CoUninitialize(); 75| } c_end_finally; 76|} 77| 78| 79|/************************************************************************** 80| 5. <<< [WinX_createShortcut] ショートカットファイルを作成する >>> 81|【引数】 82| ・char* path; 作成するショートカットファイルのパス(*.lnk) 83| ・char* targetPath; リンク先のファイルパス 84| ・char* param; targePath に続けて指定するコマンド列 85| ・char* workPath; 作業用ディレクトリ・パス(カレント・ディレクトリ) 86| ・int showFlags; 表示形態(SW_SHOWNORMAL など) 87| ・char* iconPath; アイコンのファイルパス 88| ・int iIcon; iconPath ファイルの中のアイコン番号 89| ・char* description; ショートカットの説明(ヒント表示、"" 指定可) 90|【補足】 91|・各引数については、Windows でショートカットを作成し、プロパティをさわって 92| 理解してください。 93|***************************************************************************/ 94|void WinX_createShortcut( const char* path, const char* targetPath, 95| const char* param, const char* workPath, int showFlags, 96| const char* iconPath, int iIcon, const char* description ) 97|{ 98| IShellLink* link; 99| bool bLink = false; 100| IPersistFile* file; 101| bool bFile = false; 102| WCHAR ws[MAX_PATH]; 103| 104| c_try { 105| 106| CoInitialize( NULL ); 107| 108| /* IShellLink I/F */ 109| if ( FAILED( CoCreateInstance( CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, 110| IID_IShellLink, (void**)&link ) ) ) 111| WinX_throw(-1); 112| bLink = true; 113| 114| /* 属性を設定する */ 115| link->SetPath( targetPath ); 116| link->SetArguments( param ); 117| link->SetWorkingDirectory( workPath ); 118| link->SetShowCmd( showFlags ); 119| link->SetIconLocation( iconPath, iIcon ); 120| 121| /* IPersistFile I/F */ 122| if ( FAILED( link->QueryInterface( IID_IPersistFile, (void**)&file ) ) ) 123| WinX_throw(-1); 124| 125| /* ファイルの作成 */ 126| MultiByteToWideChar( CP_ACP, 0, path, -1, ws, MAX_PATH ); 127| if ( FAILED( file->Save( ws, TRUE ) ) ) 128| WinX_throw(-1); 129| } 130| c_finally { 131| if ( bFile ) file->Release(); 132| if ( bLink ) link->Release(); 133| CoUninitialize(); 134| } c_end_finally; 135|} 136| 137| 138| 139|/************************************************************************** 140| 6. <<< [WinX_openFolderSelDlg] フォルダ選択ダイアログを表示する >>> 141|【引数】 142| ・HWND parent; 親ウィンドウ 143| ・char* title; 説明文 144| ・char* path; (入力)デフォルトパス(出力)選択したフォルダパス 145| ・bool 返り値; OK を押したかどうか(false=キャンセル) 146|【補足】 147|・path のサイズは、_MAX_PATH 以上にします。 148|***************************************************************************/ 149|int _stdcall WinX_openFolderSelDlgSub( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData ); 150| 151| 152|bool WinX_openFolderSelDlg( HWND parent, const char* title, char* path ) 153|{ 154| BROWSEINFO info; 155| ITEMIDLIST* idl; 156| 157| info.hwndOwner = parent; 158| info.pidlRoot = NULL; 159| info.pszDisplayName = path; 160| info.lpszTitle = title; 161| info.ulFlags = BIF_RETURNONLYFSDIRS; 162| info.lpfn = WinX_openFolderSelDlgSub; 163| info.lParam = (LPARAM)path; 164| info.iImage = 1; 165| 166| idl = SHBrowseForFolder( &info ); 167| 168| if ( idl == NULL ) return false; 169| 170| SHGetPathFromIDList( idl, path ); 171| 172| CoTaskMemFree( idl ); 173| return true; 174|} 175| 176| 177|static int _stdcall WinX_openFolderSelDlgSub( HWND hWnd, UINT uMsg, LPARAM lParam, LPARAM lpData ) 178|{ 179| switch ( uMsg ) { 180| case BFFM_INITIALIZED: 181| SendMessage( hWnd, BFFM_SETSELECTION, TRUE, lpData ); 182| break; 183| } 184| return 0; 185|} 186| 187|/*------------------------------------------------------------------------*/ 188|/* 7. <<< ◆エクスプローラメニュー関係 >>> */ 189|/*------------------------------------------------------------------------*/ 190| 191| 192| 193|/************************************************************************** 194| 8. <<< [WinX_flush] デスクトップやエクスプローラを最新の情報に更新する >>> 195|【補足】 196|・デスクトップ、エクスプローラ、インターネット・エクスプローラを最新の情報に 197| 更新します。 198|・別のプロセスでフォルダウィンドウを開く設定になっているときは、デスクトップ 199| しか更新できません。(Windows の仕様?) 200|***************************************************************************/ 201|void WinX_flush() 202|{ 203| SHChangeNotify( SHCNE_ASSOCCHANGED, SHCNF_FLUSH, NULL, NULL ); 204|} 205| 206| 207|#if 0 208| 209|void WinX_reloadActiveDesktop() 210|{ 211|// IActiveDesktopPtr pActiveDesktop( _uuidof( ActiveDesktop ) ); 212|// pActiveDesktop->ApplyChanges( AD_APPLY_ALL ); 213| 214| HRESULT hr; 215| IActiveDesktop* pActiveDesktop; 216| COMPONENT com; 217| 218| CoInitialize( NULL ); 219| hr = CoCreateInstance(CLSID_ActiveDesktop, NULL, CLSCTX_INPROC_SERVER, 220| IID_IActiveDesktop, (void**)&pActiveDesktop); 221| if (! SUCCEEDED(hr)) error(); 222| 223| memset( &com, 0, sizeof(com) ); 224| com.dwSize = sizeof(com); 225| hr = pActiveDesktop->GetDesktopItem( 0, &com, 0 ); 226| if (! SUCCEEDED(hr)) error(); 227| 228| hr = pActiveDesktop->ModifyDesktopItem( &com, AD_APPLY_REFRESH ); 229| if (! SUCCEEDED(hr)) error(); 230| 231| hr = pActiveDesktop->ApplyChanges( AD_APPLY_ALL ); 232| if (! SUCCEEDED(hr)) error(); 233| 234| pActiveDesktop->Release(); 235| CoUninitialize(); 236|} 237| 238|#endif 239| 240|