File Annotation

Not logged in
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: }