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