13b7203622 2011-02-23 kinaba: //--- K.I.LIB --- 13b7203622 2011-02-23 kinaba: // kl_carc.cpp : handling "common archivers' dll" 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: #include "stdafx.h" 13b7203622 2011-02-23 kinaba: #include "kilibext.h" 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: //------------------------ load/unload 制御 ----------------------// 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiArcDLLRaw::kiArcDLLRaw( const char* dllname ) 13b7203622 2011-02-23 kinaba: : m_DllPath( dllname ), not_loaded_yet( true ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ki_memzero( m_Proc, ISARC_FUNCTION_END*sizeof(FARPROC) ); 13b7203622 2011-02-23 kinaba: f_VSb = NULL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: kiArcDLLRaw::~kiArcDLLRaw() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: unload(); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiArcDLLRaw::load() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: not_loaded_yet = false; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: m_hDLL = kiSUtil::loadLibrary( m_DllPath ); 13b7203622 2011-02-23 kinaba: if( !m_hDLL ) 13b7203622 2011-02-23 kinaba: return false; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // DLLの名前部分を切り出し 13b7203622 2011-02-23 kinaba: char str[MAX_PATH], *p; 13b7203622 2011-02-23 kinaba: const char *x, *y, *z; 13b7203622 2011-02-23 kinaba: for( x=y=m_DllPath; *x!='\0'; x=kiStr::next(x) ) 13b7203622 2011-02-23 kinaba: if( *x=='\\' || *x=='/' ) 13b7203622 2011-02-23 kinaba: y = x + 1; 13b7203622 2011-02-23 kinaba: for( p=str, z=y; (*z!='.' && *z!='3' && *z!='\0'); p++, z++ ) 13b7203622 2011-02-23 kinaba: *p = *z; 13b7203622 2011-02-23 kinaba: *p = '\0'; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // コマンド送りAPIを取得。ccで始まるAPI名かも? 13b7203622 2011-02-23 kinaba: f_Cmd = ::GetProcAddress( m_hDLL, str ); 13b7203622 2011-02-23 kinaba: if( f_Cmd ) 13b7203622 2011-02-23 kinaba: m_DllNameBody = str; 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: f_Cmd = ::GetProcAddress( m_hDLL, "ccCommand" ); 13b7203622 2011-02-23 kinaba: if( f_Cmd ) 13b7203622 2011-02-23 kinaba: m_DllNameBody = "cc"; 13b7203622 2011-02-23 kinaba: else 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( str[0]=='7' && (f_Cmd=::GetProcAddress(m_hDLL,"SevenZip")) ) 13b7203622 2011-02-23 kinaba: m_DllNameBody = "SevenZip"; 13b7203622 2011-02-23 kinaba: else 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: return true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiArcDLLRaw::unload() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( !not_loaded_yet && m_hDLL ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: ki_memzero( m_Proc, ISARC_FUNCTION_END*sizeof(FARPROC) ); 13b7203622 2011-02-23 kinaba: ::FreeLibrary( m_hDLL ); 13b7203622 2011-02-23 kinaba: not_loaded_yet = true; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: bool kiArcDLLRaw::isAlive() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: load(); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: return (m_hDLL != NULL); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: FARPROC kiArcDLLRaw::getProc( const char* procname ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: kiStr funcName = (const char*)m_DllNameBody; 13b7203622 2011-02-23 kinaba: funcName += procname; 13b7203622 2011-02-23 kinaba: return ::GetProcAddress( m_hDLL, funcName ); 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: 13b7203622 2011-02-23 kinaba: int kiArcDLLRaw::command( const HWND wnd, LPCSTR cmd, LPSTR buf, const DWORD siz ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: // コマンド関数は必ずロードされている 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef int (WINAPI * CARC_CMD)(const HWND,const char*,char*,const DWORD); 13b7203622 2011-02-23 kinaba: return ((CARC_CMD)f_Cmd)( wnd, cmd, buf, siz ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: WORD kiArcDLLRaw::getVer() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return 0; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Ver ) 13b7203622 2011-02-23 kinaba: f_Ver = getProc( "GetVersion" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef WORD (WINAPI * CARC_VER)(void); 13b7203622 2011-02-23 kinaba: return f_Ver ? ((CARC_VER)f_Ver)() : 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: WORD kiArcDLLRaw::getVerSub() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return 0; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_VSb ) 13b7203622 2011-02-23 kinaba: f_VSb = getProc( "GetSubVersion" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef WORD (WINAPI * CARC_VER)(void); 13b7203622 2011-02-23 kinaba: return f_VSb ? ((CARC_VER)f_VSb)() : 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: BOOL kiArcDLLRaw::check( LPCSTR filename, const int mode ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return FALSE; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Chk ) 13b7203622 2011-02-23 kinaba: f_Chk = getProc( "CheckArchive" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef BOOL (WINAPI * CARC_CHK)(const char*,const int); 13b7203622 2011-02-23 kinaba: return f_Chk ? ((CARC_CHK)f_Chk)( filename, mode ) : FALSE; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int kiArcDLLRaw::getArcType( LPCSTR filename ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return FALSE; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Gat ) 13b7203622 2011-02-23 kinaba: f_Gat = getProc( "GetArchiveType" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef BOOL (WINAPI * CARC_GAT)(const char*); 13b7203622 2011-02-23 kinaba: return f_Gat ? ((CARC_GAT)f_Gat)( filename ) : 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: HARC kiArcDLLRaw::openArc( const HWND wnd, LPCSTR arcname, const DWORD flag ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return NULL; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Opn ) 13b7203622 2011-02-23 kinaba: f_Opn = getProc( "OpenArchive" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef HARC (WINAPI * CARC_OPN)(const HWND,LPCSTR,const DWORD); 13b7203622 2011-02-23 kinaba: return f_Opn ? ((CARC_OPN)f_Opn)( wnd, arcname, flag ) : NULL; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: void kiArcDLLRaw::closeArc( HARC arc ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Cls ) 13b7203622 2011-02-23 kinaba: f_Cls = getProc( "CloseArchive" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef int (WINAPI * CARC_CLS)(HARC); 13b7203622 2011-02-23 kinaba: if( f_Cls ) 13b7203622 2011-02-23 kinaba: ((CARC_CLS)f_Cls)( arc ); 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int kiArcDLLRaw::findfirst( HARC arc, LPCSTR wildname, INDIVIDUALINFO* inf ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Ffs ) 13b7203622 2011-02-23 kinaba: f_Ffs = getProc( "FindFirst" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef int (WINAPI * CARC_FFS)(HARC,LPCSTR,INDIVIDUALINFO FAR *); 13b7203622 2011-02-23 kinaba: return f_Ffs ? ((CARC_FFS)f_Ffs)( arc, wildname, inf ) : ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int kiArcDLLRaw::findnext( HARC arc, INDIVIDUALINFO* inf ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_Fnx ) 13b7203622 2011-02-23 kinaba: f_Fnx = getProc( "FindNext" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef int (WINAPI * CARC_FNX)(HARC,INDIVIDUALINFO FAR *); 13b7203622 2011-02-23 kinaba: return f_Fnx ? ((CARC_FNX)f_Fnx)( arc, inf ) : ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: int kiArcDLLRaw::getAttr( HARC arc ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_GAr ) 13b7203622 2011-02-23 kinaba: f_GAr = getProc( "GetAttribute" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef int (WINAPI * CARC_GAR)(HARC); 13b7203622 2011-02-23 kinaba: return f_GAr ? ((CARC_GAR)f_GAr)( arc ) : 0; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: BOOL kiArcDLLRaw::setOwner( HWND wnd ) 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_SOw ) 13b7203622 2011-02-23 kinaba: f_SOw = getProc( "SetOwnerWindow" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef BOOL (WINAPI * CARC_SOW)(HWND); 13b7203622 2011-02-23 kinaba: return f_SOw ? ((CARC_SOW)f_SOw)( wnd ) : FALSE; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: BOOL kiArcDLLRaw::clearOwner() 13b7203622 2011-02-23 kinaba: { 13b7203622 2011-02-23 kinaba: if( not_loaded_yet ) 13b7203622 2011-02-23 kinaba: if( !load() ) 13b7203622 2011-02-23 kinaba: return ERROR_NOT_SUPPORT; 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: if( !f_COw ) 13b7203622 2011-02-23 kinaba: f_COw = getProc( "ClearOwnerWindow" ); 13b7203622 2011-02-23 kinaba: 13b7203622 2011-02-23 kinaba: typedef BOOL (WINAPI * CARC_COW)(); 13b7203622 2011-02-23 kinaba: return f_COw ? ((CARC_COW)f_COw)() : FALSE; 13b7203622 2011-02-23 kinaba: } 13b7203622 2011-02-23 kinaba: