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: }