13b7203622 2011-02-23 kinaba: //--- K.I.LIB --- 13b7203622 2011-02-23 kinaba: // kl_wcmn.h : windows-common-interface operatin 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: #include "stdafx.h" 13b7203622 2011-02-23 kinaba: #include "kilib.h" 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiSUtil::switchCurDirToExeDir() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char exepath[MAX_PATH+50]; 13b7203622 2011-02-23 kinaba: GetModuleFileName( NULL, exepath, MAX_PATH ); 13b7203622 2011-02-23 kinaba: char* lastslash = 0; 13b7203622 2011-02-23 kinaba: for( char* p=exepath; *p; p=CharNext(p) ) 13b7203622 2011-02-23 kinaba: if( *p=='\\' || *p=='/' ) 13b7203622 2011-02-23 kinaba: lastslash = p; 13b7203622 2011-02-23 kinaba: if(lastslash) 13b7203622 2011-02-23 kinaba: *lastslash = '\0'; 13b7203622 2011-02-23 kinaba: SetCurrentDirectory(exepath); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: static int CALLBACK __ki__ofp( HWND w, UINT m, LPARAM l, LPARAM d ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( m==BFFM_INITIALIZED && d ) 13b7203622 2011-02-23 kinaba: ::SendMessage( w, BFFM_SETSELECTION, TRUE, d ); 13b7203622 2011-02-23 kinaba: return 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiSUtil::getFolderDlg( char* buf, HWND par, const char* title, const char* def ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // 情報セット 13b7203622 2011-02-23 kinaba: BROWSEINFO bi; 13b7203622 2011-02-23 kinaba: ki_memzero( &bi, sizeof(bi) ); 13b7203622 2011-02-23 kinaba: bi.hwndOwner = par; 13b7203622 2011-02-23 kinaba: bi.pszDisplayName = buf; 13b7203622 2011-02-23 kinaba: bi.lpszTitle = title; 13b7203622 2011-02-23 kinaba: bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN; 13b7203622 2011-02-23 kinaba: bi.lpfn = __ki__ofp; 13b7203622 2011-02-23 kinaba: bi.lParam = (long)def; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // ダイアログ表示 13b7203622 2011-02-23 kinaba: ITEMIDLIST* id = ::SHBrowseForFolder( &bi ); 13b7203622 2011-02-23 kinaba: if( id==NULL ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: ::SHGetPathFromIDList( id, buf ); 13b7203622 2011-02-23 kinaba: app()->shellFree( id ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 終了 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiSUtil::getFolderDlgOfEditBox( HWND wnd, HWND par, const char* title ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char str[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ::SendMessage( wnd, WM_GETTEXT, MAX_PATH, (LPARAM)str ); 13b7203622 2011-02-23 kinaba: for( char* x=str,*l=str; *x; x=kiStr::next(x) ) 13b7203622 2011-02-23 kinaba: l=x; 13b7203622 2011-02-23 kinaba: if( *l=='\\' || *l=='/' ) 13b7203622 2011-02-23 kinaba: *l='\0'; 13b7203622 2011-02-23 kinaba: if( getFolderDlg( str, par, title, str ) ) 13b7203622 2011-02-23 kinaba: ::SendMessage( wnd, WM_SETTEXT, 0, (LPARAM)str ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int kiSUtil::getSysIcon( const char* ext ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiPath tmp( kiPath::Tmp ); 13b7203622 2011-02-23 kinaba: tmp += "noahicontest."; 13b7203622 2011-02-23 kinaba: tmp += ext; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: SHFILEINFO fi; 13b7203622 2011-02-23 kinaba: ::SHGetFileInfo( tmp, 0, &fi, sizeof(fi), 13b7203622 2011-02-23 kinaba: SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX ); 13b7203622 2011-02-23 kinaba: return fi.iIcon; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiSUtil::msgLastError( const char* msg ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char* pMsg; 13b7203622 2011-02-23 kinaba: ::FormatMessage( 13b7203622 2011-02-23 kinaba: FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, 13b7203622 2011-02-23 kinaba: NULL,::GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&pMsg,0,NULL ); 13b7203622 2011-02-23 kinaba: if( msg ) 13b7203622 2011-02-23 kinaba: app()->msgBox( kiStr(msg) + "\r\n\r\n" + pMsg ); 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: app()->msgBox( pMsg ); 13b7203622 2011-02-23 kinaba: ::LocalFree( pMsg ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiSUtil::createShortCut( const kiPath& at, const char* name ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ::CoInitialize(NULL); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: IShellLink* psl; 13b7203622 2011-02-23 kinaba: if( SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl)) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: psl->SetPath( kiPath(kiPath::Exe_name) ); 13b7203622 2011-02-23 kinaba: psl->SetWorkingDirectory( kiPath(kiPath::Exe,false) ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: IPersistFile* ppf; 13b7203622 2011-02-23 kinaba: if( SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf)) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: wchar_t wsz[MAX_PATH]; 13b7203622 2011-02-23 kinaba: kiPath lnkfile( at ); 13b7203622 2011-02-23 kinaba: lnkfile += name, lnkfile += ".lnk"; 13b7203622 2011-02-23 kinaba: ::MultiByteToWideChar(CP_ACP,0,lnkfile,-1,wsz,MAX_PATH); 13b7203622 2011-02-23 kinaba: ppf->Save(wsz,TRUE); 13b7203622 2011-02-23 kinaba: ppf->Release(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: psl->Release(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: ::CoUninitialize(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiSUtil::exist( const char* fname ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: return 0xffffffff != ::GetFileAttributes( fname ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiSUtil::isdir( const char* fname ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: DWORD attr = ::GetFileAttributes( fname ); 13b7203622 2011-02-23 kinaba: return attr!=0xffffffff && (attr&FILE_ATTRIBUTE_DIRECTORY); 13b7203622 2011-02-23 kinaba: }