File Annotation

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