13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: #include "stdafx.h" 13b7203622 2011-02-23 kinaba: #include "../kilib/kilib.h" 13b7203622 2011-02-23 kinaba: #include "resource.h" 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- 雑用Functions ---------------------------------------------------------- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void getProgramFiles( kiPath* path ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // 1.レジストリから 13b7203622 2011-02-23 kinaba: kiRegKey key; 13b7203622 2011-02-23 kinaba: if( key.open( HKEY_CLASSES_ROOT, "Software\\Microsoft\\Windows\\CurrentVersion", KEY_QUERY_VALUE ) ) 13b7203622 2011-02-23 kinaba: if( key.get( "ProgramFilesDir", path ) 13b7203622 2011-02-23 kinaba: || key.get( "ProgramFilesPath", path ) ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 2.Windowsディレクトリからの類推 13b7203622 2011-02-23 kinaba: char buf[MAX_PATH]; 13b7203622 2011-02-23 kinaba: if( ::GetWindowsDirectory( buf, MAX_PATH ) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: for( char* p=buf; *p!='\\' && *p; p++ ); 13b7203622 2011-02-23 kinaba: *p='\0'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: *path= buf, *path += '\\', *path += "Program Files"; 13b7203622 2011-02-23 kinaba: if( ::GetFileAttributes( *path ) != 0xffffffff ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 3.しゃーないので起動ディレクトリ 13b7203622 2011-02-23 kinaba: path->beSpecialPath( kiPath::Exe ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void createShortCut( const kiPath& original, const kiPath& at, const char* name ) 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( original ); 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: WORD 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: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- メイン ------------------------------------------------------------------- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: class CKInstApp : public kiApp, kiDialog // kiAppのコンストラクタが先に呼ばれないと死ぬ。よろしくない。 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: CKInstApp() : kiDialog( IDD_MAIN ) {} 13b7203622 2011-02-23 kinaba: friend void kilib_create_new_app(); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- メインルーチン --------- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void run( kiCmdParser& cmd ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( cmd.option().len() ) 13b7203622 2011-02-23 kinaba: if( cmd.option()[0][1] == 'i' ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: install(); 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: else if( cmd.option()[0][1] == 'u' && cmd.param().len() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: uninstall( cmd.param()[0] ); 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: boot_uninstaller(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void install() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: doModal(); 13b7203622 2011-02-23 kinaba: if( IDCANCEL == getEndCode() ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !copy() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: msgBox( kiStr().loadRsrc(IDS_COPYFAIL) ); 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !regist() ) 13b7203622 2011-02-23 kinaba: msgBox( kiStr().loadRsrc(IDS_REGISTFAIL) ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: do_caldix(); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: msgBox( kiStr().loadRsrc(IDS_INSTALLFINISH),"Noah",MB_OK|MB_ICONINFORMATION ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void uninstall( const char* dir ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: m_destdir = dir; 13b7203622 2011-02-23 kinaba: for( int i=0; i!=sizeof(m_assoc)/sizeof(bool); i++ ) 13b7203622 2011-02-23 kinaba: m_assoc[i]=false; 13b7203622 2011-02-23 kinaba: Sleep(200); 13b7203622 2011-02-23 kinaba: unregist(); 13b7203622 2011-02-23 kinaba: remove(); 13b7203622 2011-02-23 kinaba: kill_later( kiPath(kiPath::Exe_name) ); 13b7203622 2011-02-23 kinaba: msgBox( kiStr().loadRsrc(IDS_UNINSTALLFINISH),"Noah",MB_OK|MB_ICONINFORMATION ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void boot_uninstaller() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( IDNO==msgBox( kiStr(500).loadRsrc(IDS_UNINSTOK), "Noah", MB_YESNO|MB_ICONQUESTION ) ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiPath self(kiPath::Exe_name), to(kiPath::Tmp), pos(kiPath::Exe); 13b7203622 2011-02-23 kinaba: to += "noaunins.exe"; 13b7203622 2011-02-23 kinaba: ::CopyFile( self, to, FALSE ); 13b7203622 2011-02-23 kinaba: to += " -u \"", to += pos, to+='"'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: PROCESS_INFORMATION pi; 13b7203622 2011-02-23 kinaba: STARTUPINFO si; ki_memzero( &si,sizeof(si) ); si.cb=sizeof(si); 13b7203622 2011-02-23 kinaba: if( !::CreateProcess( NULL,const_cast<char*>((const char*)to), 13b7203622 2011-02-23 kinaba: NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi ) ) 13b7203622 2011-02-23 kinaba: return; // 起動できなかった…。 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::CloseHandle( pi.hThread ); 13b7203622 2011-02-23 kinaba: ::CloseHandle( pi.hProcess ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // レジストリのアンインストール情報削除 13b7203622 2011-02-23 kinaba: kiRegKey key; 13b7203622 2011-02-23 kinaba: if( key.open( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" ) ) 13b7203622 2011-02-23 kinaba: key.delSubKey( "Noah" ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- メインダイアログの処理 -- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool onOK() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char str[MAX_PATH]; 13b7203622 2011-02-23 kinaba: sendMsgToItem( IDC_INSTALLTO, WM_GETTEXT, MAX_PATH, (LPARAM)str ); 13b7203622 2011-02-23 kinaba: if( str[1]!=':' || str[2]!='\\' ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: msgBox( kiStr().loadRsrc(IDS_BADPATH) ); 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: m_destdir = str; 13b7203622 2011-02-23 kinaba: m_destdir.beBackSlash(true); 13b7203622 2011-02-23 kinaba: for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) 13b7203622 2011-02-23 kinaba: m_assoc[i-IDC_LZH] = (BST_CHECKED==sendMsgToItem( i, BM_GETCHECK )); 13b7203622 2011-02-23 kinaba: m_assoc[IDC_STT-IDC_LZH] = true; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: BOOL onInit() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: for( int j=0; j<18; j++ ) 13b7203622 2011-02-23 kinaba: m_assoc[j] = true; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiPath prg; 13b7203622 2011-02-23 kinaba: getPrevPos( &prg ); 13b7203622 2011-02-23 kinaba: if( prg.len()==0 ) // 新規インストール 13b7203622 2011-02-23 kinaba: getProgramFiles( &prg ), prg.beBackSlash(true), prg += "Noah\\"; 13b7203622 2011-02-23 kinaba: else // 既に存在してる場合 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: HINSTANCE hDLL = kiSUtil::loadLibrary( "NoahXt.dll" ); 13b7203622 2011-02-23 kinaba: if( hDLL ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: typedef bool (WINAPI * XT_IA)(); 13b7203622 2011-02-23 kinaba: XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); 13b7203622 2011-02-23 kinaba: if( Init() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_LS)(bool*,bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_AS)(bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_LSEX)(const char*,bool*); 13b7203622 2011-02-23 kinaba: XT_LS LoadSE = (XT_LS)::GetProcAddress( hDLL, "LoadSE" ); 13b7203622 2011-02-23 kinaba: XT_AS LoadAssoc = (XT_AS)::GetProcAddress( hDLL, "LoadAS" ); 13b7203622 2011-02-23 kinaba: XT_LSEX LoadASEx = (XT_LSEX)::GetProcAddress( hDLL, "LoadASEx" ); 13b7203622 2011-02-23 kinaba: LoadSE( &m_assoc[13], &m_assoc[14] ); 13b7203622 2011-02-23 kinaba: LoadASEx( "7z\0", &m_assoc[12] ); 13b7203622 2011-02-23 kinaba: LoadAssoc( m_assoc ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: ::FreeLibrary( hDLL ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: m_assoc[15] = kiSUtil::exist( kiPath(kiPath::Snd)+="Noah.lnk" ); 13b7203622 2011-02-23 kinaba: m_assoc[16] = kiSUtil::exist( kiPath(kiPath::Dsk)+="Noah.lnk" ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: sendMsgToItem( IDC_INSTALLTO, WM_SETTEXT, 0, (LPARAM)(const char*)prg ); 13b7203622 2011-02-23 kinaba: for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) 13b7203622 2011-02-23 kinaba: if( m_assoc[i-IDC_LZH] ) 13b7203622 2011-02-23 kinaba: sendMsgToItem( i, BM_SETCHECK, BST_CHECKED ); 13b7203622 2011-02-23 kinaba: return FALSE; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( msg != WM_COMMAND ) 13b7203622 2011-02-23 kinaba: return FALSE; 13b7203622 2011-02-23 kinaba: switch( LOWORD(wp) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: case IDC_REF:{ 13b7203622 2011-02-23 kinaba: char str[MAX_PATH]; 13b7203622 2011-02-23 kinaba: sendMsgToItem( IDC_INSTALLTO, WM_GETTEXT, MAX_PATH, (LPARAM)str ); 13b7203622 2011-02-23 kinaba: if( kiSUtil::getFolderDlg( str, hwnd(), kiStr().loadRsrc(IDS_DIR), str ) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiPath x(str); x.beBackSlash(true); x+="Noah\\"; 13b7203622 2011-02-23 kinaba: sendMsgToItem( IDC_INSTALLTO, WM_SETTEXT, 0, (LPARAM)(const char*)x ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: }break; 13b7203622 2011-02-23 kinaba: case IDC_ALL:{ 13b7203622 2011-02-23 kinaba: for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) 13b7203622 2011-02-23 kinaba: sendMsgToItem( i, BM_SETCHECK, BST_UNCHECKED ); 13b7203622 2011-02-23 kinaba: }break; 13b7203622 2011-02-23 kinaba: default: 13b7203622 2011-02-23 kinaba: return FALSE; 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: //-- インストール --------- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool m_assoc[18]; // LZH-JAK, 7Z, CMP MLT, SND DSK STT 13b7203622 2011-02-23 kinaba: kiPath m_destdir; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool copy() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiPath exe(kiPath::Exe,false), inst(m_destdir); 13b7203622 2011-02-23 kinaba: inst.beBackSlash(false); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // とりあえず全コピ 13b7203622 2011-02-23 kinaba: bool r = copy_dir2dir(exe,inst); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // manualの言語をてけとーに調整 13b7203622 2011-02-23 kinaba: kiPath manE(m_destdir), manJ(m_destdir); 13b7203622 2011-02-23 kinaba: manE.beBackSlash(true), manJ.beBackSlash(true); 13b7203622 2011-02-23 kinaba: manE += "manual-e.htm", manJ += "manual.htm"; 13b7203622 2011-02-23 kinaba: if( ::GetACP() != 932 ) 13b7203622 2011-02-23 kinaba: ::CopyFile( manE, manJ, FALSE ); 13b7203622 2011-02-23 kinaba: ::DeleteFile( manE ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return r; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool regist() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // NoahXt.dllによる処理 13b7203622 2011-02-23 kinaba: kiPath xtdll( m_destdir ); 13b7203622 2011-02-23 kinaba: xtdll += "NoahXt.dll"; 13b7203622 2011-02-23 kinaba: HINSTANCE hDLL = kiSUtil::loadLibrary( xtdll ); 13b7203622 2011-02-23 kinaba: if( hDLL ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: typedef bool (WINAPI * XT_IA)(); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_LS)(bool*,bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_SS)(bool,bool); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_AS)(bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_SSEX)(const char*,bool); 13b7203622 2011-02-23 kinaba: XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); 13b7203622 2011-02-23 kinaba: if( Init() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: XT_SS SaveSE = (XT_SS)::GetProcAddress( hDLL, "SaveSE" ); 13b7203622 2011-02-23 kinaba: XT_AS SaveAssoc = (XT_AS)::GetProcAddress( hDLL, "SaveAS" ); 13b7203622 2011-02-23 kinaba: XT_SSEX SaveASEx = (XT_SSEX)::GetProcAddress( hDLL, "SaveASEx" ); 13b7203622 2011-02-23 kinaba: SaveSE( m_assoc[13], m_assoc[14] ); 13b7203622 2011-02-23 kinaba: SaveASEx( "7z\0", m_assoc[12] ); 13b7203622 2011-02-23 kinaba: SaveAssoc( m_assoc ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: ::FreeLibrary( hDLL ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // ショートカット 13b7203622 2011-02-23 kinaba: ::CoInitialize( NULL ); 13b7203622 2011-02-23 kinaba: kiPath tmp(m_destdir); tmp += "Noah.exe"; 13b7203622 2011-02-23 kinaba: if( m_assoc[15] ) 13b7203622 2011-02-23 kinaba: createShortCut( tmp, kiPath(kiPath::Snd), "Noah" ); 13b7203622 2011-02-23 kinaba: if( m_assoc[16] ) 13b7203622 2011-02-23 kinaba: createShortCut( tmp, kiPath(kiPath::Dsk), "Noah" ); 13b7203622 2011-02-23 kinaba: if( m_assoc[17] ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiPath StartMenu( CSIDL_PROGRAMS ),rsrc; 13b7203622 2011-02-23 kinaba: StartMenu += "Noah\\"; 13b7203622 2011-02-23 kinaba: StartMenu.mkdir(); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: createShortCut( tmp, StartMenu, "Noah" ); 13b7203622 2011-02-23 kinaba: tmp = m_destdir, tmp += "caldix.exe"; 13b7203622 2011-02-23 kinaba: createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_CALDIX) ); 13b7203622 2011-02-23 kinaba: tmp = m_destdir, tmp += "manual.htm"; 13b7203622 2011-02-23 kinaba: createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_HELP) ); 13b7203622 2011-02-23 kinaba: tmp = m_destdir, tmp += "uninst.exe"; 13b7203622 2011-02-23 kinaba: createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_UNINSTALLER) ); 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: kiPath uninst( m_destdir ); 13b7203622 2011-02-23 kinaba: uninst += "uninst.exe"; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiRegKey key; 13b7203622 2011-02-23 kinaba: if( !key.create( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Noah", KEY_WRITE ) ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: key.set( "DisplayName", kiStr().loadRsrc(IDS_NOAH) ); 13b7203622 2011-02-23 kinaba: key.set( "UninstallString", uninst ); 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void do_caldix() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( IDYES==msgBox( kiStr(1000).loadRsrc(IDS_DLLINST),"Noah",MB_YESNO|MB_ICONQUESTION ) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiStr cld; 13b7203622 2011-02-23 kinaba: cld += '"'; 13b7203622 2011-02-23 kinaba: cld += m_destdir; 13b7203622 2011-02-23 kinaba: cld += "caldix.exe"; 13b7203622 2011-02-23 kinaba: cld += '"'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // プロセス開始 13b7203622 2011-02-23 kinaba: PROCESS_INFORMATION pi; 13b7203622 2011-02-23 kinaba: STARTUPINFO si; ki_memzero( &si,sizeof(si) ); si.cb=sizeof(si); 13b7203622 2011-02-23 kinaba: if( !::CreateProcess( NULL,const_cast<char*>((const char*)cld), 13b7203622 2011-02-23 kinaba: NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi ) ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 終了待機 13b7203622 2011-02-23 kinaba: ::CloseHandle( pi.hThread ); 13b7203622 2011-02-23 kinaba: ::WaitForSingleObject( pi.hProcess, INFINITE ); 13b7203622 2011-02-23 kinaba: ::CloseHandle( pi.hProcess ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool copy_dir2dir( kiPath& from, kiPath& to ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( !kiSUtil::isdir(from) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( ::CopyFile( from, to, FALSE ) ) 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: if( 0==ki_strcmpi( from.ext(), "dll" ) ) 13b7203622 2011-02-23 kinaba: return copy_later(from, to); 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: from += '\\', to += '\\', to.mkdir(); 13b7203622 2011-02-23 kinaba: if( !kiSUtil::isdir(to) ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiFindFile find; 13b7203622 2011-02-23 kinaba: WIN32_FIND_DATA fd; 13b7203622 2011-02-23 kinaba: kiPath src, dst, wild(from); wild+="\\*"; 13b7203622 2011-02-23 kinaba: for( find.begin( wild ); find.next(&fd); ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: src = from, src+='\\', src += fd.cFileName; 13b7203622 2011-02-23 kinaba: dst = to , dst+='\\', dst += fd.cFileName; 13b7203622 2011-02-23 kinaba: if( !copy_dir2dir( src, dst ) ) 13b7203622 2011-02-23 kinaba: return false; 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 getPrevPos( kiPath* path ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: *path = ""; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiRegKey key; 13b7203622 2011-02-23 kinaba: if( !key.open( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Noah", KEY_READ ) ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: key.get( "UninstallString", path ); 13b7203622 2011-02-23 kinaba: path->beDirOnly(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //-- アンインストール --------- 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef bool (WINAPI * XT_IA)(); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_LS)(bool*,bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_SS)(bool,bool); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_AS)(bool*); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_SAX)(const char*,bool); 13b7203622 2011-02-23 kinaba: typedef void (WINAPI * XT_LAX)(const char*,bool*); 13b7203622 2011-02-23 kinaba: bool unregist() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // NoahXt.dllによる処理 13b7203622 2011-02-23 kinaba: kiPath xtdll( m_destdir ); 13b7203622 2011-02-23 kinaba: xtdll += "NoahXt.dll"; 13b7203622 2011-02-23 kinaba: HINSTANCE hDLL = kiSUtil::loadLibrary( xtdll ); 13b7203622 2011-02-23 kinaba: if( hDLL ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); 13b7203622 2011-02-23 kinaba: if( Init() ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: XT_SAX SaveASEx = (XT_SAX)::GetProcAddress( hDLL, "SaveASEx" ); 13b7203622 2011-02-23 kinaba: XT_LAX LoadASEx = (XT_LAX)::GetProcAddress( hDLL, "LoadASEx" ); 13b7203622 2011-02-23 kinaba: unregist_b2e( SaveASEx, LoadASEx ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: XT_SS SaveSE = (XT_SS)::GetProcAddress( hDLL, "SaveSE" ); 13b7203622 2011-02-23 kinaba: XT_AS SaveAssoc = (XT_AS)::GetProcAddress( hDLL, "SaveAS" ); 13b7203622 2011-02-23 kinaba: SaveSE( m_assoc[13], m_assoc[14] ); 13b7203622 2011-02-23 kinaba: SaveAssoc( m_assoc ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: ::FreeLibrary( hDLL ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // ショートカット 13b7203622 2011-02-23 kinaba: ::CoInitialize( NULL ); 13b7203622 2011-02-23 kinaba: kiPath snd(kiPath::Snd); snd += "Noah.lnk"; 13b7203622 2011-02-23 kinaba: kiPath dsk(kiPath::Dsk); dsk += "Noah.lnk"; 13b7203622 2011-02-23 kinaba: kiPath stt(CSIDL_PROGRAMS); stt += "Noah"; 13b7203622 2011-02-23 kinaba: ::DeleteFile(snd), ::DeleteFile(dsk), stt.remove(); 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: static void crack_str( char* p ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: for( ; *p; p=kiStr::next(p) ) 13b7203622 2011-02-23 kinaba: if( *p=='.' ) 13b7203622 2011-02-23 kinaba: *p++ = '\0'; 13b7203622 2011-02-23 kinaba: *++p = '\0'; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void unregist_b2e( XT_SAX SaveASEx, XT_LAX LoadASEx ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char* first_dot; 13b7203622 2011-02-23 kinaba: kiFindFile f; 13b7203622 2011-02-23 kinaba: WIN32_FIND_DATA fd; 13b7203622 2011-02-23 kinaba: kiPath b2ewild(m_destdir); 13b7203622 2011-02-23 kinaba: b2ewild.beBackSlash(true); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: f.begin( b2ewild+="b2e\\*.b2e" ); 13b7203622 2011-02-23 kinaba: while( f.next(&fd) ) 13b7203622 2011-02-23 kinaba: if( fd.cFileName[0] != '#' ) // # 付きは圧縮専用 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // 拡張子を切り出し 13b7203622 2011-02-23 kinaba: ::CharLower( fd.cFileName ); 13b7203622 2011-02-23 kinaba: first_dot = const_cast<char*>(kiPath::ext_all(fd.cFileName)-1); 13b7203622 2011-02-23 kinaba: *first_dot = '\0'; 13b7203622 2011-02-23 kinaba: crack_str( fd.cFileName ); 13b7203622 2011-02-23 kinaba: // 関連づけ削除 13b7203622 2011-02-23 kinaba: SaveASEx( fd.cFileName, false ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: SaveASEx( "7z\0", false ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool remove() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ::SetCurrentDirectory( kiPath(kiPath::Exe) ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiPath tmp; 13b7203622 2011-02-23 kinaba: m_destdir.beBackSlash(true); 13b7203622 2011-02-23 kinaba: // インストールしたモノだけ全削除 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="Noah.exe", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="Noah.ini", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="uninst.exe", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="caldix.exe", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="caldix.ini", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="ReadMe.txt", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="manual.htm", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="html", tmp.remove(); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="b2e\\jak.b2e", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="b2e\\aboutb2e.txt",::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="b2e", ::RemoveDirectory(tmp); 13b7203622 2011-02-23 kinaba: tmp=m_destdir, tmp+="NoahXt.dll", ::DeleteFile(tmp); 13b7203622 2011-02-23 kinaba: ::RemoveDirectory(m_destdir); 13b7203622 2011-02-23 kinaba: // NoahXt.dllは再起動後に回すかも知れない 13b7203622 2011-02-23 kinaba: if( kiSUtil::exist(tmp) ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kill_later(tmp); 13b7203622 2011-02-23 kinaba: tmp.beDirOnly(); 13b7203622 2011-02-23 kinaba: tmp.beBackSlash(false); 13b7203622 2011-02-23 kinaba: kill_later(tmp); 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 kill_later( const char* pszFile ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: // "MoveFileEx Not Supported in Windows 95 But Functionality Is" 13b7203622 2011-02-23 kinaba: if( ::MoveFileEx( pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT ) ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: char shortPath[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ::GetShortPathName( pszFile, shortPath, sizeof(shortPath) ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiPath inifile( kiPath::Win ); inifile+="wininit.ini"; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: char buf[30000]; 13b7203622 2011-02-23 kinaba: ::GetPrivateProfileSection( "Rename", buf, 30000, inifile ); 13b7203622 2011-02-23 kinaba: char* p = buf; 13b7203622 2011-02-23 kinaba: while(*p)while(*p++); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::lstrcpy( p, "NUL=" ); 13b7203622 2011-02-23 kinaba: ::lstrcat( p, shortPath ); 13b7203622 2011-02-23 kinaba: while(*p++); 13b7203622 2011-02-23 kinaba: *p='\0'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::WritePrivateProfileSection( "Rename", buf, inifile ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 確実に書き込む 13b7203622 2011-02-23 kinaba: ::WritePrivateProfileString( NULL, NULL, NULL, inifile ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool copy_later( const char* from, const char* to ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: char from_temp[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ::lstrcpy( from_temp, to ); 13b7203622 2011-02-23 kinaba: ::lstrcat( from_temp, ".new" ); 13b7203622 2011-02-23 kinaba: if( !::CopyFile( from, from_temp, FALSE ) ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: char shortFrom[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ::GetShortPathName( from_temp, shortFrom, sizeof(shortFrom) ); 13b7203622 2011-02-23 kinaba: char shortTo[MAX_PATH]; 13b7203622 2011-02-23 kinaba: ::GetShortPathName( to, shortTo, sizeof(shortTo) ); 13b7203622 2011-02-23 kinaba: kiPath inifile( kiPath::Win ); inifile+="wininit.ini"; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: char buf[30000]; 13b7203622 2011-02-23 kinaba: ::GetPrivateProfileSection( "Rename", buf, 30000, inifile ); 13b7203622 2011-02-23 kinaba: char* p = buf; 13b7203622 2011-02-23 kinaba: while(*p)while(*p++); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::lstrcpy( p, "NUL=" ); 13b7203622 2011-02-23 kinaba: ::lstrcat( p, shortTo ); 13b7203622 2011-02-23 kinaba: while(*p++); 13b7203622 2011-02-23 kinaba: *p++='\r',*p++='\n'; 13b7203622 2011-02-23 kinaba: ::lstrcpy( p, shortTo ); 13b7203622 2011-02-23 kinaba: ::lstrcat( p, "=" ); 13b7203622 2011-02-23 kinaba: ::lstrcat( p, shortFrom ); 13b7203622 2011-02-23 kinaba: while(*p++); 13b7203622 2011-02-23 kinaba: *p='\0'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: ::WritePrivateProfileSection( "Rename", buf, inifile ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // 確実に書き込む 13b7203622 2011-02-23 kinaba: ::WritePrivateProfileString( NULL, NULL, NULL, inifile ); 13b7203622 2011-02-23 kinaba: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: }; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kilib_create_new_app() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: new CKInstApp; 13b7203622 2011-02-23 kinaba: }