File Annotation

Not logged in
13b7203622 2011-02-23        kinaba: // NoahXt.cpp
13b7203622 2011-02-23        kinaba: // -- all of 'NoahXt.dll' (ShellExtension && Configuration of Noah)
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #undef   WINVER
13b7203622 2011-02-23        kinaba: #define  WINVER   0x0400
13b7203622 2011-02-23        kinaba: #ifndef  STRICT
13b7203622 2011-02-23        kinaba: #define  STRICT
13b7203622 2011-02-23        kinaba: #endif
13b7203622 2011-02-23        kinaba: #define  INC_OLE2
13b7203622 2011-02-23        kinaba: #undef  _WIN32_IE
13b7203622 2011-02-23        kinaba: #define _WIN32_IE 0x0200
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #include <windows.h>
13b7203622 2011-02-23        kinaba: #include <windowsx.h>
13b7203622 2011-02-23        kinaba: #include <shlobj.h>
13b7203622 2011-02-23        kinaba: #include <lmaccess.h>
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: // カレントディレクトリを安全なところに移してLoadLibrary
13b7203622 2011-02-23        kinaba: static HMODULE safepathLoadLibrary(LPCTSTR lpFileName)
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	char original_cur[MAX_PATH], sys[MAX_PATH];
13b7203622 2011-02-23        kinaba: 	::GetCurrentDirectory(MAX_PATH, original_cur);
13b7203622 2011-02-23        kinaba: 	::GetSystemDirectory(sys, MAX_PATH);
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory(sys);
13b7203622 2011-02-23        kinaba: 	HMODULE han = ::LoadLibrary(lpFileName);
13b7203622 2011-02-23        kinaba: 	::SetCurrentDirectory(original_cur);
13b7203622 2011-02-23        kinaba: 	return han;
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-------------------------------------------------------
13b7203622 2011-02-23        kinaba: //-- Noah Config API ------------------------------------
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 WINAPI Init();
13b7203622 2011-02-23        kinaba: void WINAPI LoadSE( bool* a, bool* x );
13b7203622 2011-02-23        kinaba: void WINAPI SaveSE( bool a, bool x );
13b7203622 2011-02-23        kinaba: void WINAPI LoadAS( bool asso[] );
13b7203622 2011-02-23        kinaba: void WINAPI SaveAS( bool asso[] );
13b7203622 2011-02-23        kinaba: void WINAPI LoadASEx( const char* ext, bool* x );
13b7203622 2011-02-23        kinaba: void WINAPI SaveASEx( const char* ext, bool x );
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: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: char g_szNoah[MAX_PATH]; // Where is Noah ?
13b7203622 2011-02-23        kinaba: char  g_szDLL[MAX_PATH]; // What's my name ?
13b7203622 2011-02-23        kinaba: bool             g_bJpn; // am I in Japanese Mode ?
13b7203622 2011-02-23        kinaba: bool             g_isNT; // is Windows NT/2000 ?
13b7203622 2011-02-23        kinaba: int              g_cRef; // reference counter
13b7203622 2011-02-23        kinaba: bool         g_bChanged; // association changed ?
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: //-- GUID {953AFAE9-C2A9-4674-9811-D7E281B001E1} --------
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: static const GUID CLSID_NoahXt =
13b7203622 2011-02-23        kinaba: 	{ 0x953afae9, 0xc2a9, 0x4674, { 0x98, 0x11, 0xd7, 0xe2, 0x81, 0xb0, 0x1, 0xe1 } };
13b7203622 2011-02-23        kinaba: static const char* ProgID_NoahXt = "NoahXt";
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: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: class noahXt : public IContextMenu, IShellExtInit
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public:
13b7203622 2011-02-23        kinaba: 	noahXt()						{ m_szDir[0]=0; m_pDataObj=NULL; m_cRef=0L; g_cRef++; }
13b7203622 2011-02-23        kinaba: 	~noahXt()						{ if( m_pDataObj ) m_pDataObj->Release(); g_cRef--; }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) AddRef()	{ return (++m_cRef); }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) Release()	{ if( --m_cRef )return m_cRef; delete this; return 0L; }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			*ppv = NULL;
13b7203622 2011-02-23        kinaba: 			AddRef();
13b7203622 2011-02-23        kinaba: 			if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IShellExtInit ) )
13b7203622 2011-02-23        kinaba: 				*ppv = (IShellExtInit*)this;
13b7203622 2011-02-23        kinaba: 			else if( IsEqualIID( riid, IID_IContextMenu ) )
13b7203622 2011-02-23        kinaba: 				*ppv = (IContextMenu*)this;
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				Release();
13b7203622 2011-02-23        kinaba: 				return E_NOINTERFACE;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return NOERROR;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP Initialize( const ITEMIDLIST* pF, IDataObject* pD, HKEY )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			::SHGetPathFromIDList( pF, m_szDir );
13b7203622 2011-02-23        kinaba: 			if( m_pDataObj )m_pDataObj->Release();
13b7203622 2011-02-23        kinaba: 			if( pD )	(m_pDataObj=pD)->AddRef();
13b7203622 2011-02-23        kinaba: 			return NOERROR;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: #define CMPR_CMD_E ("Com&press Here")
13b7203622 2011-02-23        kinaba: #define EXTR_CMD_E ("E&xtract Here")
13b7203622 2011-02-23        kinaba: #define CMPR_CMD   (g_bJpn ? "ここに圧縮(&P)" : CMPR_CMD_E)
13b7203622 2011-02-23        kinaba: #define EXTR_CMD   (g_bJpn ? "ここに解凍(&X)" : EXTR_CMD_E)
13b7203622 2011-02-23        kinaba: #define CMPR_HLP   (g_bJpn ? "ファイルをNoahで圧縮します。" : "Compress These Files By Noah")
13b7203622 2011-02-23        kinaba: #define EXTR_HLP   (g_bJpn ? "ファイルをNoahで展開" : "Extract Files By Noah")
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	// 右クリックメニューへ追加
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP QueryContextMenu( HMENU h, UINT i, UINT id, UINT idLast, UINT flag )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( (flag&0x000F)!=CMF_NORMAL && !(flag&CMF_VERBSONLY) && !(flag&CMF_EXPLORE) )
13b7203622 2011-02-23        kinaba: 				return NOERROR;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			// レジストリから設定読み込み
13b7203622 2011-02-23        kinaba: 			// できれば、ここでm_bEXTに関しては拡張子判定を行いたいところ…(^^;
13b7203622 2011-02-23        kinaba: 			LoadSE( &m_bCMP, &m_bEXT );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			if( m_bCMP ) ::InsertMenu( h, i++, MF_STRING|MF_BYPOSITION, id++, CMPR_CMD );
13b7203622 2011-02-23        kinaba: 			if( m_bEXT ) ::InsertMenu( h, i++, MF_STRING|MF_BYPOSITION, id++, EXTR_CMD );
13b7203622 2011-02-23        kinaba: 			return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	// コマンド実行
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP InvokeCommand( LPCMINVOKECOMMANDINFO lpcmi )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( 0==HIWORD(lpcmi->lpVerb) )
13b7203622 2011-02-23        kinaba: 				switch( filter_cmd( LOWORD(lpcmi->lpVerb) ) )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 				case 0: return operation( "-a" );
13b7203622 2011-02-23        kinaba: 				case 1: return operation( "-x" );
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 			return E_INVALIDARG;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	// ヘルプ文字列など
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP GetCommandString( UINT cmd, UINT flag, UINT*, LPSTR pszName, UINT cchMax )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			cmd = filter_cmd( cmd );
13b7203622 2011-02-23        kinaba: 			if( cmd==2 )
13b7203622 2011-02-23        kinaba: 				return E_FAIL;
13b7203622 2011-02-23        kinaba: 			switch( flag )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 			case GCS_HELPTEXT:	::lstrcpyn( pszName, cmd==0 ? CMPR_HLP : EXTR_HLP, cchMax ); break;
13b7203622 2011-02-23        kinaba: 			case GCS_VERB:		::lstrcpyn( pszName, cmd==0 ? CMPR_CMD_E : EXTR_CMD_E, cchMax ); break;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return NOERROR;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	// コマンドIDを compress=0, melt=1, else=2 にフィルタリング
13b7203622 2011-02-23        kinaba: 	UINT filter_cmd( UINT i )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			if( m_bCMP )if( m_bEXT )return (i<=1 ? i : 2);
13b7203622 2011-02-23        kinaba: 						else		return (i==0 ? 0 : 2);
13b7203622 2011-02-23        kinaba: 			else		if( m_bEXT )return (i==0 ? 1 : 2);
13b7203622 2011-02-23        kinaba: 						else		return 2;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	// Noah.exeへ渡す処理 "Compress Here" or "Extract Here"
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP operation( const char* opt )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			STGMEDIUM md;
13b7203622 2011-02-23        kinaba: 			FORMATETC fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
13b7203622 2011-02-23        kinaba: 			if( SUCCEEDED( m_pDataObj->GetData( &fe, &md ) ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				const HDROP& hDrop = (HDROP)md.hGlobal;
13b7203622 2011-02-23        kinaba: 				const int num = ::DragQueryFile( hDrop, 0xffffffff, NULL, 0 );
13b7203622 2011-02-23        kinaba: 				if( num )
13b7203622 2011-02-23        kinaba: 				{
13b7203622 2011-02-23        kinaba: 					// main command
13b7203622 2011-02-23        kinaba: 					char* cmd = new char[10 + MAX_PATH * (num+2)];
13b7203622 2011-02-23        kinaba: 					::lstrcpy( cmd, g_szNoah );
13b7203622 2011-02-23        kinaba: 					::lstrcat( cmd, " " );
13b7203622 2011-02-23        kinaba: 					::lstrcat( cmd, opt );
13b7203622 2011-02-23        kinaba: 					// destdir
13b7203622 2011-02-23        kinaba: 					::lstrcat( cmd, " \"-D" );
13b7203622 2011-02-23        kinaba: 					::lstrcat( cmd, m_szDir );
13b7203622 2011-02-23        kinaba: 					::lstrcat( cmd, "\"" );
13b7203622 2011-02-23        kinaba: 					// filelist
13b7203622 2011-02-23        kinaba: 					char str[MAX_PATH];
13b7203622 2011-02-23        kinaba: 					for( int i=0; i!=num; i++ )
13b7203622 2011-02-23        kinaba: 					{
13b7203622 2011-02-23        kinaba: 						::DragQueryFile( hDrop, i, str, sizeof(str) );
13b7203622 2011-02-23        kinaba: 						::lstrcat( cmd, " \"" );
13b7203622 2011-02-23        kinaba: 						::lstrcat( cmd, str );
13b7203622 2011-02-23        kinaba: 						::lstrcat( cmd, "\"" );
13b7203622 2011-02-23        kinaba: 					}
13b7203622 2011-02-23        kinaba: 					// call 'Noah'
13b7203622 2011-02-23        kinaba: 					::WinExec( cmd, SW_SHOWDEFAULT );
13b7203622 2011-02-23        kinaba: 					delete [] cmd;
13b7203622 2011-02-23        kinaba: 				}
13b7203622 2011-02-23        kinaba: 				::ReleaseStgMedium( &md );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			return NOERROR;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	ULONG        m_cRef;
13b7203622 2011-02-23        kinaba: 	IDataObject* m_pDataObj;
13b7203622 2011-02-23        kinaba: 	char		 m_szDir[MAX_PATH];
13b7203622 2011-02-23        kinaba: 	bool         m_bCMP, m_bEXT;
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 noahXtClassFactory : public IClassFactory
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public:
13b7203622 2011-02-23        kinaba: 	noahXtClassFactory()			{ m_cRef = 0L; g_cRef++; }
13b7203622 2011-02-23        kinaba: 	~noahXtClassFactory()			{ g_cRef--; }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) AddRef()	{ return (++m_cRef); }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP_(ULONG) Release()	{ if( --m_cRef )return m_cRef; delete this; return 0L; }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP LockServer( BOOL )	{ return NOERROR; }
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP QueryInterface( REFIID riid, void** ppv )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			*ppv = NULL;
13b7203622 2011-02-23        kinaba: 			AddRef();
13b7203622 2011-02-23        kinaba: 			if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IClassFactory ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				*ppv = (IClassFactory*)this;
13b7203622 2011-02-23        kinaba: 				return NOERROR;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			Release();
13b7203622 2011-02-23        kinaba: 			return E_NOINTERFACE;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	STDMETHODIMP CreateInstance( IUnknown* pOuter, REFIID riid, void** ppvObj )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			*ppvObj = NULL;
13b7203622 2011-02-23        kinaba: 			if( pOuter )
13b7203622 2011-02-23        kinaba: 				return CLASS_E_NOAGGREGATION;
13b7203622 2011-02-23        kinaba: 			noahXt* pXt = new noahXt;
13b7203622 2011-02-23        kinaba: 			return pXt ? pXt->QueryInterface( riid, ppvObj ) : E_OUTOFMEMORY;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	ULONG m_cRef;
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- システム向けAPI ---------------------------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: extern "C" int APIENTRY
13b7203622 2011-02-23        kinaba: DllMain( HINSTANCE inst, DWORD why, LPVOID reserved )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( why==DLL_PROCESS_ATTACH )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		::GetModuleFileName( inst, g_szDLL, sizeof(g_szDLL) );
13b7203622 2011-02-23        kinaba: 		::lstrcpy( g_szNoah, g_szDLL );
13b7203622 2011-02-23        kinaba: 		for( char *p=g_szNoah,*y=g_szNoah-1; *p; p=::CharNext(p) )
13b7203622 2011-02-23        kinaba: 			if( *p=='\\' )
13b7203622 2011-02-23        kinaba: 				y=p;
13b7203622 2011-02-23        kinaba: 		::lstrcpy( y+1, "Noah.exe" );
13b7203622 2011-02-23        kinaba: 		::GetShortPathName( g_szNoah, g_szNoah, MAX_PATH );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		OSVERSIONINFO osVer;
13b7203622 2011-02-23        kinaba: 		osVer.dwOSVersionInfoSize = sizeof(osVer);
13b7203622 2011-02-23        kinaba: 		::GetVersionEx( &osVer );
13b7203622 2011-02-23        kinaba: 		g_isNT = ( osVer.dwPlatformId == VER_PLATFORM_WIN32_NT );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		g_bJpn = (::GetUserDefaultLangID()==0x0411);
13b7203622 2011-02-23        kinaba: 		g_cRef = 0;
13b7203622 2011-02-23        kinaba: 		g_bChanged = false;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else if( why==DLL_PROCESS_DETACH )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( g_bChanged )
13b7203622 2011-02-23        kinaba: 			::SHChangeNotify( SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL );
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: STDAPI DllCanUnloadNow()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba:     return ( g_cRef==0 ? S_OK : S_FALSE );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppvOut )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	*ppvOut = NULL;
13b7203622 2011-02-23        kinaba: 	if( IsEqualIID( rclsid, CLSID_NoahXt ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		noahXtClassFactory* p = new noahXtClassFactory;
13b7203622 2011-02-23        kinaba: 		return p->QueryInterface( riid, ppvOut );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	return CLASS_E_CLASSNOTAVAILABLE;
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: //--------------------------------------------------------
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //-- kiRegKey from K.I.LIB -------------------------//
13b7203622 2011-02-23        kinaba: //------ 'not using kiStr && REG_SZ only' version --//
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: class kiRegKey
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: public:
13b7203622 2011-02-23        kinaba: 	kiRegKey()
13b7203622 2011-02-23        kinaba: 		{ m_hKey = NULL; }
13b7203622 2011-02-23        kinaba: 	~kiRegKey()
13b7203622 2011-02-23        kinaba: 		{ close(); }
13b7203622 2011-02-23        kinaba: 	operator HKEY() const
13b7203622 2011-02-23        kinaba: 		{ return m_hKey; }
13b7203622 2011-02-23        kinaba: 	bool open( HKEY parent, LPCTSTR keyname, REGSAM access )
13b7203622 2011-02-23        kinaba: 		{ close(); return (ERROR_SUCCESS == ::RegOpenKeyEx( parent, keyname, 0, access, &m_hKey )); }
13b7203622 2011-02-23        kinaba: 	bool create( HKEY parent, LPCTSTR keyname, REGSAM access )
13b7203622 2011-02-23        kinaba: 		{ close(); DWORD x; return (ERROR_SUCCESS == ::RegCreateKeyEx( parent, keyname, 0, REG_NONE, REG_OPTION_NON_VOLATILE, access, NULL, &m_hKey, &x )); }
13b7203622 2011-02-23        kinaba: 	void close()
13b7203622 2011-02-23        kinaba: 		{ if( m_hKey ) ::RegCloseKey( m_hKey ); }
13b7203622 2011-02-23        kinaba: 	static bool exist( HKEY parent, LPCTSTR keyname )
13b7203622 2011-02-23        kinaba: 		{ HKEY k; if( ERROR_SUCCESS!=::RegOpenKeyEx( parent,keyname,0,KEY_READ,&k ) ) return false; ::RegCloseKey( k ); return true; }
13b7203622 2011-02-23        kinaba: 	bool set( LPCTSTR valname, LPCTSTR val )
13b7203622 2011-02-23        kinaba: 		{ return (ERROR_SUCCESS == ::RegSetValueEx( m_hKey, valname, 0, REG_SZ, (BYTE*)val, ::lstrlen(val)+1 )); }
13b7203622 2011-02-23        kinaba: 	bool get( LPCTSTR valname, char* val, DWORD siz )
13b7203622 2011-02-23        kinaba: 		{ return ( ERROR_SUCCESS == RegQueryValueEx( m_hKey, valname, NULL, NULL, (BYTE*)val, &siz )); }
13b7203622 2011-02-23        kinaba: 	bool del( LPCTSTR valname )
13b7203622 2011-02-23        kinaba: 		{ return (ERROR_SUCCESS == RegDeleteValue( m_hKey, valname )); }
13b7203622 2011-02-23        kinaba: 	static void delSubKey( HKEY k, LPCTSTR n )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		if( !g_isNT )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			::RegDeleteKey( k, n );
13b7203622 2011-02-23        kinaba: 			return;
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// NT系では、サブキーのあるキーは消せないので再帰的に。
13b7203622 2011-02-23        kinaba: 		// しかもEnum中にDeleteはできない上にvector<string>等も
13b7203622 2011-02-23        kinaba: 		// 封印しているためわけのわからんコードになってます。
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// 消したいキーを開く
13b7203622 2011-02-23        kinaba: 		HKEY k2;
13b7203622 2011-02-23        kinaba: 		while( ERROR_SUCCESS == ::RegOpenKeyEx( k,n,0,KEY_ENUMERATE_SUB_KEYS|KEY_SET_VALUE,&k2 ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			// 1個目の子キー名を取得
13b7203622 2011-02-23        kinaba: 			char buf[200];
13b7203622 2011-02-23        kinaba: 			DWORD bs = sizeof(buf);
13b7203622 2011-02-23        kinaba: 			if( ERROR_SUCCESS == ::RegEnumKeyEx( k2,0,buf,&bs,NULL,NULL,NULL,NULL ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// あればそれを削除
13b7203622 2011-02-23        kinaba: 				delSubKey( k2, buf );
13b7203622 2011-02-23        kinaba: 				::RegCloseKey( k2 );
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 			else
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				// なければ、消したいキーを消せる
13b7203622 2011-02-23        kinaba: 				::RegCloseKey( k2 );
13b7203622 2011-02-23        kinaba: 				::RegDeleteKey( k, n );
13b7203622 2011-02-23        kinaba: 				return;
13b7203622 2011-02-23        kinaba: 			}
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: private:
13b7203622 2011-02-23        kinaba: 	HKEY m_hKey;
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: //-- Noahの設定用APIなど ----------------------------------
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: char g_szAsCmd[MAX_PATH+10];
13b7203622 2011-02-23        kinaba: char g_szAsIcon[MAX_PATH+10];
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: // 管理者権限判別
13b7203622 2011-02-23        kinaba: //-- IsAdmin() : very very thanks! to ardry, the author of 'meltice'.
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool IsAdmin()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	bool isadmin=false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 9x対策のため、動的にDLLロード
13b7203622 2011-02-23        kinaba: 	HINSTANCE hInstDll = safepathLoadLibrary( "NetAPI32" );
13b7203622 2011-02-23        kinaba: 	if( !hInstDll )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- NetUserGetLocalGroupes API 取得
13b7203622 2011-02-23        kinaba: 	typedef NET_API_STATUS (NET_API_FUNCTION *PNETUSRGETLCLGRP)(LPCWSTR,wchar_t *,DWORD,DWORD,VOID*,DWORD,LPDWORD,LPDWORD);
13b7203622 2011-02-23        kinaba: 	PNETUSRGETLCLGRP pNetUserGetLocalGroups = (PNETUSRGETLCLGRP)::GetProcAddress(hInstDll, "NetUserGetLocalGroups");
13b7203622 2011-02-23        kinaba: 	if( !pNetUserGetLocalGroups )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		::FreeLibrary( hInstDll );
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- ユーザー名取得
13b7203622 2011-02-23        kinaba: 	char    userA[256];
13b7203622 2011-02-23        kinaba: 	wchar_t userW[256];
13b7203622 2011-02-23        kinaba: 	DWORD   tmp = 256;
13b7203622 2011-02-23        kinaba: 	::GetUserName( userA, &tmp );
13b7203622 2011-02-23        kinaba: 	::MultiByteToWideChar( CP_ACP, 0, userA, -1, userW, 255 );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- 本筋
13b7203622 2011-02-23        kinaba: 	LOCALGROUP_USERS_INFO_0* pBuf;
13b7203622 2011-02-23        kinaba: 	DWORD entry;
13b7203622 2011-02-23        kinaba: 	char buf[256];
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( 0 == pNetUserGetLocalGroups(NULL,userW,0,0,(BYTE**)&pBuf,-1,&entry,&tmp) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		for( unsigned int i=0; i<entry; i++ )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			::WideCharToMultiByte( CP_ACP, 0, pBuf[i].lgrui0_name, -1, buf, 256, NULL, NULL );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 			if( 0 == ::lstrcmp( buf, "Administrators" ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				isadmin=true;
13b7203622 2011-02-23        kinaba: 				break;
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 NET_API_STATUS (NET_API_FUNCTION * PNETAPIBUFFERFREE)(void*);
13b7203622 2011-02-23        kinaba: 		PNETAPIBUFFERFREE pNetApiBufferFree = (PNETAPIBUFFERFREE)::GetProcAddress( hInstDll, "NetApiBufferFree" );
13b7203622 2011-02-23        kinaba: 		if( pNetApiBufferFree )
13b7203622 2011-02-23        kinaba: 			pNetApiBufferFree( pBuf );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- DLL解放
13b7203622 2011-02-23        kinaba: 	::FreeLibrary( hInstDll );
13b7203622 2011-02-23        kinaba: 	return isadmin;
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 IsRegWritable()
13b7203622 2011-02-23        kinaba: //{
13b7203622 2011-02-23        kinaba: //	HKEY key;
13b7203622 2011-02-23        kinaba: //	if( ERROR_SUCCESS != // 適当なクラスキーへの書き込み権限を調べる
13b7203622 2011-02-23        kinaba: //		::RegOpenKeyEx( HKEY_CLASSES_ROOT, "ttffile", 0, KEY_WRITE, &key ) )
13b7203622 2011-02-23        kinaba: //		return false;
13b7203622 2011-02-23        kinaba: //	::RegCloseKey( key );
13b7203622 2011-02-23        kinaba: //	return true;
13b7203622 2011-02-23        kinaba: //}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** bool Init()
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   設定画面用に起動するときは最初にコレを呼ぶこと。
13b7203622 2011-02-23        kinaba: //**   false が返ってきたときは、諸事情により利用できないことを示す。
13b7203622 2011-02-23        kinaba: bool WINAPI Init()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	::wsprintf( g_szAsIcon, "%s,%%d", g_szDLL );
13b7203622 2011-02-23        kinaba: 	::wsprintf( g_szAsCmd , "%s -x \"%%1\"", g_szNoah );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( g_isNT )
13b7203622 2011-02-23        kinaba: 		if( !IsAdmin() )
13b7203622 2011-02-23        kinaba: //			if( !IsRegWritable() )
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 LoadSE( bool* a, bool* x )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   シェルエクステンションの設定を返す。
13b7203622 2011-02-23        kinaba: //**   a: [ここに圧縮]がONか否か  x: [ここに解凍]がONか否か
13b7203622 2011-02-23        kinaba: void WINAPI LoadSE( bool* a, bool* x )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	*a = kiRegKey::exist( HKEY_CLASSES_ROOT, "CLSID\\{953AFAE9-C2A9-4674-9811-D7E281B001E1}\\CShl" );
13b7203622 2011-02-23        kinaba: 	*x = kiRegKey::exist( HKEY_CLASSES_ROOT, "CLSID\\{953AFAE9-C2A9-4674-9811-D7E281B001E1}\\MShl" );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** void SaveSE( bool a, bool x )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   シェルエクステンションの設定を保存する。
13b7203622 2011-02-23        kinaba: //**   a: [ここに圧縮]がONか否か  x: [ここに解凍]がONか否か
13b7203622 2011-02-23        kinaba: void WINAPI SaveSE( bool a, bool x )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	kiRegKey key, key2;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( !a && !x )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiRegKey::delSubKey( HKEY_CLASSES_ROOT, "CLSID\\{953AFAE9-C2A9-4674-9811-D7E281B001E1}" );
13b7203622 2011-02-23        kinaba: 		kiRegKey::delSubKey( HKEY_CLASSES_ROOT, "Folder\\shellex\\DragDropHandlers\\NoahXt" );
13b7203622 2011-02-23        kinaba: 		kiRegKey::delSubKey( HKEY_CLASSES_ROOT, "Drive\\shellex\\DragDropHandlers\\NoahXt" );
13b7203622 2011-02-23        kinaba: 		if( key.open( HKEY_CLASSES_ROOT, "Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", KEY_SET_VALUE ) )
13b7203622 2011-02-23        kinaba: 			key.del( "{953AFAE9-C2A9-4674-9811-D7E281B001E1}" );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 	else
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		// CLSID 登録
13b7203622 2011-02-23        kinaba: 		key.create( HKEY_CLASSES_ROOT, "CLSID\\{953AFAE9-C2A9-4674-9811-D7E281B001E1}", KEY_WRITE );
13b7203622 2011-02-23        kinaba: 			key.set( "", ProgID_NoahXt );
13b7203622 2011-02-23        kinaba: 			key2.create( key, "InprocServer32", KEY_WRITE );
13b7203622 2011-02-23        kinaba: 				key2.set( "", g_szDLL );
13b7203622 2011-02-23        kinaba: 				key2.set( "ThreadingModel", "Apartment" );
13b7203622 2011-02-23        kinaba: 		if(a)key2.create( key, "CShl", KEY_READ );
13b7203622 2011-02-23        kinaba: 		else kiRegKey::delSubKey( key, "CShl" );
13b7203622 2011-02-23        kinaba: 		if(x)key2.create( key, "MShl", KEY_READ );
13b7203622 2011-02-23        kinaba: 		else kiRegKey::delSubKey( key, "MShl" );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// Folder の DnD Handler として登録
13b7203622 2011-02-23        kinaba: 		key.create( HKEY_CLASSES_ROOT, "Folder\\shellex\\DragDropHandlers\\NoahXt", KEY_WRITE );
13b7203622 2011-02-23        kinaba: 			key.set( "", "{953AFAE9-C2A9-4674-9811-D7E281B001E1}" );
13b7203622 2011-02-23        kinaba: 		// Drive の DnD Handler として登録
13b7203622 2011-02-23        kinaba: 		key.create( HKEY_CLASSES_ROOT, "Drive\\shellex\\DragDropHandlers\\NoahXt", KEY_WRITE );
13b7203622 2011-02-23        kinaba: 			key.set( "", "{953AFAE9-C2A9-4674-9811-D7E281B001E1}" );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		// NT系用に、Approved List に書いておく
13b7203622 2011-02-23        kinaba: 		if( g_isNT && key.open( HKEY_CLASSES_ROOT, "Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved", KEY_SET_VALUE ) )
13b7203622 2011-02-23        kinaba: 			key.set( "{953AFAE9-C2A9-4674-9811-D7E281B001E1}", ProgID_NoahXt );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void asso_on( const char* ext, const int no );
13b7203622 2011-02-23        kinaba: void asso_off( const char* ext, const int no );
13b7203622 2011-02-23        kinaba: bool is_asso_on( const char* ext );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: enum { A_BEGIN, LZH=0, ZIP, CAB, RAR, TAR, YZ1, GCA, ARJ, BGA, ACE, CPT, JAK, A_END,
13b7203622 2011-02-23        kinaba:        OTH=A_END, SvnZ=CPT };
13b7203622 2011-02-23        kinaba: static const char* ext_list[] = {
13b7203622 2011-02-23        kinaba: 	"lzh\0lzs\0lha\0",
13b7203622 2011-02-23        kinaba: 	"zip\0",
13b7203622 2011-02-23        kinaba: 	"cab\0",
13b7203622 2011-02-23        kinaba: 	"rar\0",
13b7203622 2011-02-23        kinaba: 	"tar\0tgz\0tbz\0taz\0gz\0bz2\0z\0xz\0lzma\0",
13b7203622 2011-02-23        kinaba: 	"yz1\0",
13b7203622 2011-02-23        kinaba: 	"gca\0",
13b7203622 2011-02-23        kinaba: 	"arj\0",
13b7203622 2011-02-23        kinaba: 	"gza\0bza\0",
13b7203622 2011-02-23        kinaba: 	"ace\0",
13b7203622 2011-02-23        kinaba: 	"cpt\0",
13b7203622 2011-02-23        kinaba: 	"jak\0",
13b7203622 2011-02-23        kinaba: };
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** void LoadAS( bool asso[] )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   標準の関連付けの設定を返す。
13b7203622 2011-02-23        kinaba: //**   LZH=0, ZIP, CAB, RAR, TAR, YZ1, GCA, ARJ, BGA, ACE, CPT, JAK
13b7203622 2011-02-23        kinaba: void WINAPI LoadAS( bool asso[] )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	for( int i=A_BEGIN; i<A_END; i++ )
13b7203622 2011-02-23        kinaba: 		asso[i] = is_asso_on( ext_list[i] );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** void SaveAS( bool asso[] )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   標準の関連付けの設定を保存。
13b7203622 2011-02-23        kinaba: //**   LZH=0, ZIP, CAB, RAR, TAR, YZ1, GCA, ARJ, BGA, ACE, CPT, JAK
13b7203622 2011-02-23        kinaba: void WINAPI SaveAS( bool asso[] )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	for( int i=A_BEGIN; i<A_END; i++ )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		int icon_type = i;
13b7203622 2011-02-23        kinaba: 		if( i==CPT ) icon_type = OTH; // v3.195: cptは、"その他"アイコン
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( asso[i] )
13b7203622 2011-02-23        kinaba: 			asso_on( ext_list[i], icon_type );
13b7203622 2011-02-23        kinaba: 		else
13b7203622 2011-02-23        kinaba: 			asso_off( ext_list[i], icon_type );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** void LoadASEx( const char* ext, bool* x )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   指定した拡張子がNoahに関連付けられているかどうかを返す
13b7203622 2011-02-23        kinaba: void WINAPI LoadASEx( const char* ext, bool* x )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	*x = is_asso_on( ext );
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: //** void SaveASEx( const char* ext, bool x )
13b7203622 2011-02-23        kinaba: //**
13b7203622 2011-02-23        kinaba: //**   指定した拡張子をNoahに関連付けたり解除したり
13b7203622 2011-02-23        kinaba: void WINAPI SaveASEx( const char* ext, bool x )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	int icon_type = OTH;                         // デフォルトは"その他"アイコン
13b7203622 2011-02-23        kinaba: 	if( 0==lstrcmp(ext,"7z") ) icon_type = SvnZ; // v3.195: 7zに限り、7z専用アイコン
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( x )	asso_on(  ext, icon_type );
13b7203622 2011-02-23        kinaba: 	else	asso_off( ext, icon_type );
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: #define step(_x)    (_x+=::lstrlen(_x)+1)
13b7203622 2011-02-23        kinaba: #define MltCmd      (g_bJpn ? "解凍(&E)" : "&Extract")
13b7203622 2011-02-23        kinaba: #define JntCmd      (g_bJpn ? "結合(&E)" : "Combin&e")
13b7203622 2011-02-23        kinaba: #define MltTyp      (g_bJpn ? "書庫(%s)" : "Archive(%s)")
13b7203622 2011-02-23        kinaba: #define JntTyp      (g_bJpn ? "分割ファイル(%s)" : "RipperedFile(%s)")
13b7203622 2011-02-23        kinaba: #define CmdName(_n) (_n==JAK ? JntCmd : MltCmd)
13b7203622 2011-02-23        kinaba: #define TypName(_n) (_n==JAK ? JntTyp : MltTyp)
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: static void recover_zip()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( kiRegKey::exist( HKEY_CLASSES_ROOT, "CompressedFolder" ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiRegKey key, key2;
13b7203622 2011-02-23        kinaba: 		if( key.create( HKEY_CLASSES_ROOT, ".zip", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			key.set( "", "CompressedFolder" );
13b7203622 2011-02-23        kinaba: 			if( key2.create( key, "ShellNew", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 				key2.set( "NullFIle", "" );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: static void recover_cab()
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( kiRegKey::exist( HKEY_CLASSES_ROOT, "CLSID\\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}" ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		kiRegKey key;
13b7203622 2011-02-23        kinaba: 		if( key.create( HKEY_CLASSES_ROOT, ".cab", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 			key.set( "", "CLSID\\{0CD7A5C0-9F37-11CE-AE65-08002B2E1262}" );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: void asso_on( const char* ext, const int no )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( is_asso_on( ext ) )
13b7203622 2011-02-23        kinaba: 		return;
13b7203622 2011-02-23        kinaba: 	g_bChanged = true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	kiRegKey key, key2, key3, key4;
13b7203622 2011-02-23        kinaba: 	char str[500],asc[20]="NoahXt.";
13b7203622 2011-02-23        kinaba: 	::lstrcpy( asc+7, ext );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	for( const char* p=ext; *p; step(p) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		//-- "HKCR/.lzh" = "NoahXt.lzh", "HKCR/.lzs" = "NoahXt.lzh" ...
13b7203622 2011-02-23        kinaba: 		str[0]='.', ::lstrcpy( str+1, p );
13b7203622 2011-02-23        kinaba: 		if( key.create( HKEY_CLASSES_ROOT, str, KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			key.set( "", asc );
13b7203622 2011-02-23        kinaba: 			kiRegKey::delSubKey( key, "ShellNew" );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	if( key.create( HKEY_CLASSES_ROOT, asc, KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		//-- "HKCR/NoahXt.lzh" = "書庫( lzh )"
13b7203622 2011-02-23        kinaba: 		::wsprintf( str, TypName(no), ext );
13b7203622 2011-02-23        kinaba: 		key.set( "", str );
13b7203622 2011-02-23        kinaba: 		key.del( "EditFlags" );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( key2.create( key, "DefaultIcon", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			//-- "HKCR/NoahXt.lzh/DefaultIcon" = "...Noah.exe, 1"
13b7203622 2011-02-23        kinaba: 			::wsprintf( str, g_szAsIcon, no );
13b7203622 2011-02-23        kinaba: 			key2.set( "", str );
13b7203622 2011-02-23        kinaba: 		}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 		if( key2.create( key, "Shell", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 		{
13b7203622 2011-02-23        kinaba: 			//-- "HKCR/NoahXt.lzh/Shell" = "Open"
13b7203622 2011-02-23        kinaba: 			key2.set( "", "Open" );
13b7203622 2011-02-23        kinaba: 			if( key3.create( key2, "Open", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 			{
13b7203622 2011-02-23        kinaba: 				//--  "HKCR/NoahXt.lzh/Shell/Open" = "解凍(&X)"
13b7203622 2011-02-23        kinaba: 				key3.set( "", CmdName(no) );
13b7203622 2011-02-23        kinaba: 				if( key4.create( key3, "Command", KEY_WRITE ) )
13b7203622 2011-02-23        kinaba: 					//--  "HKCR/NoahXt.lzh/Shell/Open/Command" = "...Noah.exe -x "%1""
13b7203622 2011-02-23        kinaba: 					key4.set( "", g_szAsCmd );
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: void asso_off( const char* ext, const int no )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	if( !is_asso_on( ext ) )
13b7203622 2011-02-23        kinaba: 		return;
13b7203622 2011-02-23        kinaba: 	g_bChanged = true;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- delete "HKCR/NoahXt.lzh"
13b7203622 2011-02-23        kinaba: 	char str[20] = "NoahXt.";
13b7203622 2011-02-23        kinaba: 	::lstrcpy( str+7, ext );
13b7203622 2011-02-23        kinaba: 	kiRegKey::delSubKey( HKEY_CLASSES_ROOT, str );
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- delete "HKCR/.lzh" "HKCR/.lzs" ...
13b7203622 2011-02-23        kinaba: 	for( const char* p=ext; *p; step(p) )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 		str[0]='.', ::lstrcpy( str+1, p );
13b7203622 2011-02-23        kinaba: 		kiRegKey::delSubKey( HKEY_CLASSES_ROOT, str );
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	switch( no )
13b7203622 2011-02-23        kinaba: 	{
13b7203622 2011-02-23        kinaba: 	// CAB, ZIP to Windows Default Association
13b7203622 2011-02-23        kinaba: 	case CAB: recover_cab(); break;
13b7203622 2011-02-23        kinaba: 	case ZIP: recover_zip(); break;
13b7203622 2011-02-23        kinaba: 	}
13b7203622 2011-02-23        kinaba: }
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: bool is_asso_on( const char* ext )
13b7203622 2011-02-23        kinaba: {
13b7203622 2011-02-23        kinaba: 	//-- "HKCR/.lzh" exists ?
13b7203622 2011-02-23        kinaba: 	char str[20] = ".";
13b7203622 2011-02-23        kinaba: 	::lstrcpy( str+1, ext );
13b7203622 2011-02-23        kinaba: 	kiRegKey key;
13b7203622 2011-02-23        kinaba: 	if( !key.open( HKEY_CLASSES_ROOT, str, KEY_READ ) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 	if( !key.get( "", str, 20 ) )
13b7203622 2011-02-23        kinaba: 		return false;
13b7203622 2011-02-23        kinaba: 
13b7203622 2011-02-23        kinaba: 	//-- the value of "HKCR/.lzh" is "NoahXt.lzh" ?
13b7203622 2011-02-23        kinaba: 	char asc[20] = "NoahXt.";
13b7203622 2011-02-23        kinaba: 	::lstrcpy( asc+7, ext );
13b7203622 2011-02-23        kinaba: 	return ( 0==::lstrcmp( str, asc ) );
13b7203622 2011-02-23        kinaba: }