ADDED ArcACE.cpp Index: ArcACE.cpp ================================================================== --- ArcACE.cpp +++ ArcACE.cpp @@ -0,0 +1,273 @@ + +#include "stdafx.h" +#include "ArcAce.h" +#include "NoahApp.h" + + +int CArcAce::v_load() +{ + if( hDLL = kiSUtil::loadLibrary("UnAceV2") ) + { + if( (aceInit = (FI)::GetProcAddress( hDLL,"ACEInitDll" )) + && (aceHead = (FR)::GetProcAddress( hDLL,"ACEReadArchiveData" )) + && (aceList = (FL)::GetProcAddress( hDLL,"ACEList" )) + && (aceTest = (FT)::GetProcAddress( hDLL,"ACETest" )) + && (aceExtr = (FE)::GetProcAddress( hDLL,"ACEExtract" )) ) + { + tACEInitDllStruc ini; + ki_memzero( &ini, sizeof(ini) ); + + ini.GlobalData.Obj = this; + ini.GlobalData.MaxArchiveTestBytes = 0x2ffFF; + ini.GlobalData.MaxFileBufSize = 0x2ffFF; + ini.GlobalData.InfoCallbackProc = callback_info; + ini.GlobalData.ErrorCallbackProc = callback_error; + ini.GlobalData.RequestCallbackProc = callback_request; + ini.GlobalData.StateCallbackProc = callback_state; + ini.GlobalData.DecryptPassword = pwdBuf; + + if( 0 == aceInit( &ini ) ) + return aCheck|aMelt|aList|aMeltEach; + } + + ::FreeLibrary( hDLL ); + hDLL = NULL; + } + return 0; +} + +bool CArcAce::v_ver( kiStr& str ) +{ + str = "UnAceV2.dll "; + + //-- 存在確認 + char buf[40]; + if( hDLL ) + if( GetVersionInfoStr( "UnAceV2", buf, sizeof(buf) ) ) + str += buf; + else + str += "OK!"; + else + str += "----"; + + return true; +} + +bool CArcAce::v_check( const kiPath& aname ) +{ + //-- 書庫情報を読み込んでみる + tACEReadArchiveDataStruc dt; + ki_memzero( &dt, sizeof(dt) ); + return ( 0==aceHead( const_cast((const char*)aname), &dt ) + && NULL!=dt.ArchiveData ); +} + +bool CArcAce::v_list( const arcname& aname, aflArray& files ) +{ + list = &files; + + //-- リスティング開始! + tACEListStruc lst; + ki_memzero( &lst, sizeof(lst) ); + lst.Files.SourceDir = ""; + lst.Files.FileList = "*"; + lst.Files.ExcludeList = ""; + lst.Files.FullMatch = FALSE; + + char anm[MAX_PATH]; + ki_strcpy( anm, aname.basedir ); + ki_strcat( anm, aname.lname ); + + return ( 0==aceList( anm, &lst ) ); +} + +int CArcAce::v_contents( const kiPath& aname, kiPath& dname ) +{ + list = NULL; + aCnt = aUnknown; + dName = &dname; + + //-- リスティング開始! + tACEListStruc lst; + ki_memzero( &lst, sizeof(lst) ); + lst.Files.SourceDir = ""; + lst.Files.FileList = "*"; + lst.Files.ExcludeList = ""; + lst.Files.FullMatch = TRUE; + if( 0!=aceList( const_cast((const char*)aname), &lst ) ) + return aMulti; + return aCnt; +} + +int CArcAce::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + pathCheck = new CArcPathCheckDlg; + + //-- 渡すファイルリスト作成 + kiStr lst; + if( files ) + { + dlg = NULL; + for( unsigned int i=0; i!=list->len(); i++ ) + if( (*files)[i].selected ) + lst += (*files)[i].inf.szFileName, lst += '\xd'; + } + else + lst = "*", dlg = new CArcProgressDlg( 32768 ); + + //-- 展開開始! + ::SetCurrentDirectory( ddir ); + + m_aname = aname.lname; + pwdBuf[0] = -1; + + tACEExtractStruc ex; + ki_memzero( &ex, sizeof(ex) ); + ex.Files.SourceDir = ""; + ex.Files.FileList = const_cast((const char*)lst); + ex.Files.ExcludeList = ""; + ex.Files.FullMatch = files==NULL; + ex.DestinationDir = const_cast((const char*)ddir); + ex.ExcludePath = FALSE; + ex.DecryptPassword = ""; + + char anm[MAX_PATH]; + ki_strcpy( anm, aname.basedir ); + ki_strcat( anm, aname.lname ); + + m_bCanceled = false; + bool ans = ( 0==aceExtr( anm, &ex ) ); + if( dlg && ans ) + { + dlg->change(NULL,32768); + ::Sleep(100); + } + delete dlg; + delete pathCheck; + return ans ? 0 : (m_bCanceled?0x8020:0xffff); +} + +int __stdcall CArcAce::callback_error( pACEErrorCallbackProcStruc Error ) +{ + return ACE_CALLBACK_RETURN_OK; +} + +int __stdcall CArcAce::callback_info( pACEInfoCallbackProcStruc Info ) +{ + return ACE_CALLBACK_RETURN_OK; +} + +int __stdcall CArcAce::callback_request( pACERequestCallbackProcStruc Request ) +{ + // パスワード要求@解凍 ... ArchivedFile + if( Request->Global.Code == ACE_CALLBACK_REQUEST_PASSWORD + && Request->Global.Operation == ACE_CALLBACK_OPERATION_EXTRACT ) + { + CArcAce* ace = (CArcAce*)(Request->Global.GlobalData->Obj); + if( ace->pwdBuf[0] == -1 ) + { + ace->pwdBuf[0]=0; + + CArcPwdDlg pwd( ace->dlg ? ace->dlg->hwnd() : NULL, ace->pwdBuf, 60, ace->m_aname ); + if( IDCANCEL == pwd.getEndCode() ) + { + ace->m_bCanceled = true; + return ACE_CALLBACK_RETURN_CANCEL; + } + + Request->Global.GlobalData->DecryptPassword = ace->pwdBuf; + } + } + + if( Request->Global.Code == ACE_CALLBACK_REQUEST_CHANGEVOLUME ) + if( !kiSUtil::exist(Request->Archive.ArchiveData->ArchiveName) ) + return ACE_CALLBACK_RETURN_CANCEL; + + return ACE_CALLBACK_RETURN_OK; +} + +int __stdcall CArcAce::callback_state( pACEStateCallbackProcStruc State ) +{ + // ファイル処理開始@解凍orリスト + if( State->Progress.Code == ACE_CALLBACK_STATE_STARTFILE ) + { + CArcAce* ptr = (CArcAce*)(State->ArchivedFile.GlobalData->Obj); + + if( State->Progress.Operation == ACE_CALLBACK_OPERATION_LIST ) + { + if( !ptr->listup( *(State->ArchivedFile.FileData) ) ) + return ACE_CALLBACK_RETURN_CANCEL; + } + else if( State->Progress.Operation == ACE_CALLBACK_OPERATION_EXTRACT ) + { + if( ptr->dlg ) + ptr->dlg->change( State->ArchivedFile.FileData->SourceFileName ); + if( ptr->pathCheck ) + if( containsDangerPath( State->ArchivedFile.FileData->SourceFileName ) ) + if( ! ptr->pathCheck->is_ok_to_extract( State->ArchivedFile.FileData->SourceFileName, ptr->dlg ) ) + return ACE_CALLBACK_RETURN_CANCEL; + } + } + // 進展状況グラフ@解凍 + else if( State->Progress.Code == ACE_CALLBACK_STATE_PROGRESS ) + { + CArcAce* ptr = (CArcAce*)(State->ArchivedFile.GlobalData->Obj); + + if( State->Progress.Operation == ACE_CALLBACK_OPERATION_EXTRACT && ptr->dlg ) + { + unsigned long prs = (unsigned long)State->Progress.ProgressData->TotalProcessedSize; + unsigned long ttl = (unsigned long)State->Progress.ProgressData->TotalSize; + ptr->dlg->change( NULL, ttl ? (int)((((__int64)prs)<<15)/ttl) : 10000 ); + if( !ptr->dlg->msgloop() ) + { + ptr->m_bCanceled = true; + return ACE_CALLBACK_RETURN_CANCEL; + } + } + } + // CRCチェック@解凍 + else if( State->Progress.Code == ACE_CALLBACK_STATE_ENDCRCCHECK ) + { + if( !State->CRCCheck.CRCOk ) + ::DeleteFile( State->CRCCheck.FileData->SourceFileName ); + } + + return ACE_CALLBACK_RETURN_OK; +} + +bool CArcAce::listup( tACEFileDataStruc& f ) +{ + if( list ) // 全ファイルリスティングモード + { + arcfile x; + + ki_strcpy( x.inf.szFileName, f.SourceFileName ); + x.isfile = ( 0== (f.Attributes & 0x10) ); //_A_SUBDIR + x.inf.dwCompressedSize = (unsigned long)f.CompressedSize; + x.inf.dwOriginalSize = (unsigned long)f.Size; + x.inf.wDate = (unsigned short)(f.Time>>16); + x.inf.wTime = (unsigned short)(f.Time); + + if( f.Method==0 ) ki_strcpy( x.inf.szMode, "store" ); + else if( f.Method&2 ) ki_strcpy( x.inf.szMode, "ace2" ); + else if( f.Method&1 ) ki_strcpy( x.inf.szMode, "ace1" ); + else ki_strcpy( x.inf.szMode, "-ace-" ); + + list->add( x ); + return true; + } + + // 書庫内ファイル構成検索モード + for( const char* p=f.SourceFileName; *p; p=kiStr::next(p) ) + if( *p=='\\' || *p=='/' ) + return true; // ルートのファイルのみ処理対象… + + if( aCnt != aUnknown ) + return false; + + aCnt = (f.Attributes & 0x10) ? aSingleDir : aSingleFile; + if( aCnt == aSingleDir ) + *dName = f.SourceFileName; + + return true; +} ADDED ArcACE.h Index: ArcACE.h ================================================================== --- ArcACE.h +++ ArcACE.h @@ -0,0 +1,56 @@ +#ifndef AFX_ARCACE_H__84B9CB87_29F7_428D_A3E7_F239213B127C__INCLUDED_ +#define AFX_ARCACE_H__84B9CB87_29F7_428D_A3E7_F239213B127C__INCLUDED_ + +#include "Archiver.h" +#include "SubDlg.h" + +#include "unacedef.h" + +class CArcAce : public CArchiver +{ +public: //-- CArchiver 実装 -------------------------------- + + CArcAce() : CArchiver("ace."), hDLL( NULL ) {} + virtual ~CArcAce() + { + if(hDLL) + ::FreeLibrary(hDLL); + } +private: + int v_load(); + bool v_ver( kiStr& str ); + bool v_check( const kiPath& aname ); + int v_contents( const kiPath& aname, kiPath& dname ); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); + bool v_list( const arcname& aname, aflArray& files ); + kiStr v_name(const char*) const { return "Unace32"; } + +private: //-- UnAceV2.DLL 操作 ------------------------------ + + HINSTANCE hDLL; + static int __stdcall callback_error( pACEErrorCallbackProcStruc Error ); + static int __stdcall callback_request( pACERequestCallbackProcStruc Request ); + static int __stdcall callback_state( pACEStateCallbackProcStruc State ); + static int __stdcall callback_info( pACEInfoCallbackProcStruc Info ); + bool listup( tACEFileDataStruc& f ); + aflArray* list; + CArcProgressDlg* dlg; + CArcPathCheckDlg* pathCheck; + char pwdBuf[100]; + const char* m_aname; + int aCnt; + kiPath* dName; + bool m_bCanceled; + +private: //-- UnAce.h --------------------------------------- + + // API + typedef int (__stdcall *FI)( pACEInitDllStruc ); + typedef int (__stdcall *FR)( LPSTR, pACEReadArchiveDataStruc ); + typedef int (__stdcall *FL)( LPSTR, pACEListStruc ); + typedef int (__stdcall *FT)( LPSTR, pACETestStruc ); + typedef int (__stdcall *FE)( LPSTR, pACEExtractStruc ); + FI aceInit; FR aceHead; FL aceList; FT aceTest; FE aceExtr; +}; + +#endif ADDED ArcB2e.cpp Index: ArcB2e.cpp ================================================================== --- ArcB2e.cpp +++ ArcB2e.cpp @@ -0,0 +1,876 @@ + +#include "stdafx.h" +#include "ArcB2e.h" +#include "resource.h" +#include "NoahApp.h" + +//----------------- ArcB2eクラス全体的な処理 ------------------------------ + +char CArcB2e::st_base[MAX_PATH]; +int CArcB2e::st_life=0; +CArcB2e::CB2eCore* CArcB2e::rvm=NULL; + +const char* CArcB2e::init_b2e_path() +{ + kiPath dir( kiPath::Exe ); + ki_strcpy( st_base, dir+="b2e\\" ); + return st_base; +} + +CArcB2e::CArcB2e( const char* scriptname ) : CArchiver( scriptname ) +{ + st_life++; + exe = NULL; + m_LstScr = m_DcEScr = m_EncScr = + m_DecScr = m_SfxScr = m_LoadScr= m_ScriptBuf = NULL; +} + +CArcB2e::~CArcB2e() +{ + if( !(--st_life) ) + delete rvm; + delete [] m_ScriptBuf; +} + +//------------------- スクリプト側にあまり関係しない部分 ------------------------- + +bool CArcB2e::v_ver( kiStr& str ) +{ + if( !exe ) + return false; + exe->ver( str ); + + kiStr tmp; + for( int i=0,e=m_subFile.len(); ichk( aname ) : false; +} + +int CArcB2e::v_contents( const kiPath& aname, kiPath& dname ) +{ + return exe ? exe->cnt( aname, dname ) : aUnknown; +} + +//------------------- スクリプトを読み込み&eval( load: ) ------------------- + +bool CArcB2e::load_module( const char* name ) +{ + exe = new CArcModule( name, m_usMode ); + return exe->exist(); +} + +int CArcB2e::v_load() +{ + //-- 拡張スクリプトファイルを開く + kiStr fname( st_base ); fname += mlt_ext(); + kiFile fp; + if( fp.open( fname ) ) + { + //-- ファイル全体を読み込み + unsigned int ln=fp.getSize(); + m_ScriptBuf = new char[ ln+1 ]; + ln = fp.read( (unsigned char*)m_ScriptBuf, ln ); + m_ScriptBuf[ ln ] = '\0'; + + //-- section毎に切り分ける + bool pack1,chk=false; + for( char* p=m_ScriptBuf; *p; p++ ) + { + switch( *p ) + { + case 'c': case 'd': case 'e': case 'l': case 's': + if( ki_memcmp(p,"load:",5) ) + *p='\0', m_LoadScr = (p+=4)+1; + else if( ki_memcmp(p,"encode:",7) ) + *p='\0', m_EncScr = (p+=6)+1, pack1=false; + else if( ki_memcmp(p,"encode1:",8) ) + *p='\0', m_EncScr = (p+=7)+1, pack1=true; + else if( ki_memcmp(p,"decode:",7) ) + *p='\0', m_DecScr = (p+=6)+1; + else if( ki_memcmp(p,"sfx:",4) ) + *p='\0', m_SfxScr = (p+=3)+1, m_SfxDirect=false; + else if( ki_memcmp(p,"sfxd:",5) ) + *p='\0', m_SfxScr = (p+=4)+1, m_SfxDirect=true; + else if( ki_memcmp(p,"check:",6) ) + *p='\0', (p+=5), chk=true; + else if( ki_memcmp(p,"decode1:",8) ) + *p='\0', m_DcEScr = (p+=7); + else if( ki_memcmp(p,"list:",5) ) + *p='\0', m_LstScr = (p+=4); + } + while( *p && *p!='\n' && *p!='\r' ) + p++; + if( *p=='\0' ) + break; + } + + //-- [load:]を実行! + if( m_LoadScr ) + { + //-- RythpVM 起動 + if( !rvm ) + rvm = new CB2eCore; + + //-- 初期化 + m_Result=0; + rvm->setPtr( this,mLod ); + + //-- 実行 + rvm->eval( m_LoadScr ); + + //-- 結果 + if( m_Result==0 ) + return (m_DecScr?aMelt|(m_DcEScr?aList|aMeltEach:0)|(chk?aCheck:0):0) + | (m_EncScr?aCompress|(pack1?0:aArchive)|(m_SfxScr?aSfx:0):0); + } + } + return 0; +} + +int CArcB2e::exec_script( const char* scr, scr_mode mode ) +{ + //-- 初期化 + m_Result = 0; + rvm->setPtr( this, mode ); + + //-- 実行 + char* script = new char[ki_strlen(scr)+8]; + ki_strcpy( script, "(exec " ); + ki_strcat( script, scr ); + ki_strcat( script, ")" ); + rvm->eval( script ); + delete [] script; + + //-- 結果 + return m_Result; +} + +//-------------------- リストアップ eval( list: ) ----------------------- + +bool CArcB2e::v_list( const arcname& aname, aflArray& files ) +{ + //-- スクリプト無しで何とかできるならする。 + if( !exe ) + return false; + else if( exe->isdll() ) + return exe->lst_dll( aname, files ); + else if( !m_LstScr ) + return false; + +//-- リスティングスクリプトに必要なデータ + + // 書庫名 + m_psArc = &aname; + // ファイルリスト + m_psAInfo = &files; + +//-- 実行! --------------------- + + return 0==exec_script( m_LstScr, mLst ); +} + +//-------------------- 展開処理 eval( decode: ) ----------------------- + +int CArcB2e::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ +//-- 解凍スクリプトに必要なデータ + + // カレント + ::SetCurrentDirectory( ddir ); + // 書庫名 + m_psArc = &aname; + // 出力先ディレクトリ + m_psDir = &ddir; + // ファイルリスト + m_psAInfo = files; + +//-- 実行! --------------------- + + return exec_script( files ? m_DcEScr : m_DecScr, + files ? mDc1 : mDec ); +} + +//-------------------- 圧縮処理 eval( encode: sfx: ) ----------------------- + +int CArcB2e::cmpr( const char* scr, const kiPath& base, const wfdArray& files, const kiPath& ddir, const int method ) +{ +//-- 圧縮スクリプトに必要なデータ + + arcname aname( + ddir, + files[0].cAlternateFileName, + files[0].cFileName ); + int mhd=method+1; + + // カレント + ::SetCurrentDirectory( base ); + // 書庫名 + m_psArc = &aname; + // ベースディレクトリ + m_psDir = &base; + // メソッド + m_psMhd = &mhd; + // リスト + m_psList = &files; + +//-- 実行! -------------------- + + return exec_script( scr, mEnc ); +} + +bool CArcB2e::arc2sfx( const kiPath& temp, const kiPath& dest ) +{ +//-- SFX変換スクリプトに必要なデータ + + kiFindFile f; + WIN32_FIND_DATA fd; + kiPath wild( temp ); + f.begin( wild += "*" ); + if( !f.next( &fd ) ) + return false; + kiPath from, to, oldname( fd.cFileName ); + arcname aname( temp, fd.cAlternateFileName[0] ? fd.cAlternateFileName : fd.cFileName, fd.cFileName ); + + // カレント + ::SetCurrentDirectory( temp ); + // 書庫名 + m_psArc = &aname; + // ディレクトリ + m_psDir = &temp; + +//-- 実行! ---------------------- + + if( 0x8000<=exec_script( m_SfxScr, mSfx ) ) + return false; + +//-- コピー ---------------------- + + bool skipped=false, ans=false; + f.begin( wild ); + while( f.next( &fd ) ) + { + if( !skipped && oldname == fd.cFileName ) // テンポラリ書庫はコピーしない。 + { + skipped=true; + continue; + } + from = temp, from += fd.cFileName; + to = dest, to += fd.cFileName; + if( ::CopyFile( from, to, FALSE ) ) + ans = true; + } + return ans; +} + +int CArcB2e::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ) +{ + const char* theScript = m_EncScr; + + if( sfx ) + { + if( m_SfxDirect ) + theScript = m_SfxScr; + else + { + kiPath tmp; + myapp().get_tempdir( tmp ); + + // テンポラリへ圧縮 + int ans = cmpr( m_EncScr, base, files, tmp, method ); + if( ans < 0x8000 ) + // テンポラリに落ちてるファイルをSFXに変換&コピー! + ans = (arc2sfx( tmp, ddir ) ? 0 : 0x8020); + + // カレントを戻しておかないと削除できない…(;_;) + ::SetCurrentDirectory( base ); + tmp.remove(); + return ans; + } + } + + // 出力先へ普通に圧縮 + return cmpr( theScript, base, files, ddir, method ); +} + +//-----------------------------------------------------------------// +//-------------------- RythpVMの方の実務 --------------------------// +//-----------------------------------------------------------------// + +bool CArcB2e::CB2eCore::exec_function( const kiVar& name, const CharArray& a, const BoolArray& b, int c, kiVar* r ) +{ + bool processed = false; + + if( m_mode==mLod ){ //**ロード時専用functions**************************** + if( name=="name" ){ + processed=true; + + //---------------------------// + //-- (name module_filename)--// + //---------------------------// + if( c>=2 ) + { + x->m_usMode = false; + if( c>=3 ) + { + getarg( a[2],b[2],&t ); + x->m_usMode = ( t=="us" ); + } + + getarg( a[1],b[1],&t ); + if( x->load_module(t) ) + *r = "exec"; + else + *r = "", x->m_Result=0xffff; + } + + }else if( name=="type" ){ + processed=true; + + //-----------------------------------// + //-- (type ext method1 method2 ...)--// + //-----------------------------------// + for( int i=1; iset_cmp_ext( t ); + else + { + const char* ptr=t; + x->add_cmp_mhd( *ptr=='*' ? ptr+1 : ptr, *ptr=='*' ); + } + } + }else if( name=="use" ){ + processed=true; + + //-------------------------------// + //-- (use module1 module2 ...) --// + //-------------------------------// + for( int i=1; im_subFile.add( t ); + } + } + }else{//************ ロード時には使えないfunctions ********************* + if( ki_memcmp( (const char*)name, "arc", 3 ) ){ + processed=true; + + //---------------------------// + //-- (arc[+-].xxx [slfrd]) --// + //---------------------------// + arc( ((const char*)name)+3, a, b, c, r ); + + }else if( ki_memcmp( (const char*)name, "list", 4 ) ){ + processed=true; + + //----------------------------// + //-- (list[\*|\*.*] [slfn]) --// + //----------------------------// + list( ((const char*)name)+4, a, b, c, r ); + + }else if( name=="method" ){ + processed=true; + + //-------------------// + //-- (method [no]) --// + //-------------------// + if( c>=2 ) + { + getarg( a[1],b[1],&t ); + *r = t.getInt()==*x->m_psMhd ? "1" : "0"; + } + else + r->setInt( *x->m_psMhd ); + + }else if( name=="dir" ){ + processed=true; + + //-----------// + //-- (dir) --// + //-----------// + *r = (x->m_psDir ? *x->m_psDir : (const char*)""); + + }else if( name=="del" ){ + processed=true; + + //-------------------// + //-- (del filenam) --// + //-------------------// + if( c>=2 ) + { + getarg( a[1],b[1],&t ); + ::DeleteFile( kiPath( t.unquote() ) ); + } + + }else if( ki_memcmp( (const char*)name, "resp", 4 ) + || ki_memcmp( (const char*)name, "resq", 4 ) ){ + processed=true; + + //----------------------------// + //-- (resp[@|-o] (list a)) ---// + //----------------------------// + resp( name[3]=='p', ((const char*)name)+4, a, b, c, r ); + + }else if( name=="cd" ){ + processed=true; + + //-------------------// + //-- (cd directory)--// + //-------------------// + if( c>=2 ) + { + getarg( a[1],b[1],&t ); + ::SetCurrentDirectory( t.unquote() ); + } + + }else if( name=="cmd" || name=="xcmd" ){ + processed=true; + + //----------------------------// + //-- (cmd command line ...)---// + //-- (xcmd command line ...)--// + //----------------------------// + if( name[0]=='x' && c<2 ) + x->m_Result = 0xffff; + else + { + CArcModule* xxx = x->exe; + kiVar cmd; + int i=1; + + if( name[0] == 'x' ) + { + kiVar mm; + getarg( a[i],b[i],&mm ); + i++; + xxx = new CArcModule( mm, x->m_usMode ); + } + for( ; im_Result = xxx->cmd( cmd, m ); + r->setInt( x->m_Result ); + + if( name[0] == 'x' ) + delete xxx; + } + }else if( name=="scan" || name=="xscan" ){ + processed=true; + + //----------------------------------------// + //-- (scan BL BSL EL SL dx cmd...) -------// + //-- (xscan BL BSL EL SL dx CMD cmd...) --// + //----------------------------------------// + if( c<6 || (name[0]=='x'&&c<7) ) + x->m_Result = 0xffff; + else + { + CArcModule* xxx = x->exe; + + kiVar BL, EL; + getarg( a[1],b[1],&BL ); + getarg( a[2],b[2],&t ); + int BSL = t.getInt(); + getarg( a[3],b[3],&EL ); + getarg( a[4],b[4],&t ); + int SL = t.getInt(); + getarg( a[5],b[5],&t ); + int dx = t.getInt(); + + int i=6; + if( name[0] == 'x' ) + { + kiVar mm; + getarg( a[i],b[i],&mm ); + i++; + xxx = new CArcModule( mm, x->m_usMode ); + } + + kiVar cmd; + for( ; im_Result = xxx->lst_exe( + cmd, *const_cast(x->m_psAInfo), + BL, BSL, EL, SL, dx ) ? 0 : -1; + + if( name[0] == 'x' ) + delete xxx; + } + }else if( name=="input" ){ + processed=true; + + //-------------------------// + //-- (input MSG DEFUALT) --// + //-------------------------// + kiVar msg, defval; + if( c>=2 ) + getarg( a[1],b[1],&msg ); + if( c>=3 ) + getarg( a[2],b[2],&defval ); + input( msg, defval, r ); + }else if( name=="size" ){ + processed=true; + + //---------------------// + //-- (size FILENAME) --// + //---------------------// + if( c>=2 ) + { + kiVar fnm; + getarg( a[1],b[1],&fnm ); + r->setInt( kiFile::getSize( fnm.unquote() ) ); + } + }else if( name=="is_file" ){ + processed=true; + + //---------------------// + //-- (is_file) --------// + //---------------------// + if( c==1 ) + *r = (x->m_psList->len()==1 + && !kiSUtil::isdir( (*x->m_psList)[0].cFileName )) ? "1" : "0"; + }else if( name=="is_folder" ){ + processed=true; + + //---------------------// + //-- (is_folder) ------// + //---------------------// + if( c==1 ) + *r = (x->m_psList->len()==1 + && kiSUtil::isdir( (*x->m_psList)[0].cFileName )) ? "1" : "0"; + }else if( name=="is_multiple" ){ + processed=true; + + //---------------------// + //-- (is_multiple) ----// + //---------------------// + if( c==1 ) + *r = x->m_psList->len()>1 ? "1" : "0"; + }else if( name=="find" ){ + processed=true; + + //---------------------// + //-- (find FILENAME) --// + //---------------------// + if( c>=2 ) + { + kiVar fnm; + getarg( a[1],b[1],&fnm ); + char buf[MAX_PATH]; + if( 0==::SearchPath( NULL,fnm.unquote(),NULL,MAX_PATH,buf,NULL ) ) + *r = ""; + else + *r = buf, r->quote(); + } + } + } + + return processed ? true : kiRythpVM::exec_function(name,a,b,c,r); +} + +void CArcB2e::CB2eCore::arc( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ) +{ + //---------------------------// + //-- (arc[+-].xxx [slfrd]) --// + //---------------------------// + + // デフォルトオプション設定 + const char* anm=x->m_psArc->lname; + enum{ full, nam, dir } part=full; + if( m_mode==mSfx ) part=nam; // sfx + + // 指定があれば上書 + if( c>=2 ) + { + getarg( a[1],b[1],&t ); + for( const char* p=t; *p; p++ ) + switch(*p) + { + case 's': anm=x->m_psArc->sname; break; + case 'l': anm=x->m_psArc->lname; break; + case 'f': part=full; break; + case 'n': part=nam; break; + case 'd': part=dir; break; + } + } + + // ディレクトリ部分 + *r = (part==nam ? (const char*)"" : x->m_psArc->basedir); + + // 名前部分 + if( part != dir ) + { + if( *opt=='\0' || *opt=='+' ) + { + // (arc) : anmをそのまま返す + *r += anm; + // (arc+XXX) : anmXXXを返す + if( *opt=='+' ) + *r += (opt+1); + } + else + { + const char* ext = kiPath::ext(anm); + const char* add = ""; + if( opt[0]=='-' && opt[1]=='.' ) + { + // (arc-.XXX) : 末尾が.XXXだったら削除。 + // : そうでなければ後ろに.decompressed + if( 0!=ki_strcmpi( ext, opt+2 ) ) + ext = anm + ki_strlen(anm), add = ".decompressed"; + } + else if( opt[1]!='\0' ) + { + // (arc.XXX) : 最後の拡張子を.XXXに取り替え + add = opt; + switch(mycnf().extnum()) + { + case 0: ext = anm + ::lstrlen(anm);break; + case 1: ext = kiPath::ext(anm); break; + default:ext = kiPath::ext_all(anm);break; + } + } + else + { + // (arc.) : 拡張子を全て取り除く + switch(mycnf().extnum()) + { + case 0: ext = anm + ::lstrlen(anm);break; + case 1: ext = kiPath::ext(anm); break; + default:ext = kiPath::ext_all(anm);break; + } + } + if( *ext ) + ext--; + + char buf[MAX_PATH]; + ki_memcpy( buf, anm, ext-anm ); + buf[ ext-anm ] = '\0'; + *r += buf; + *r += add; + } + + // 必要ならくくる + if( part==full ) + r->quote(); + } +} + +static void selfR( + const char* writedir, const char* fullpath, bool lfn, kiVar* r ) +{ + kiFindFile f; + WIN32_FIND_DATA fd; + f.begin( kiStr(fullpath) += "\\*" ); + + kiVar t, t2, t3; + while( f.next(&fd) ) + { + t = writedir; + t+= '\\'; + t+= (lfn ? fd.cFileName : fd.cAlternateFileName); + if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + { + t2 = t; + t = ""; + t3 = fullpath; + t3+= '\\'; + t3+= (lfn ? fd.cFileName : fd.cAlternateFileName); + selfR( t2, t3, lfn, &t ); + } + else + { + if( lfn ) + t.quote(); + } + *r += t; + *r += ' '; + } +} + +void CArcB2e::CB2eCore::list( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ) +{ + //---------------------------// + //-- (list[r|\*.*] [slfn]) --// + //---------------------------// + + if( m_mode!=mEnc ) // 解凍の場合 + { + *r = ""; + + for( unsigned int i=0; i!=x->m_psAInfo->len(); i++ ) + if( (*x->m_psAInfo)[i].selected ) + { + // - で始まるヤツ対策をするか? + t = (*x->m_psAInfo)[i].inf.szFileName; + t.quote(); + *r += t; + *r += ' '; + } + } + else // 圧縮の場合 + { + // デフォルトオプション設定 + bool lfn=true; + enum{ full, nam } part=nam; + // 指定があれば上書 + if( c>=2 ) + { + getarg( a[1],b[1],&t ); + for( const char* p=t; *p; p++ ) + switch(*p) + { + case 's': lfn=false; break; + case 'l': lfn=true; break; + case 'f': part=full; break; + case 'n': part=nam; break; + } + } + // 自前で再帰リストアップを行うか否か + bool selfrecurse = (*opt=='r'); + + // ディレクトリ名の後ろに付け足すもの。 + if( *opt=='\\' || *opt=='/' ) + opt++; + + // リストアップ + kiVar t2,t3; + *r = ""; + for( unsigned int i=0; i!=x->m_psList->len(); i++ ) + { + // ファイル名部分 + t = ( part==full ? *x->m_psDir : (const char*)""); + t += lfn ? (*x->m_psList)[i].cFileName : (*x->m_psList)[i].cAlternateFileName; + + if( selfrecurse && ((*x->m_psList)[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) + { + // セルフ再帰 + t2 = t; + t = ""; + t3 = *x->m_psDir; + t3+= lfn ? (*x->m_psList)[i].cFileName : (*x->m_psList)[i].cAlternateFileName; + selfR( t2, t3, lfn, &t ); + } + else + { + // ノーマル処理 + if( *opt && ((*x->m_psList)[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) ) + t += '\\', t += opt; + if( lfn ) + t.quote(); + } + *r += t; + *r += ' '; + } + } + + r->removeTrailWS(); +} + +void CArcB2e::CB2eCore::resp( bool needq, const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ) +{ + //-----------------------------// + //-- (resp[@|-o] (list) ...) --// + //-----------------------------// + + // レスポンスファイル名作成 + kiPath rspfile; + myapp().get_tempdir(rspfile); + rspfile += "filelist"; + + // オプションと結合して返す + *r = opt; + *r += rspfile; + + // ファイルへ書き込み + kiFile fp; + if( !fp.open( rspfile,false ) ) + return; + + kiVar tmp; + for( int i=1; imainhwnd() ); +} + ADDED ArcB2e.h Index: ArcB2e.h ================================================================== --- ArcB2e.h +++ ArcB2e.h @@ -0,0 +1,80 @@ +#ifndef AFX_ARCB2e_H__697CC1BD_2C28_434C_8C53_239D624227C3__INCLUDED_ +#define AFX_ARCB2e_H__697CC1BD_2C28_434C_8C53_239D624227C3__INCLUDED_ + +#include "Archiver.h" + +class CArcB2e : public CArchiver +{ +public: //---- + + CArcB2e( const char* scriptname ); + virtual ~CArcB2e(); + static const char* init_b2e_path(); + +private: //---- + + int v_load(); + bool v_ver( kiStr& str ); + bool v_check( const kiPath& aname ); + int v_contents( const kiPath& aname, kiPath& dname ); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); + bool v_list( const arcname& aname, aflArray& files ); + int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); + kiStr v_name(const char*) const { return exe ? exe->name() : kiStr(""); } + + bool arc2sfx( const kiPath& temp, const kiPath& dest ); + int cmpr( const char* scr, const kiPath& base, const wfdArray& files, const kiPath& ddir, const int method ); + +private: //---- + + // scripts + char* m_ScriptBuf; + char* m_LoadScr; + const char* m_EncScr; + const char* m_DecScr; + const char* m_SfxScr; + const char* m_DcEScr; + const char* m_LstScr; + bool m_SfxDirect; + + enum scr_mode { mLod, mEnc, mDec, mDc1, mSfx, mLst }; + int exec_script( const char* scr, scr_mode mode ); + + // B2e Core + class CB2eCore : public kiRythpVM + { + friend class CArcB2e; + + bool exec_function( const kiVar& name, const CharArray& a, const BoolArray& b,int c, kiVar* r ); + + void arc( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ); + void list( const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ); + void resp( bool needq, const char* opt, const CharArray& a, const BoolArray& b,int c, kiVar* r ); + void input( const char* msg, const char* defval, kiVar* r ); + + void setPtr( CArcB2e* p, scr_mode m ){x=p;m_mode=m;} + CArcB2e* x; + scr_mode m_mode; + kiVar t; + }; + friend class CB2eCore; + static char st_base[MAX_PATH]; + static int st_life; + static CB2eCore* rvm; + + // module + CArcModule* exe; + kiArray m_subFile; + + // script連携 + bool load_module( const char* name ); + int m_Result; + bool m_usMode; + const arcname* m_psArc; + const kiPath* m_psDir; + const int* m_psMhd; + const wfdArray* m_psList; + const aflArray* m_psAInfo; +}; + +#endif ADDED ArcCpt.cpp Index: ArcCpt.cpp ================================================================== --- ArcCpt.cpp +++ ArcCpt.cpp @@ -0,0 +1,559 @@ + +#include "stdafx.h" +#include "ArcCpt.h" +#include "NoahApp.h" + +//--- CArchiver -------------------------------------------------- + +bool CArcCpt::v_check( const kiPath& aname ) +{ + bool ans = ( cpt.open( aname ) && read_main_hdr() && check_index_crc() ); + cpt.close(); + return ans; +} + +bool CArcCpt::v_list( const arcname& aname, aflArray& files ) +{ + ::SetCurrentDirectory( aname.basedir ); + + bool ans = ( cpt.open( aname.lname ) && read_main_hdr() && operation_for_each( true, &files ) ); + cpt.close(); + return ans; +} + +int CArcCpt::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + ::SetCurrentDirectory( aname.basedir ); + if( !cpt.open( aname.lname ) ) + return 0xffff; + + ::SetCurrentDirectory( ddir ); + bool ans = ( read_main_hdr() && operation_for_each( false, const_cast(files) ) ); + cpt.close(); + return ans ? 0 : 0x8020; +} + +int CArcCpt::v_contents( const kiPath& aname, kiPath& dname ) +{ + int ans=aUnknown; + if( cpt.open( aname ) && read_main_hdr() ) + { + if( cpt.read( tmp, 7 ) ) + { + WORD EntryNum = (tmp[4]<<8) + tmp[5]; + if( EntryNum == 1 ) + ans = aSingleFile; + else + { + cpt.read( tmp, tmp[6] ); + tmp[0] = cpt.getc(); + if( tmp[0] & 0x80 ) // Folder + { + unsigned long size = (tmp[0]&0x3f) + 2; + if( size == cpt.read( tmp+1, size ) ) + if( EntryNum == 1 + (tmp[size-1]<<8) + tmp[size] ) + { + dname = ""; + tmp[ 1+tmp[0] ] = '\0'; + for( char* pp=(char*)tmp+1; *pp; pp=kiStr::next(pp) ) + { + if( kiStr::isLeadByte(*pp) ) + dname += *pp, dname += *(pp+1); + else if( *pp<' ' || *pp>'~' ) + dname += '_'; + else switch( *pp ) + { + case '\\': case '/': case ':': case '*': + case '?': case '\"': case '<': case '>': case '|': + dname += '_'; + default: + dname += *pp; + } + } + + ans = aSingleDir; + } + } + } + } + } + cpt.close(); + return ans; +} + +//--- CRC ---------------------------------------------------------- + +static unsigned long crctbl[256] = { 1 }; + +static void init_crc_table() +{ + if( crctbl[0]==1 ) // uninitialized + for( unsigned long c,n=0; n!=256; n++ ) + { + c = n; + for( unsigned long k=8; k; k-- ) + c = (c&1) ? ((0xedb88320L)^(c>>1)) : (c>>1); + crctbl[n] = c; + } +} + +static unsigned long crc( unsigned long c, unsigned char* cp,int cnt ) +{ + while( cnt-- ) + c = (c>>8)^crctbl[(c&0xff)^*cp++]; + return c; +} + +//--- cpt ---------------------------------------------------------- + +bool CArcCpt::read_main_hdr() +{ + //-- 先頭のバイトは MagicNumber : 0x01 なはず。 + m_nMacBinOffset = 0; + if( 8 != cpt.read( tmp, 8 ) ) + return false; + if( tmp[0] != 1 ) + { + if( 0 != tmp[0] + || 120 != cpt.read( tmp, 120 ) + || 8 != cpt.read( tmp, 8 ) + || tmp[0] != 1 ) // MacBinスキップ + return false; + m_nMacBinOffset = 128; + } + + //-- indexまで跳ぶ + cpt.seek( (tmp[4]<<24) + (tmp[5]<<16) + (tmp[6]<<8) + (tmp[7]) - 8 ); + return true; +} + +bool CArcCpt::check_index_crc() +{ + bool folder; + unsigned int size; + + //-- CRC(DWORD), EntryNum(WORD), CommentLen(BYTE) + if( !cpt.read( tmp, 7 ) ) + return false; + + init_crc_table(); + + DWORD CRC = (tmp[0]<<24) + (tmp[1]<<16) + (tmp[2]<<8) + tmp[3]; + WORD EntryNum = (tmp[4]<<8) + tmp[5]; + if( tmp[6] != cpt.read( tmp+7, tmp[6] ) ) + return false; + DWORD chk_crc = crc( 0xffffffff, tmp+4, 3+tmp[6] ); + + //-- 全ヘッダを走査してCRC計算 + for( WORD i=0; i!=EntryNum; i++ ) + { + tmp[0] = cpt.getc(); + + if( tmp[0] & 0x80 ) folder = true, size = (tmp[0]&0x3f) + 2; + else folder = false, size = (tmp[0]) + 45; + if( size != cpt.read( tmp+1, size ) ) return false; + + chk_crc = crc( chk_crc, tmp, 1+size ); + } + + return CRC == chk_crc; +} + +bool CArcCpt::operation_for_each( bool o_list, aflArray* files ) +{ + //-- Entry数を得る + if( !cpt.read( tmp, 7 ) ) + return false; + WORD EntryNum = (tmp[4]<<8) + tmp[5]; + cpt.read( tmp, tmp[6] ); + + //-- ダイアログ準備 + pdlg = files ? NULL : new CArcProgressDlg( EntryNum ); + + //-- 操作 + kiPath path; + m_nIndexPos = cpt.tell(); + bool ans = recurse( o_list, files, path, 0, EntryNum ); + delete pdlg; + return ans; +} + +bool CArcCpt::recurse( bool o_list, aflArray* files, kiPath& path, int base, int num ) +{ + bool folder; + unsigned int size; + kiPath pthtmp; + + for( int i=0; i'~' ) + *pp = '_'; + else switch( *pp ) + { + case '\\': case '/': case ':': case '*': + case '?': case '\"': case '<': case '>': case '|': + *pp = '_'; + } + } + // filenameが2個以上の.のみからなっていたら_に書き換え + { + int dots = 0; + char* pp; + for( pp=filename; *pp; pp=kiStr::next(pp) ) + if( *pp == '.' ) { ++dots; } + else { dots=-1; break; } + if( dots >= 2 ) + for( pp=filename; *pp; ++pp ) + *pp = '_'; + } + + //-- ダイアログ処理 + + pthtmp = path, pthtmp += filename; + + if( pdlg ) + { + pdlg->change( pthtmp, base+i+1 ); + if( !pdlg->msgloop() ) + return false; + } + + //-- フォルダ処理 + + if( folder ) + { + unsigned long fldlen = (tmp[size-1]<<8) + tmp[size]; + pthtmp += '\\'; + + if( o_list ) + { + files->forcelen( base+i+1 ); + ki_strcpy( (*files)[base+i].inf.szFileName, pthtmp ); + (*files)[base+i].isfile = false; + } + + if( !recurse( o_list, files, pthtmp, base+i+1, fldlen ) ) + return false; + i += fldlen; + } + + //-- ファイル処理 + + else + { + const unsigned char* hdr = tmp + (size+1) - 80; + + unsigned long rsrcSkip; bool lzhFlag; + if( (hdr[68]<<24) + (hdr[69]<<16) + (hdr[70]<<8) + hdr[71] != 0 ) + { + // もし dataForkが存在するならば + dataULen = (hdr[68]<<24) + (hdr[69]<<16) + (hdr[70]<<8) + hdr[71]; + dataCLen = (hdr[76]<<24) + (hdr[77]<<16) + (hdr[78]<<8) + hdr[79]; + rsrcSkip = (hdr[72]<<24) + (hdr[73]<<16) + (hdr[74]<<8) + hdr[75]; + lzhFlag = (hdr[63]&4) !=0; + } + else + { + // dataForkが存在しないならば + dataULen = (hdr[64]<<24) + (hdr[65]<<16) + (hdr[66]<<8) + hdr[67]; + dataCLen = (hdr[72]<<24) + (hdr[73]<<16) + (hdr[74]<<8) + hdr[75]; + rsrcSkip = 0; + lzhFlag = (hdr[63]&2) !=0; + } + + if( o_list ) // リストへ加える + { + files->forcelen( base+i+1 ); + ki_strcpy( (*files)[base+i].inf.szFileName, pthtmp ); + ki_strcpy( (*files)[base+i].inf.szMode, lzhFlag ? "rle+lzh" : "rle" ); + (*files)[base+i].inf.dwCompressedSize = dataCLen; + (*files)[base+i].inf.dwOriginalSize = dataULen; + (*files)[base+i].isfile = true; + } + else if( !files || (*files)[base+i].selected ) + { + if( !(hdr[63] & 1) ) + { + pthtmp.mkdir(); + cpt.seekTo( (hdr[36]<<24) + (hdr[37]<<16) + (hdr[38]<<8) + hdr[39] + + rsrcSkip + m_nMacBinOffset ); // filepos + rsrcCLen + (0 | 128) + if( out.open( pthtmp, false ) ) + { + cptmelt( lzhFlag ); + out.close(); + } + } + } + } + } + + return true; +} + +//-- 解凍処理 ------------------------------------------------ + +#define ESC1 0x81 +#define ESC2 0x82 +#define NONESEEN 0 +#define ESC1SEEN 1 +#define ESC2SEEN 2 + +void CArcCpt::cptmelt( bool isRL ) +{ + cpt_outstat = NONESEEN; + cpt_LZptr = 0; + cpt_blocksize = 0x1fff0; + + if( isRL ) + cpt_rle_lzh(); + else + while( dataCLen-- ) + cpt_outch( cpt.getc() ); +} + +void CArcCpt::cpt_outch(unsigned char ch) +{ + cpt_LZbuff[ cpt_LZptr++ & (CIRCSIZE-1) ] = ch; + + switch( cpt_outstat ) + { + case NONESEEN: + if( ch==ESC1 ) + cpt_outstat = ESC1SEEN; + else + dataULen--,out.putc( cpt_savechar=ch ); + break; + + case ESC1SEEN: + if( ch==ESC2 ) + cpt_outstat = ESC2SEEN; + else + { + dataULen--,out.putc( cpt_savechar=ESC1 ); + if( ch!=ESC1 ) + { + cpt_outstat = NONESEEN; + dataULen--,out.putc( cpt_savechar=ch ); + } + } + break; + + case ESC2SEEN: + cpt_outstat = NONESEEN; + if( ch!=0 ) + while( --ch ) + dataULen--,out.putc(cpt_savechar); + else + { + dataULen--,out.putc( ESC1 ); + dataULen--,out.putc( cpt_savechar=ESC2 ); + } + } +} + +void CArcCpt::cpt_rle_lzh() +{ + int block_count; + unsigned int bptr; + int Huffchar, LZlength, LZoffs; + + cpt_LZbuff[CIRCSIZE - 3] = 0; + cpt_LZbuff[CIRCSIZE - 2] = 0; + cpt_LZbuff[CIRCSIZE - 1] = 0; + cpt_LZptr = 0; + + while( dataULen!=0 ) + { + cpt_readHuff(256,cpt_Hufftree); + cpt_readHuff( 64,cpt_LZlength); + cpt_readHuff(128,cpt_LZoffs ); + block_count = 0; + cpt_newbits = (cpt.getc()<<8); + cpt_newbits = cpt_newbits | cpt.getc(); + cpt_newbits = cpt_newbits << 16; + cpt_bitsavail = 16; + while( block_count0 ) + cpt_outch(cpt_LZbuff[bptr++&(CIRCSIZE-1)]); + block_count += 3; + } + } + } +} + +int CArcCpt::gethuffbyte(node* l_nodelist) +{ + register node *np; + np = l_nodelist; + while(np->flag == 0) + np = cpt_getbit() ? np->one : np->zero; + return np->byte; +} + +void CArcCpt::cpt_readHuff(int size,node* Hufftree) +{ + sf_entry tree_entry[256 + SLACK]; + int tree_entries; + int tree_MaxLength; + int treeBytes, i, len; + sf_entry *ejm1; + int j; + sf_entry *entry; + sf_entry tmp; + int entries; + unsigned a, b; + int codelen, lvlstart, next, parents; + int tree_count[32]; + + treeBytes = cpt.getc(); + if( size0 ) + { + int c=cpt.getc(); + len = c >> 4; + + if(len != 0) + { + if(len > tree_MaxLength) + tree_MaxLength = len; + tree_count[len]++; + tree_entry[tree_entries].Value = i; + tree_entry[tree_entries++].BitLength = len; + } + i++; + len = c & 0x0f; + if(len != 0) + { + if(len > tree_MaxLength) + tree_MaxLength = len; + tree_count[len]++; + tree_entry[tree_entries].Value = i; + tree_entry[tree_entries++].BitLength = len; + } + i++; + } + + j = 0; + for( i=0; i<=tree_MaxLength; i++ ) + j = (j << 1) + tree_count[i]; + j = (1 < 0) && ((a = (ejm1 = &(entry[j - 1]))->BitLength) >= b)) + { + if((a == b) && (ejm1->Value <= tmp.Value)) + break; + *(ejm1 + 1) = *ejm1; + --j; + } + entry[j] = tmp; + } + + i = tree_entries - 1; + lvlstart = next = size * 2 + SLACK - 1; + for(codelen = tree_MaxLength; codelen >= 1; --codelen) + { + while((i >= 0) && (tree_entry[i].BitLength == codelen)) + { + Hufftree[next].byte = tree_entry[i].Value; + Hufftree[next].flag = 1; + next--; + i--; + } + parents = next; + if(codelen > 1) + { + for(j = lvlstart; j > parents + 1; j-= 2) + { + Hufftree[next].one = &(Hufftree[j]); + Hufftree[next].zero = &(Hufftree[j - 1]); + Hufftree[next].flag = 0; + next--; + } + } + lvlstart = parents; + } + Hufftree[0].one = &(Hufftree[next + 2]); + Hufftree[0].zero = &(Hufftree[next + 1]); + Hufftree[0].flag = 0; +} + +int CArcCpt::cpt_get6bits() +{ + int cn,b=(cpt_newbits >> 26) & 0x3f; + cpt_bitsavail -= 6; + cpt_newbits <<= 6; + if(cpt_bitsavail < 16) + { + cn = (cpt.getc() << 8); + cn |= cpt.getc(); + cpt_newbits |= (cn << (16 - cpt_bitsavail)); + cpt_bitsavail += 16; + } + return b; +} + +int CArcCpt::cpt_getbit() +{ + int b = (cpt_newbits >> 31) & 1; + cpt_bitsavail--; + if( cpt_bitsavail<16 ) + { + cpt_newbits |= (cpt.getc() << 8); + cpt_newbits |= cpt.getc(); + cpt_bitsavail += 16; + } + cpt_newbits <<= 1; + return b; +} ADDED ArcCpt.h Index: ArcCpt.h ================================================================== --- ArcCpt.h +++ ArcCpt.h @@ -0,0 +1,70 @@ +#ifndef AFX_ARCCPT_H__B5D13025_2DA9_4489_8BCB_ACB84B908A84__INCLUDED_ +#define AFX_ARCCPT_H__B5D13025_2DA9_4489_8BCB_ACB84B908A84__INCLUDED_ + +#include "Archiver.h" +#include "SubDlg.h" + +class CArcCpt : public CArchiver +{ +public: + CArcCpt() : CArchiver("cpt.bin.") {} + +private: + int v_load(){return aCheck|aMelt|aList|aMeltEach;} + bool v_check( const kiPath& aname ); + int v_contents( const kiPath& aname, kiPath& dname ); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); + bool v_list( const arcname& aname, aflArray& files ); + kiStr v_name(const char*) const { return "CPT"; } + + CArcProgressDlg* pdlg; + +//-- cpt archive operations ---------------- + + unsigned int m_nMacBinOffset; + unsigned int m_nIndexPos; + unsigned int dataULen, dataCLen; + + kiFile cpt,out; + unsigned char tmp[270]; // temp + + bool read_main_hdr(); + bool check_index_crc(); + bool operation_for_each( bool o_list=true, aflArray* files=NULL ); + bool recurse( bool o_list, aflArray* files, kiPath& path, int base, int num ); + void cptmelt( bool isRL ); + +//-- lzh - rle ------------------------------- + +#define CIRCSIZE 8192 + class sf_entry + { + public: + int Value; + int BitLength; + }; + class node + { + public: + int flag, byte; + node *one, *zero; + }; + + void cpt_outch( unsigned char ch ); + BYTE cpt_outstat,cpt_savechar; + void cpt_rle_lzh(); + int cpt_get6bits(); + int cpt_getbit(); + void cpt_readHuff(int size,node* Hufftree); + + int gethuffbyte(node* l_nodelist); +#define SLACK 6 + node cpt_Hufftree[512 + SLACK],cpt_LZlength[128 + SLACK],cpt_LZoffs[256 + SLACK]; + unsigned char cpt_LZbuff[CIRCSIZE]; + unsigned int cpt_LZptr; + unsigned long cpt_newbits; + int cpt_bitsavail; + int cpt_blocksize; +}; + +#endif ADDED ArcDLL.cpp Index: ArcDLL.cpp ================================================================== --- ArcDLL.cpp +++ ArcDLL.cpp @@ -0,0 +1,443 @@ + +#include "stdafx.h" +#include "ArcDLL.h" +#include "NoahApp.h" + +int CArcDLL::v_load() +{ + // DLLの存在確認 + if( !dll.exist() ) + return 0; + + // 圧縮メソッドリストを設定 + DWORD cp = set_cmpr_mhd(); + + // Abiltyを返す + return (m_Ecmd ? aCheck|aMelt : 0) | (m_Xcmd ? aList|aMeltEach : 0) | cp | (m_Scmd ? aSfx : 0); +} + +int CArcDLL::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + // 出力先をカレントに + ::SetCurrentDirectory( ddir ); + + // 解凍コマンド + kiStr cmd = ( !files || files->len()==0 ) ? m_Ecmd : m_Xcmd; + + // 書庫名 + cmd += " \"", cmd += aname.basedir, cmd += aname.lname, cmd += "\" \""; + // 出力先ディレクトリ + cmd += ddir, cmd += '"'; + + // ( もしあれば )ファイルリスト + if( files ) + for( unsigned int i=0; i!=files->len(); i++ ) + if( (*files)[i].selected ) + cmd += " \"", + decorate_add_melt( cmd, (*files)[i].inf.szFileName ), + cmd += '"'; + + // コマンド実行! + return dll.cmd( cmd ); +} + +int CArcDLL::v_compress( const kiPath& base, + const wfdArray& files, + const kiPath& ddir, + const int method, + const bool sfx ) +{ + // 基底はカレント + ::SetCurrentDirectory( base ); + + // ファイル名リスト作成 + kiStr lst; + for( unsigned int i=0; i!=files.len(); i++ ) + { + lst += '"'; + decorate_add_cmpr( lst, files[i].cFileName ); + if( files[i].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + if( m_Wild==1 ) + lst += "\\*"; + else if( m_Wild==2 ) + lst += "\\*.*"; + lst += "\" "; + } + + // 書庫名作成 + + // Ver 3.14 -- フォルダなら拡張子を除かない + // b2eの方は今更どーしようもないので、ここだけ変更 + // Ver 3.19 -- 削る拡張子は一個だけ + kiStr aname; + if( files[0].dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + { + aname = kiPath::name( files[0].cFileName ); + } + else + { + switch(mycnf().extnum()) + { + case 0: aname = files[0].cFileName;break; + case 1: kiPath(files[0].cFileName).getBody_all(aname);break; + default:kiPath(files[0].cFileName).getBody(aname);break; + } + } + + + // 圧縮! + if( sfx ) + { + kiPath tmp; + myapp().get_tempdir( tmp ); + + kiPath tsfx(tmp); tsfx+=aname; tsfx+=".exe"; + kiPath rsfx(ddir); rsfx+=aname; rsfx+=".exe"; + + int ans = cmpr( method, aname, tmp, lst ); + if( ans < 0x8000 ) + { + ans = 0x8020; + ::SetCurrentDirectory( tmp ); + if( arc2sfx( aname ) ) + if( ::CopyFile( tsfx, rsfx, FALSE ) ) + ans = 0; + // カレントを戻しておかないとあとで削除できない… + ::SetCurrentDirectory( base ); + } + + tmp.remove(); + return ans; + } + else + return cmpr( method, aname, ddir, lst ); +} + +int CArcDLL::cmpr( int mhd, kiStr& aname,const kiPath& to,const kiStr& lst ) +{ + aname += '.', aname+=get_cmpr_ext(mhd); + + kiStr cmd = get_cmpr_cmd(mhd); + cmd += " \""; + cmd += to; + cmd += aname; + cmd += "\" "; + cmd += lst; + return dll.cmd( cmd ); +} + +bool CArcDLL::arc2sfx( const kiStr& aname ) +{ + kiStr cmd=m_Scmd; cmd+=" \"", cmd+=aname, cmd+='"'; + return 0x8000>dll.cmd( cmd ); +} + +//----------------------------------------------------------------------// + +void CArcDLL::decorate_add_cmpr( kiStr& lst, const char* fname ) +{ + lst += fname; +} + +void CArcDLL::decorate_add_melt( kiStr& lst, const char* fname ) +{ + lst += fname; +} + +void CArcDLL_DotSlash::decorate_add_cmpr( kiStr& lst, const char* fname ) +{ + // 先頭 - や @ 対策に、.\\ でエスケープする + if( *fname=='-' || *fname=='@' ) + lst += ".\\"; + lst += fname; +} + +void CArcLzh::decorate_add_cmpr( kiStr& lst, const char* fname ) +{ + // UNLHA32.DLL にはこの問題回避用のオプション -gb が。 + if( *fname=='-' ) + lst += "-gb"; + lst += fname; +} + +void CArcLzh::decorate_add_melt( kiStr& lst, const char* fname ) +{ + // UNLHA32.DLL にはこの問題回避用のオプション -gb が。 + if( *fname=='-' ) + lst += "-gb"; + lst += fname; +} + +void CArcZip::decorate_add_cmpr( kiStr& lst, const char* fname ) +{ + // 先頭 - や @ 対策に、[-] [@] と置換する + if( *fname=='-' || *fname=='@' ) + lst+='[', lst+=*fname++, lst+=']'; + + // 途中の [ を [[] に置換する + while( *fname ) + if( kiStr::isLeadByte(*fname) ) + { + lst += *fname++, lst += *fname++; + } + else + { + lst += *fname; + if( *fname++=='[' ) + lst += "[]"; + } +} + +//----------------------------------------------------------------------// + +DWORD CArcLzh::set_cmpr_mhd() +{ + set_cmp_ext( "lzh" ); + add_cmp_mhd( "lh5" ), add_cmp_mhd( "lh6" ), add_cmp_mhd( "lh7" ); + return aCompress|aArchive; +} + +const char* CArcLzh::get_cmpr_cmd( int method ) +{ + static char cmd[] = "a -d -jso1 -- -jm2"; + cmd[ sizeof(cmd)-2 ] = (char)('2'+method); + return cmd; +} + +//----------------------------------------------------------------------// + +DWORD CArcZip::set_cmpr_mhd() +{ + set_cmp_ext( "zip" ); + add_cmp_mhd( "store" ), + add_cmp_mhd( "normal", true ), add_cmp_mhd( "password" ); + return aCompress|aArchive; +} + +const char* CArcZip::get_cmpr_cmd( int method ) +{ + switch( method ) + { + case 0: return "-rS0"; + case 2: return "-rS9e"; + } + return "-rS9"; +} + +//----------------------------------------------------------------------// + +DWORD CArcCab::set_cmpr_mhd() +{ + set_cmp_ext( "cab" ); + add_cmp_mhd( "MSZIP" ), add_cmp_mhd( "LZX21",true ); + return aCompress|aArchive; +} + +const char* CArcCab::get_cmpr_cmd( int method ) +{ + return method==0 ? "-a -r -mz" : "-a -r -ml:21"; +} + +//----------------------------------------------------------------------// + +DWORD CArcTar::set_cmpr_mhd() +{ + set_cmp_ext( "tar" ); + add_cmp_mhd( "normal" ), add_cmp_mhd( "gzip",true ), add_cmp_mhd( "bzip2" ); + add_cmp_mhd( "xz" ), add_cmp_mhd( "lzma" ); + return aCompress|aArchive; +} + +const char* CArcTar::get_cmpr_ext( int method ) +{ + switch( method ) + { + case 1: return "tgz"; + case 2: return "tbz"; + case 3: return "tar.xz"; + case 4: return "tar.lzma"; + } + return "tar"; +} + +const char* CArcTar::get_cmpr_cmd( int method ) +{ + switch( method ) + { + case 1: return "-cvz9 --"; + case 2: return "-cvB --"; + case 3: return "-cvJ9 --"; + case 4: return "-cv --lzma=9 --"; + } + return "-cv --"; +} + +//----------------------------------------------------------------------// + +DWORD CArcBga::set_cmpr_mhd() +{ + set_cmp_ext( "bga" ); + add_cmp_mhd( "gzip" ), add_cmp_mhd( "bzip2",true ); + return aCompress|aArchive; +} + +const char* CArcBga::get_cmpr_ext( int method ) +{ + return method==0 ? "gza" : "bza"; +} + +const char* CArcBga::get_cmpr_cmd( int method ) +{ + return "a -r -a"; +} + +//----------------------------------------------------------------------// + +DWORD CArcYz1::set_cmpr_mhd() +{ + set_cmp_ext( "yz1" ); + add_cmp_mhd( "normal" ), add_cmp_mhd( "password" ); + return aCompress|aArchive; +} + +const char* CArcYz1::get_cmpr_cmd( int method ) +{ + return method==0 ? "c --" : "c -p --"; +} + +//----------------------------------------------------------------------// + +bool CArcRar::v_check( const kiPath& aname ) +{ + // Unrar.dll のバグ?のため、ファイルハンドルが解放されないことが + // あるので、自前のチェックルーチンを用いる + // # Subset of XacRett #39 + + bool ans=false; + kiFile rar; + if( !rar.open(aname) ) + return false; + + unsigned char mark[10]; + if( 10!=rar.read(mark,10) ) + return false; + + if( mark[0]==0x52 && mark[1]==0x45 && mark[2]==0x7e && mark[3]==0x5e ) + return true; + else if( mark[0]==0x52 && mark[1]==0x61 && + mark[2]==0x72 && mark[3]==0x21 && + mark[4]==0x1a && mark[5]==0x07 && + mark[6]==0x00 && mark[9]==0x73 ) + return true; + else + { + unsigned char* mem=new unsigned char[0x20000]; + int siz = rar.read( mem, 0x1FFF0 ); + + for( unsigned char* p=mem; plen() ) + dll.own( app()->mainhwnd() ); + + int ans = CArcDLL::v_melt( aname, ddir, files ); + + if( files && files->len() ) + dll.fre(); + + return ans; +} + +int CArcUnZip::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + // UnZip32.dllが妙なフォルダを作り出すバグ対策 + + int ans = CArcDLL::v_melt( aname, ddir, files ); + dll.unload(); + return ans; +} + +//----------------------------------------------------------------------// + +DWORD CArc7z::set_cmpr_mhd() +{ + set_cmp_ext( "7z" ); + add_cmp_mhd( "LZMA", true ); + add_cmp_mhd( "LZMA(std)" ); + add_cmp_mhd( "LZMA(fast)" ); + add_cmp_mhd( "PPMd" ); + return aCompress|aArchive; +} + +const char* CArc7z::get_cmpr_cmd( int method ) +{ + if( m_SfxMode ) + switch( method ) + { + case 0: return "a -t7z -sfx -m0=LZMA -r0 -mx=9 --"; + case 1: return "a -t7z -sfx -m0=LZMA -r0 -mx=5 --"; + case 2: return "a -t7z -sfx -m0=LZMA -r0 -mx=1 --"; + default: return "a -t7z -sfx -m0=PPMd -r0 -mx=9 --"; + } + else + switch( method ) + { + case 0: return "a -t7z -m0=LZMA -r0 -mx=9 --"; + case 1: return "a -t7z -m0=LZMA -r0 -mx=5 --"; + case 2: return "a -t7z -m0=LZMA -r0 -mx=1 --"; + default: return "a -t7z -m0=PPMd -r0 -mx=9 --"; + } +} + +int CArc7z::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ) +{ + m_SfxMode = sfx; // 処理を横取りしてSFXモードを記憶 + return CArcDLL::v_compress(base,files,ddir,method,false); +} + +const char* CArc7z::get_cmpr_ext( int method ) +{ + return m_SfxMode ? "exe" : "7z"; +} + +//----------------------------------------------------------------------// + +DWORD CArc7zZip::set_cmpr_mhd() +{ + set_cmp_ext( "zip" ); + add_cmp_mhd( "7-zip", true ); + return aCompress|aArchive; +} + +const char* CArc7zZip::get_cmpr_cmd( int method ) +{ + return "a -tzip -r0 -mx=9 --"; +} + +int CArc7zZip::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ) +{ + // 処理を横取りして通常圧縮 + return CArcDLL::v_compress(base,files,ddir,method,false); +} + ADDED ArcDLL.h Index: ArcDLL.h ================================================================== --- ArcDLL.h +++ ArcDLL.h @@ -0,0 +1,307 @@ +#ifndef AFX_ARCDLL_H__911C109D_A40E_4722_A6F7_E3ACB8C2D2E3__INCLUDED_ +#define AFX_ARCDLL_H__911C109D_A40E_4722_A6F7_E3ACB8C2D2E3__INCLUDED_ + +#include "Archiver.h" + +class CArcDLL : public CArchiver +{ +public: + CArcDLL( + const char* Dllname, // DLL名 + const char* Exts, // 対応拡張子 + const char* Ecmd, // 解凍用コマンド + const char* Xcmd, // 部分解凍用コマンド + unsigned int Wild=1, // ワイルドカードの形式( 0=no(*) 1=* 2=*.* ) + const char* Scmd=NULL )// SFX変換用コマンド + : dll( Dllname ), CArchiver( Exts ), m_Ecmd( Ecmd ), + m_Xcmd( Xcmd ), m_Wild( Wild ), m_Scmd( Scmd ) {} + +protected: //-- 派生してもよし + virtual DWORD set_cmpr_mhd() + { return 0; } + virtual const char* get_cmpr_ext( int method ) + { return cmp_ext(); } + virtual const char* get_cmpr_cmd( int method ) + { return ""; } + virtual void decorate_add_cmpr( kiStr& lst, const char* fname ); + virtual void decorate_add_melt( kiStr& lst, const char* fname ); + +protected: //-- 内部処理 + CArcModule dll; + bool v_ver( kiStr& str ){ dll.ver(str); return true; } + bool v_check( const kiPath& aname ){ return dll.chk(aname); } + int v_contents( const kiPath& aname, kiPath& dname ){ return dll.cnt(aname,dname,m_Wild==2?"*.*":"*"); } + bool v_list( const arcname& aname, aflArray& files ){ return dll.lst_dll(aname,files,m_Wild==2?"*.*":"*"); } + + int v_load(); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); + int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); + kiStr v_name(const char*) const { return dll.name(); } + +private: + const char *m_Ecmd, *m_Xcmd, *m_Scmd; + unsigned int m_Wild; + int cmpr( int mhd, kiStr& aname,const kiPath& to,const kiStr& lst ); + bool arc2sfx( const kiStr& aname ); +}; + +//------------------------------------------------------------// + +class CArcDLL_DotSlash : public CArcDLL +{ + // "./-" や "./@" とすることでとりあえず無理矢理圧縮する形式 + virtual void decorate_add_cmpr( kiStr& lst, const char* fname ); + +protected: + CArcDLL_DotSlash( + const char* Dllname, + const char* Exts, + const char* Ecmd, + const char* Xcmd, + unsigned int Wild=1, + const char* Scmd=NULL ) + : CArcDLL( Dllname, Exts, Ecmd, Xcmd, Wild, Scmd ) {} +}; + +//------------------------------------------------------------// + +class CArcRar : public CArcDLL +{ +public: + CArcRar() : CArcDLL( + "Unrar32.dll", + "rar.", + "-x", + "-x -s -y --" ) {} + +private: + kiStr v_name(const char*) const { return "RAR"; } + // 特別に派生 + bool v_check( const kiPath& aname ); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); +}; + +//------------------------------------------------------------// + +class CArcUnZip : public CArcDLL +{ +public: + CArcUnZip() : CArcDLL( + "UnZip32.dll", + "zip.jar.", + "-x", + "-x --i -o" ) {} +private: + kiStr v_name(const char*) const { return "ZIP"; } + // 特別に派生 + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); +}; + +//------------------------------------------------------------// + +class CArcLzh : public CArcDLL +{ +public: + CArcLzh() : CArcDLL( + "Unlha32.dll", + "lzh.lha.lzs.", + "x -a1 -jf0", + "x -a1 -jf0 -jyo -p1 -n -gm --", + 0, + "s -gw3 -x1" ) {} +private: + kiStr v_name(const char*) const { return "LZH"; } + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); + void decorate_add_cmpr( kiStr& lst, const char* fname ); + void decorate_add_melt( kiStr& lst, const char* fname ); +}; + +//------------------------------------------------------------// + +class CArcZip : public CArcDLL +{ +public: + CArcZip() : CArcDLL( + "Zip32j.dll", + "", + NULL, + NULL, + 1, + "--sfx" ) {} +private: + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); + void decorate_add_cmpr( kiStr& lst, const char* fname ); +}; + +//------------------------------------------------------------// + +class CArcCab : public CArcDLL_DotSlash +{ +public: + CArcCab() : CArcDLL_DotSlash( + "Cab32.dll", + "cab.", + "-x", + "-x -i -o", + 1, + "-f" ) {} +private: + kiStr v_name(const char*) const { return "CAB"; } + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); +}; + +//------------------------------------------------------------// + +class CArcTar : public CArcDLL_DotSlash +{ +public: + CArcTar() : CArcDLL_DotSlash( + "Tar32.dll", + "tar.tgz.tbz.gz.bz2.z.taz.rpm.deb.ar.xz.lzma.", + "-xvf", + "--check-all-path=1 --display-dialog=0 -xvf", + 2 ) {} +private: + #define ARCHIVETYPE_NORMAL 0 + #define ARCHIVETYPE_TAR 1 + #define ARCHIVETYPE_TARGZ 2 + #define ARCHIVETYPE_TARZ 3 + #define ARCHIVETYPE_GZ 4 + #define ARCHIVETYPE_Z 5 + #define ARCHIVETYPE_TARBZ2 6 + #define ARCHIVETYPE_BZ2 7 + + #define ARCHIVETYPE_CPIO 32 + #define ARCHIVETYPE_CPIOGZ 32+4 + #define ARCHIVETYPE_CPIOZ 32+5 + #define ARCHIVETYPE_CPIOBZ2 32+7 + + #define ARCHIVETYPE_AR 48 + #define ARCHIVETYPE_ARGZ 48+4 + #define ARCHIVETYPE_ARZ 48+5 + #define ARCHIVETYPE_ARBZ2 48+7 + kiStr v_name(const char* an) const { switch(dll.arctype(an)) { + case ARCHIVETYPE_GZ: return "GZ"; + case ARCHIVETYPE_Z: return "Z"; + case ARCHIVETYPE_BZ2: return "BZ2"; + case ARCHIVETYPE_TARGZ: return "TAR+GZ"; + case ARCHIVETYPE_TARZ: return "TAR+Z"; + case ARCHIVETYPE_TARBZ2: return "TAR+BZ2"; + case ARCHIVETYPE_CPIOGZ: return kiStr("rpm").isSame(kiPath::ext(an)) ? "RPM" : "CPIO+GZ"; + case ARCHIVETYPE_CPIOZ: return "CPIO+Z"; + case ARCHIVETYPE_CPIOBZ2:return "CPIO+BZ2"; + case ARCHIVETYPE_ARGZ: return "AR+GZ"; + case ARCHIVETYPE_ARZ: return "AR+Z"; + case ARCHIVETYPE_ARBZ2: return "AR+BZ2"; + case ARCHIVETYPE_AR: return "AR"; + case ARCHIVETYPE_CPIO: return "CPIO"; + default: return "TAR"; + }} + const char* get_cmpr_ext( int method ); + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); +}; + +//------------------------------------------------------------// + +class CArcBga : public CArcDLL_DotSlash +{ +public: + CArcBga() : CArcDLL_DotSlash( + "Bga32.dll", + "gza.bza.", + "x -a", + "x -a -i -o", + 0, + "s" ) {} +private: + kiStr v_name(const char* an) const { return dll.arctype(an)==2 ? "BZA" : "GZA"; } + const char* get_cmpr_ext( int method ); + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); +}; + +//------------------------------------------------------------// + +class CArcYz1 : public CArcDLL +{ +public: + CArcYz1() : CArcDLL( + "Yz1.dll", + "yz1.", + "x", + "x -y -z -i2 --", + 0, + "s" ) {} +private: + kiStr v_name(const char*) const { return "YZ1"; } + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); +}; + +//------------------------------------------------------------// + +class CArcArj : public CArcDLL +{ +public: + CArcArj() : CArcDLL + ( "Unarj32j.dll", "arj.", "x -jyc", "x -y -p -hm -i -!" ) {} + +private: + kiStr v_name(const char*) const { return "ARJ"; } +}; + +//------------------------------------------------------------// + +class CArcGca : public CArcDLL +{ +public: + CArcGca() : CArcDLL + ( "UnGCA32.dll", "gca.", "e -sx1", "ex -xx1 -sx0 -yx0" ) {} + +private: + kiStr v_name(const char*) const { return "GCA"; } +}; + +//------------------------------------------------------------// + +class CArc7z : public CArcDLL_DotSlash +{ +public: + CArc7z() : CArcDLL_DotSlash( + "7-zip32.dll", + "7z.zip.jar.", + "x --", + "x -y -hide --", + 1, + "" ) {} +private: + kiStr v_name(const char* an) const { return dll.arctype(an)==1 ? "ZIP" : "7Z"; } + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); + const char* get_cmpr_ext( int method ); + virtual int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); + bool m_SfxMode; +}; + +//------------------------------------------------------------// + +class CArc7zZip : public CArcDLL_DotSlash +{ +public: + CArc7zZip() : CArcDLL_DotSlash( + "7-zip32.dll", + "",NULL,NULL,1,"" ) {} +private: + DWORD set_cmpr_mhd(); + const char* get_cmpr_cmd( int method ); + virtual bool v_ver( kiStr& ){return false;}//CArc7zに任せる + virtual int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); +}; + +//------------------------------------------------------------// + +#endif ADDED ArcMsc.cpp Index: ArcMsc.cpp ================================================================== --- ArcMsc.cpp +++ ArcMsc.cpp @@ -0,0 +1,455 @@ + +#include "stdafx.h" +#include "ArcMsc.h" +#include "NoahApp.h" + +bool CArcMsc::header( kiFile& fp, unsigned long* siz, char* ext ) +{ + // 読み出す + unsigned char p[14]; + if( 14!=fp.read(p,14) ) + return false; + + // ヘッダ構造:SZDD芋'3A [ext3rd] [orisiz(dword)] + static const unsigned char head[9]={ 0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33,0x41 };//="SZDD芋'3A"; + + for( int i=0; i!=9; i++ ) + if( p[i]!=head[i] ) + return false; + + if( ext ) + *ext = (char)p[9]; + + DWORD x = p[10]+(p[11]<<8)+(p[12]<<16)+(p[13]<<24); + if( siz ) + *siz=x; + + // 原理的に、16倍という圧縮率は出ない + return (x <= fp.getSize()*16); +} + +void CArcMsc::filename( char* oname, const char* ol, char ext ) +{ + // コピー + ki_strcpy( oname, ol ); + + // 最後が '_' なら消しておく。 + bool bIs_=false; + for( char* p=oname; *p; p=kiStr::next(p) ) + bIs_ = (*p=='_'); + if( bIs_ ) + *(--p)='\0'; + + + if( ext ) + { + // 拡張子復元 + *p++ = ext; + *p = '\0'; + } + else + { + // 拡張子自動補完 + const char* x = kiPath::ext(oname); + if( ki_strlen(x)==2 ) + { + ::CharLower(oname); + + if( 0==ki_strcmp(x,"ex") )(*p++)='e'; + else if( 0==ki_strcmp(x,"co") )(*p++)='m'; + else if( 0==ki_strcmp(x,"sc") )(*p++)='r'; + + else if( 0==ki_strcmp(x,"dl") )(*p++)='l'; + else if( 0==ki_strcmp(x,"oc") )(*p++)='x'; + else if( 0==ki_strcmp(x,"dr") )(*p++)='v'; + else if( 0==ki_strcmp(x,"vx") )(*p++)='d'; + else if( 0==ki_strcmp(x,"38") )(*p++)='6'; + else if( 0==ki_strcmp(x,"sy") )(*p++)='s'; + else if( 0==ki_strcmp(x,"cp") )(*p++)='l'; + else if( 0==ki_strcmp(x,"li") )(*p++)='b'; + else if( 0==ki_strcmp(x,"tt") )(*p++)='f'; + + else if( 0==ki_strcmp(x,"ch") )(*p++)='m'; + else if( 0==ki_strcmp(x,"hl") )(*p++)='p'; + else if( 0==ki_strcmp(x,"cn") )(*p++)='t'; + else if( 0==ki_strcmp(x,"da") )(*p++)='t'; + + else if( 0==ki_strcmp(x,"tx") )(*p++)='t'; + else if( 0==ki_strcmp(x,"wr") )(*p++)='i'; + else if( 0==ki_strcmp(x,"wa") )(*p++)='v'; + else if( 0==ki_strcmp(x,"mi") )(*p++)='d'; + else if( 0==ki_strcmp(x,"rm") )(*p++)='i'; + else if( 0==ki_strcmp(x,"bm") )(*p++)='p'; + else if( 0==ki_strcmp(x,"rl") )(*p++)='e'; + else if( 0==ki_strcmp(x,"cu") )(*p++)='r'; + else if( 0==ki_strcmp(x,"do") )(*p++)='c'; + else if( 0==ki_strcmp(x,"ic") )(*p++)='o'; + else if( 0==ki_strcmp(x,"re") )(*p++)='g'; + else if( 0==ki_strcmp(x,"rt") )(*p++)='f'; + else if( 0==ki_strcmp(x,"ht") )(*p++)='m'; + else (*p++)='#'; + + *p = '\0'; + } + } +} + +bool CArcMsc::v_check( const kiPath& aname ) +{ + kiFile fp; + if( fp.open( aname ) ) + return header( fp,NULL,NULL ); + return false; +} + +bool CArcMsc::v_list( const arcname& aname, aflArray& files ) +{ + kiPath fname(aname.basedir); fname+=aname.lname; + + arcfile x; + kiFile fp; + char ext; + if( !fp.open( fname ) || !header( fp, &x.inf.dwOriginalSize, &ext ) ) + return false; + ki_strcpy( x.inf.szMode, "-msc-" ); + filename( x.inf.szFileName, aname.lname, ext ); + x.inf.dwCompressedSize = fp.getSize(); + x.isfile = true; + + // TODO: 日時をどうする? + + files.add( x ); + return true; +} + +int CArcMsc::v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + kiFile fp; + kiPath fname(aname.basedir); fname+=aname.lname; + kiPath oname(ddir); + char tmp[MAX_PATH]; + + // ヘッダ読み込み + char ext; + unsigned long alllen; + if( !fp.open( fname ) || !header(fp,&alllen,&ext) ) + return 0xffff; + fp.close(); + filename( tmp, aname.lname, ext ); + oname += tmp; + + // 書庫・出力先を開く + OFSTRUCT of; + of.cBytes = sizeof(of); + int FROM = ::LZOpenFile( const_cast((const char*)fname),&of,OF_READ ); + int TO = ::LZOpenFile( const_cast((const char*)oname),&of,OF_WRITE|OF_CREATE ); + if( FROM<0 || TO<0 ) + return 0xffff; + // 解凍 + bool ans = (0<=::LZCopy( FROM,TO )); + // 終了 + ::LZClose( TO ); + ::LZClose( FROM ); + return ans?0:0xffff; +} + +int CArcMsc::v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ) +{ + ::SetCurrentDirectory( base ); + + // 元ファイルを開く + kiFile in; + if( !in.open( files[0].cFileName ) ) + return 0xffff; + + // ヘッダ情報・圧縮先ファイル名 + char h_Ext3 = '\0'; + unsigned long h_Len = in.getSize(); + + char aname[MAX_PATH]; + ki_strcpy( aname, files[0].cFileName ); + for( char *x=aname, *last=aname; *x; x=kiStr::next(x) ) + last = x; + if( !IsDBCSLeadByte(*last) ) + h_Ext3=*last; + *last = '_', *(last+1) = '\0'; + + // 圧縮先開く + ::SetCurrentDirectory( ddir ); + + // 圧縮先を開く + kiFile out; + if( !out.open( aname, false ) ) + return 0xffff; + + // タイムスタンプコピー + FILETIME ct, at, mt; + ::GetFileTime(in.getHandle(), &ct, &at, &mt); + ::SetFileTime(out.getHandle(), &ct, &at, &mt); + + // ヘッダ書き込み + unsigned char head[14]={ 0x53,0x5A,0x44,0x44,0x88,0xF0,0x27,0x33,0x41,(unsigned char)h_Ext3, + (unsigned char)(h_Len&0xff),(unsigned char)((h_Len>>8)&0xff), + (unsigned char)((h_Len>>16)&0xff),(unsigned char)((h_Len>>24)&0xff) }; + out.write( head, 14 ); + + // 圧縮作業 + CArcProgressDlg dlg( h_Len, true ); + dlg.change( files[0].cFileName ); + if( !do_lzss( in, out, dlg ) ) + { + out.close(); + ::DeleteFile(aname); + return 0x8020; + } + return 0; +} + + +//-- 12bit LZSS -----------------------------------------------// + + +#define N 4096 // slide窓のサイズ 2^12 bytes +#define F 18 // 最長一致長 2^(16-12)+2 bytes + +static unsigned char window[N+F-1]; +static int dad[N+1], lson[N+1], rson[N+257]; +static int matchpos, matchlen; + +static void init_tree() +{ + //-- 木を初期化 + + int i; + for( i=N+1; i<=N+256; i++ ) // root: 0x00 -- 0xff + rson[i] = N; + for( i=0; i= 0 ) + { + // 右に進む + if( rson[p] != N ) + p = rson[p]; + // 右にはもうnodeがないのでそこに登録して終了 + else + { + rson[p] = r; + dad[r] = p; + return; + } + } + else + { + // 左に進む + if( lson[p] != N ) + p = lson[p]; + // 左にはもうnodeがないのでそこに登録して終了 + else + { + lson[p] = r; + dad[r] = p; + return; + } + } + + // 現在のnodeとstrを比較( i==一致長 ) + for( i=1; i matchlen ) + { + matchpos = p; + if( (matchlen=i) == F ) + break; + } + } + + // [位置p]の列と長さFで一致した場合、ここに来る + // p の在ったところを r で置き換える + + dad[r] = dad[p]; + lson[r] = lson[p]; + rson[r] = rson[p]; + dad[lson[p]] = r; + dad[rson[p]] = r; + + if( rson[dad[p]]==p ) + rson[dad[p]] = r; + else + lson[dad[p]] = r; + + dad[p] = N; +} + +static void delete_node( int p ) +{ + //-- [位置p]の要素を木から削除 + + if( dad[p] == N ) // 既に木に入ってないのでおしまい + return; + + int q; + + if( rson[p] == N ) + q = lson[p]; // 唯一の子を上に持ち上げる + else if( lson[p] == N ) + q = rson[p]; // 唯一の子を上に持ち上げる + else + { + q = lson[p]; + + if( rson[q] != N ) + { + // 左の枝の最右、つまり自分より一つ小さいnodeを持ち上げる + do + q = rson[q]; + while( rson[q] != N ); + + rson[dad[q]] = lson[q]; + dad[lson[q]] = dad[q]; + lson[q] = lson[p]; + dad[lson[p]] = q; + } + rson[q] = rson[p]; + dad[rson[p]] = q; + } + + dad[q] = dad[p]; + if( rson[dad[p]] == p ) + rson[dad[p]] = q; + else + lson[dad[p]] = q; + dad[p] = N; +} + +bool CArcMsc::do_lzss( kiFile& in, kiFile& out, CArcProgressDlg& dlg ) +{ + int i, c, len, r, s; + unsigned char code[17]={0}, mask=1, codeptr=1; + + s = 2; // s = データ読込位置 + r = N - 16; // r = 木への挿入位置 + + // クリア + init_tree(); + ki_memset( window+2, ' ', N-F ); + + // 先頭18bytes入力 + for( len=0 ; len=0 ; i-- ) + insert_node( r-i ); + + // ループ + unsigned int total_read=18,prgr_read=0; + + do + { + if( prgr_read > 5000 ) + { + dlg.change( NULL, total_read+=prgr_read ); + prgr_read-=5000; + if( !dlg.msgloop() ) + { + prgr_read=0xffffffff; + break; + } + } + + if( matchlen > len ) + matchlen=len; + + if( matchlen < 3 ) // 一致なし + { + matchlen = 1; + code[0] |= mask; + code[codeptr++] = window[r]; + } + else // 一致あり + { + // [pos&0xff] [pos&0xf00 | len-3] + code[codeptr++] = (unsigned char)matchpos; + code[codeptr++] = (unsigned char)(((matchpos>>4)&0xf0) | (matchlen-3)); + } + + if( (mask<<=1)==0 ) // code が 8Block になっていたら出力 + { + out.write( code, codeptr ); + // コードバッファ初期化 + code[0] = 0; + codeptr = mask = 1; + } + + // 出力した分読み込む + int lastmatchlen = matchlen; + for( i=0 ; i 0 ); + + if( prgr_read==0xffffffff ) + return false; + + // 8block境界に揃える + if( mask != 1 ) + { + while( mask<<=1 ) + code[codeptr++] = 0; + out.write( code, codeptr ); + } + + return true; +} + ADDED ArcMsc.h Index: ArcMsc.h ================================================================== --- ArcMsc.h +++ ArcMsc.h @@ -0,0 +1,32 @@ +#ifndef AFX_ARCMSC_H__1891072B_44D7_4577_AF05_6D221A2FD0DD__INCLUDED_ +#define AFX_ARCMSC_H__1891072B_44D7_4577_AF05_6D221A2FD0DD__INCLUDED_ + +#include "Archiver.h" +#include "SubDlg.h" + +class CArcMsc : public CArchiver +{ +public: + CArcMsc() : CArchiver("") {} + +private: + int v_load() + { + set_cmp_ext( "??_" ), add_cmp_mhd( "MSCompress" ); + return aCheck|aMelt|aList|aMeltEach|aCompress; + } + int v_contents( const kiPath& aname, kiPath& dnam ){return aSingleFile;} + + bool v_check( const kiPath& aname ); + int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ); + bool v_list( const arcname& aname, aflArray& files ); + int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); + kiStr v_name(const char*) const { return "MSCompress"; } + +private: + bool header( kiFile& fp, unsigned long* siz, char* ext ); + void filename( char* oname, const char* ol, char ext ); + bool do_lzss( kiFile& in, kiFile& out, CArcProgressDlg& dlg ); +}; + +#endif ADDED Archiver.cpp Index: Archiver.cpp ================================================================== --- Archiver.cpp +++ Archiver.cpp @@ -0,0 +1,447 @@ +// Archiver.cpp +//-- CArchiver -- common interface in 'Noah' for archiving routine -- + +#include "stdafx.h" +#include "Archiver.h" +#include "NoahApp.h" + + + +CArcModule::CArcModule( const char* name, bool us ) + : m_dll(NULL) +{ + // SearchPathの前にカレントディレクトリをnoah.exeと同じ場所へ + char prev_cur[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, prev_cur); + kiSUtil::switchCurDirToExeDir(); + + if( 0!=::SearchPath( NULL,name,NULL,MAX_PATH,m_name,NULL ) ) + { + const char* xt=kiPath::ext(name); + if( 0!=ki_strcmpi("dll",xt) ) + { + // EXEの場合 + m_type = us ? EXEUS : EXE; + } + else + { + // DLLの場合 + m_dll = new kiArcDLLRaw(name); + m_type = DLL; + if(name<=xt-8&&xt[-6]=='G'&&xt[-5]=='C'&&xt[-4]=='A' ) + m_type = DLLGCA; + else if(name==xt-6&&xt[-6]=='B'&&xt[-5]=='g'&&xt[-4]=='a' ) + m_type = DLLBGA; + } + } + else + { + // ファイルが無いか、シェルのコマンドの場合 + // バッファオーバーフローの危険…(^^; + ki_strcpy( m_name, name ); + m_type = SHLCMD; + } + + // カレントを戻す + ::SetCurrentDirectory(prev_cur); +} + +CArcModule::~CArcModule() +{ + delete m_dll; +} + +int CArcModule::cmd( const char* cmd, bool mini ) +{ + if( m_dll ) + { + // アーカイバDLLモードなら簡単に終了 + char buf[1024]; + return m_dll->command( NULL, cmd, buf, sizeof(buf) ); + } + + // NTかどうかのチェック等 + kiPath tmpdir; + static const bool isNT = + (app()->osver().dwPlatformId==VER_PLATFORM_WIN32_NT); + static const char* const closeShell = + (isNT ? "cmd.exe /c " : "command.com /c "); + + // コマンド文字列作成 + kiVar theCmd( m_name ); + theCmd.quote(); + theCmd += ' '; + theCmd += cmd; + + if( m_type==SHLCMD ) + { + // シェルコマンドの場合 + theCmd = closeShell + theCmd; + } + else if( m_type==EXEUS ) + { + // USモードの場合 + if( isNT ) + { + ::SetEnvironmentVariable( "NOAHCMD", theCmd ); + theCmd = "%NOAHCMD%"; + } + + // 切替バッチファイル生成 + myapp().get_tempdir(tmpdir); + kiPath batname(tmpdir); + batname += "ncmd.bat"; + kiFile bat; + bat.open( batname,false ); + bat.write( "@CHCP 437\r\n@", 12 ); + bat.write( theCmd, theCmd.len() ); + bat.write( "\r\n@CHCP 932\r\n", 13 ); + + theCmd = closeShell; + theCmd += batname; + } + + // プロセス開始 + PROCESS_INFORMATION pi; + STARTUPINFO si={sizeof(STARTUPINFO)}; + si.dwFlags =STARTF_USESHOWWINDOW; + si.wShowWindow=mini?SW_MINIMIZE:SW_SHOW; + if( !::CreateProcess( NULL,const_cast((const char*)theCmd), + NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS, + NULL,NULL, &si,&pi ) ) + return 0xffff; + + // 終了待機 + ::CloseHandle( pi.hThread ); + while( WAIT_OBJECT_0 != ::WaitForSingleObject( pi.hProcess, 500 ) ) + kiWindow::msg(); + int ex; + ::GetExitCodeProcess( pi.hProcess, (DWORD*)&ex ); + ::CloseHandle( pi.hProcess ); + + // 後始末 + if( m_type==EXEUS ) + tmpdir.remove(); + return ex; +} + +void CArcModule::ver( kiStr& str ) +{ + // バージョン情報を整形して表示 + char *verstr="----", buf[200]; + if( m_dll ) + { + if( WORD ver=m_dll->getVer() ) + { + WORD sub=m_dll->getVerSub(); + ::wsprintf( verstr=buf, "%d.%02d%c", ver/100, ver%100, (sub<100)?0:sub/100+'a'-1 ); + } + } + else if( m_type != NOTEXIST ) + { + // 可能ならリソースからの取得を試みる + if( CArchiver::GetVersionInfoStr( m_name, buf, sizeof(buf) ) ) + verstr = buf; + else + verstr = "OK!"; + } + + char ans[300]; + ::wsprintf( ans, "%-12s %s", kiPath::name(m_name), verstr ); + str = ans; +} + +bool CArcModule::lst_dll( const arcname& aname, aflArray& files, const char* wild ) +{ + if( !m_dll ) + return false; + kiPath nm(aname.basedir); nm+=aname.lname; + HANDLE h = m_dll->openArc( app()->mainhwnd(), nm, M_CHECK_FILENAME_ONLY|M_ERROR_MESSAGE_OFF ); + if( !h ) return false; + + int ct=0; + files.forcelen( 1 ); + if( 0==m_dll->findfirst( h, wild, &files[0].inf ) ) + { + do + { + INDIVIDUALINFO& iii = files[ct].inf; + files[ct].isfile = + ( *files[ct].inf.szAttribute!='d' + && !kiPath::endwithyen(files[ct].inf.szFileName) + && !(m_dll->getAttr( h )&FILE_ATTRIBUTE_DIRECTORY) ); + files.forcelen( 1+(++ct) ); + } while( 0==m_dll->findnext( h, &files[ct].inf ) ); + } + files.forcelen( ct ); + + m_dll->closeArc( h ); + return true; +} + +int CArcModule::cnt( const kiPath& aname, kiPath& dname, const char* wild ) +{ + int ans = aUnknown; + + if( m_dll ) + if( HANDLE h = m_dll->openArc( app()->mainhwnd(), aname, M_CHECK_FILENAME_ONLY|M_ERROR_MESSAGE_OFF ) ) + { + INDIVIDUALINFO inf1st, inf; + if( 0==m_dll->findfirst( h, wild, &inf1st ) ) + { + for( const char* y=inf1st.szFileName; *y && *y!='\\' && *y!='/'; y=kiPath::next(y) ); + if( y!=inf1st.szFileName ) + { + if( 0!=m_dll->findnext( h, &inf ) ) + ans = *y ? aSingleDir : aSingleFile; + else if( *y && (y-inf1st.szFileName!=1 || inf1st.szFileName[0]!='.') ) + { + ans = aSingleDir; + do + if( !ki_memcmp( inf1st.szFileName, inf.szFileName, (y-inf1st.szFileName)+1 ) ) + { + ans = aUnknown; + break; + } + while( 0==m_dll->findnext( h, &inf ) ); + } + if( ans==aSingleDir ) + inf1st.szFileName[y-inf1st.szFileName]='\0', dname+=inf1st.szFileName; + } + } + m_dll->closeArc( h ); + } + + return ans; +} + +bool CArcModule::lst_exe( const char* lstcmd, aflArray& files, + const char* BL, int BSL, const char* EL, int SL, int dx ) + // BeginLine, BeginSkipLine, EndLine, SkipLine, delta-x +{ + files.forcelen(0); + + // 作業変数 + const int BLLEN = ki_strlen(BL); + const int ELLEN = ki_strlen(EL); + int /*ct=0,*/ step=BSL; + + // EXE以外のものではダメ + if( m_type!=EXE && m_type!=EXEUS ) + return false; + + // コマンド文字列作成 + kiVar theCmd( m_name ); + theCmd.quote(); + theCmd += ' '; + theCmd += lstcmd; + + // パイプ作成(両方とも継承ON。DupHanするの面倒いので…(^^;) + HANDLE rp, wp; + SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES),NULL,TRUE}; + ::CreatePipe( &rp, &wp, &sa, 4096 ); + + // プロセス開始 + PROCESS_INFORMATION pi; + STARTUPINFO si = {sizeof(STARTUPINFO)}; + si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES; + si.wShowWindow = SW_MINIMIZE; + si.hStdOutput = si.hStdError = wp; + BOOL ok = + ::CreateProcess( NULL,const_cast((const char*)theCmd),NULL, + NULL, TRUE, CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS, + NULL, NULL, &si,&pi ); + ::CloseHandle( wp ); + + // 失敗したらパイプを閉じて即終了 + if( !ok ) + { + ::CloseHandle( rp ); + return false; + } + ::CloseHandle( pi.hThread ); + + // 解析作業etc(バッファのサイズはパイプのサイズの倍以上でなくてはならない) + char buf[8192], *end=buf; + for( bool endpr=false; !endpr; ) + { + // 終了待機 + endpr = (WAIT_OBJECT_0==::WaitForSingleObject(pi.hProcess,500)); + kiWindow::msg(); + + // パイプから読みとり + DWORD red; + ::PeekNamedPipe( rp, NULL, 0, NULL, &red, NULL ); + if( red==0 ) + continue; + ::ReadFile( rp, end, buf+sizeof(buf)-end, &red, NULL ); + end += red; + + // 行に分解 + char *lss=buf; + for( char *ls, *le=buf; le=0 ) + ls += dx; + // 引数ブロックスキップ処理 + else + { + for( ;ls= 4 ) + { + char blockname[500]=""; + ::wsprintf( blockname, + "\\StringFileInfo\\%04x%04x\\ProductVersion", + tr[0], tr[1] ); + + char* inf = NULL; + UINT cbInf = 0; + if( ::VerQueryValue( vbuf, blockname, (void**)&inf, &cbInf ) + && cbInf < cbBuf-1 ) + { + for( char* v=buf; *inf && cbInf; ++inf,--cbInf ) + if( *inf != ' ' ) + *v++ = (*inf==',' ? '.' : *inf); + *v = '\0'; + got = true; + } + } + else + { + void* fi = NULL; + UINT cbFi = 0; + VS_FIXEDFILEINFO vffi; + if( ::VerQueryValue( vbuf, "\\", &fi, &cbFi ) + && sizeof(vffi)<=cbFi ) + { + ki_memcpy( &vffi, fi, sizeof(vffi) ); + if( vffi.dwFileVersionLS >= 0x10000 ) + ::wsprintf( buf, "%d.%d.%d", vffi.dwFileVersionMS>>16, + vffi.dwFileVersionMS&0xffff, vffi.dwFileVersionLS>>16 ); + else + ::wsprintf( buf, "%d.%d", vffi.dwFileVersionMS>>16, + vffi.dwFileVersionMS&0xffff ); + got = true; + } + } + } + + delete [] vbuf; + return got; +} ADDED Archiver.h Index: Archiver.h ================================================================== --- Archiver.h +++ Archiver.h @@ -0,0 +1,307 @@ +// Archiver.h +//-- CArchiver -- common interface in 'Noah' for arhiving routine -- + +#ifndef AFX_ARCHIVER_H__359A2ED3_2F97_480E_BC94_24834EBA6498__INCLUDED_ +#define AFX_ARCHIVER_H__359A2ED3_2F97_480E_BC94_24834EBA6498__INCLUDED_ + +enum { + aCheck = 1, aMelt = 2, aList = 4, aMeltEach = 8, aCompress = 16, aArchive = 32, aSfx = 64, +}; +enum { + aUnknown=0, aSingleFile, aSingleDir, aMulti +}; + +struct arcname { + arcname( const kiPath& b,const char *s,const char *l ) + : basedir(b),sname(s),lname(l) {} + const kiPath& basedir; + const char* lname; + const char* sname; +}; + +struct arcfile { + INDIVIDUALINFO inf; + union { + bool selected; + bool isfile; + }; +}; + +#define aflArray kiArray +#define wfdArray kiArray + +class CArchiver +{ +public: //--< attribute >-- + + int ability(); + int cancompressby( const char* ext, const char* mhd, bool sfx ); + + const char* mlt_ext(); + const kiStr& cmp_ext(); + const StrArray& cmp_mhd_list(); + const int cmp_mhd_default(); + bool ver( kiStr& str ); + static bool GetVersionInfoStr( char* name, char* buf, size_t cbBuf ); + +public: //--< action >-- + + bool check( const kiPath& aname ); + int contents( const kiPath& aname, kiPath& dname ); + int melt( const arcname& aname, const kiPath& ddir, const aflArray* files=NULL ); + bool list( const arcname& aname, aflArray& files ); + int compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ); + kiStr arctype_name(const char* an) const { return v_name(an); } + +protected: //--< for child >-- + + CArchiver( const char* mext ); + void set_cmp_ext( const char* ext ); + void add_cmp_mhd( const char* mhd, bool def=false ); + + virtual int v_load(){return 0;} + virtual bool v_ver( kiStr& str ){return false;} + virtual bool v_check( const kiPath& aname ){return false;} + virtual int v_contents( const kiPath& aname, kiPath& dname ){return aUnknown;} + virtual int v_melt( const arcname& aname, const kiPath& ddir, const aflArray* files ){return false;} + virtual bool v_list( const arcname& aname, aflArray& files ){return false;} + virtual int v_compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ){return false;} + virtual kiStr v_name(const char*) const { return ""; } + +private: //--< private >-- + + friend class CNoahArchiverManager; + bool extCheck( const char* ext ); + kiStr m_MyExtList, m_MyCmpExt; + StrArray m_Mhd; + int m_MhdDef,m_Able; + bool not_loaded; + +public: //--< dummy >-- + + virtual ~CArchiver(){} +}; + +inline int CArchiver::ability() +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return m_Able; +} + +inline int CArchiver::cancompressby( const char* ext, const char* mhd, bool sfx ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + if( (sfx && !(m_Able&aSfx)) || !(m_Able&aCompress) || !m_MyCmpExt.isSame(ext) ) + return -1; // no + for( unsigned int i=0; i!=m_Mhd.len(); i++ ) + if( m_Mhd[i] == mhd ) + return (int)i; + return -2; // only - 'type name' matched +} + +inline bool CArchiver::check( const kiPath& aname ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return (m_Able&aCheck)?v_check(aname):false; +} + +inline int CArchiver::contents( const kiPath& aname, kiPath& dname ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return (m_Able&aList)?v_contents(aname,dname):false; +} + +inline int CArchiver::melt( const arcname& aname, const kiPath& ddir, const aflArray* files ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return (m_Able&aMelt)?v_melt(aname,ddir,files):0xffff; +} + +inline bool CArchiver::list( const arcname& aname, aflArray& files ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return (m_Able&aList)?v_list(aname,files):false; +} + +inline int CArchiver::compress( const kiPath& base, const wfdArray& files, const kiPath& ddir, int method, bool sfx ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return (m_Able&aCompress)?v_compress(base,files,ddir,method,sfx):0xffff; +} + +inline bool CArchiver::ver( kiStr& str ) +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return v_ver(str); +} + +inline const char* CArchiver::mlt_ext() +{ + return m_MyExtList; +} + +inline const kiStr& CArchiver::cmp_ext() +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return m_MyCmpExt; +} + +inline const StrArray& CArchiver::cmp_mhd_list() +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return m_Mhd; +} + +inline const int CArchiver::cmp_mhd_default() +{ + if( not_loaded ) + m_Able=v_load(), not_loaded=false; + return m_MhdDef; +} + +inline CArchiver::CArchiver( const char* extlist ) + : m_MyExtList( extlist ), m_Mhd(3), m_MhdDef(0), not_loaded(true) +{ + m_MyExtList.lower(); +} + +inline void CArchiver::set_cmp_ext( const char* ext ) +{ + m_MyCmpExt = ext; +} + +inline void CArchiver::add_cmp_mhd( const char* method, bool Default ) +{ + m_Mhd.add(method); + if( Default ) + m_MhdDef = m_Mhd.len() - 1; +} + +inline bool CArchiver::extCheck( const char* ext ) +{ + const char *x=m_MyExtList,*y; + int ln = ki_strlen(ext); + while( *x ) + { + for( y=x+1; *y && *y!='.'; y++ ); + if( *y=='\0' ) break; + + if( y-x == ln ) + { + while( x!=y ) + { + if( *x!=ext[ln+(x-y)] ) + break; + x++; + } + if( x==y ) + return true; + } + x=y+1; + } + return false; +} + +// 渡されたパス文字列が、絶対パスや".."を含んでいればtrue +static bool containsDangerPath( const char* path ) +{ + // 絶対パス + if( path[0]=='\\' || path[0]=='/' || path[0]!='\0' && path[1]==':' ) + return true; + + // ".." + for( const char* p=path; *p; ) + { + const char* q = p; + while( *q!='\0' && *q!='\\' && *q!='/' ) + q = ::CharNext(q); + + if( p+2 <= q ) + { + const char* r; + for( r=p; r!=q; ++r ) + if( *r != '.' ) + break; + if( r == q ) // all dot + return true; + } + p = (*q ? ::CharNext(q) : q); + } + return false; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// 統合アーカイバDLLレイヤ第二層 ver2。ついでにexeも適当に動く + +class CArcModule +{ +public: + + // 実行コマンド名を指定して作成 + // ・ファイル名として探して見つからなかった場合 + // シェルの内部コマンドと仮定して一応保持しておく + // ・拡張子が exe か com なら実行ファイルとして扱う。 + // ・それ以外ならアーカイバDLLとして扱う。 + CArcModule( const char* name, bool us=false ); + virtual ~CArcModule(); + bool exist(); + bool isdll(); + + kiStr name() const { return kiPath::name(m_name); } + + // 実行 + int cmd( const char* cmd, bool mini=false ); + + // 書庫チェック + bool chk( const char* aname ); + int arctype( const char* aname ) const; + + // バージョン情報文字列を返す + void ver( kiStr& str ); + + // 書庫の中身をリストアップ + bool lst_dll( const arcname& aname, aflArray& files, const char* wild="*" ); + int cnt( const kiPath& aname, kiPath& dname, const char* wild="*" ); + bool lst_exe( const char* lstcmd, aflArray& files, + const char* BL, int BSL, const char* EL, int SL, int dx ); + + // DLL強制アンロード( BugTrap for UnZip32.dll ) + void unload() { m_dll->unload(); } + // DLLオーナー窓設定( BugTrap for Unrar.dll ) + void own( HWND wnd ) { m_dll->setOwner( wnd ); } + void fre() { m_dll->clearOwner(); } + +private: + enum { NOTEXIST, DLL, DLLGCA, DLLBGA, EXE, EXEUS, SHLCMD=0 } m_type; + kiArcDLLRaw* m_dll; + char m_name[MAX_PATH]; + const char* m_wild; +}; + +inline bool CArcModule::chk( const char* aname ) + { return m_dll ? FALSE!=m_dll->check( aname, m_type==DLLGCA?24:0 ) : false; } + +inline int CArcModule::arctype( const char* aname ) const + { return m_dll ? + m_type==DLLBGA ? m_dll->check(aname,0) : m_dll->getArcType(aname) + : 0; } + +inline bool CArcModule::exist() + { return m_type!=NOTEXIST; } + +inline bool CArcModule::isdll() + { return m_type==DLL || m_type==DLLGCA; } + + + +#endif ADDED Noah.cpp Index: Noah.cpp ================================================================== --- Noah.cpp +++ Noah.cpp @@ -0,0 +1,305 @@ +// Noah.cpp +// -- entrypoint etc for 'Noah' + +#include "stdafx.h" +#include "NoahApp.h" +#include "resource.h" + +#if _MSC_VER >= 1300 +extern "C" { int _afxForceEXCLUDE; } +extern "C" BOOL WINAPI _imp__IsDebuggerPresent() { return FALSE; } +#endif + +// プロセス個数制限ゾーン +class ProcessNumLimitZone +{ + HANDLE m_han; +public: + ProcessNumLimitZone(int Max, const char* name) + : m_han( ::CreateSemaphore( NULL, Max, Max, name ) ) + { + if( m_han ) + ::WaitForSingleObject( m_han, INFINITE ); + else + kiSUtil::msgLastError("CreateSemaphore Failed"); + } + ~ProcessNumLimitZone() + { + if( m_han ) + { + ::ReleaseSemaphore( m_han, 1, NULL ); + ::CloseHandle( m_han ); + } + } +}; + +//----------------------------------------------// +//--------- Noah のエントリポイント ------------// +//----------------------------------------------// + +void kilib_create_new_app() +{ + //-- kilib にアプリケーションを設定 + new CNoahApp; +} + +void CNoahApp::run( kiCmdParser& cmd ) +{ + //-- 初期化 + m_cnfMan.init(); + m_arcMan.init(); + + //-- コマンドラインパラメータ保持 + m_pCmd = &cmd; + + //-- 「ファイル名が渡されてない or Shift押し起動」なら設定画面表示 + if( cmd.param().len()==0 || keyPushed(VK_SHIFT) ) + { + //-- Load-INI ( 全部 ) + m_cnfMan.load( All ); + //-- 設定画面表示 + m_cnfMan.dialog(); + } + else + { + //-- 圧縮解凍などの作業 + do_cmdline( true ); + } + + //-- 終了処理 + m_tmpDir.remove(); +} + +//----------------------------------------------// +//------------- 圧縮/解凍 の 作業 --------------// +//----------------------------------------------// + +bool CNoahApp::is_writable_dir( const kiPath& path ) +{ + // 要するに、CDROM/DVDROM を切りたい。 + // FDD, PacketWriteなDisk を切るのはあきらめる。 + + // RAMDISK, REMOTE, FIXED, UNKNOWN なディスクは書き込み可能と見なす + UINT drv = path.getDriveType(); + if( drv==DRIVE_REMOVABLE || drv==DRIVE_CDROM ) + { + // 素Win95では使えない関数なのでDynamicLoad + typedef BOOL (WINAPI*pGDFSE)( LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER ); + pGDFSE pGetDiskFreeSpaceEx + = (pGDFSE) ::GetProcAddress( ::GetModuleHandle("kernel32.dll"), "GetDiskFreeSpaceExA" ); + if( pGetDiskFreeSpaceEx ) + { + // 空き容量が0なら、書き込み不可とみなす + ULARGE_INTEGER fs, dummy; + pGetDiskFreeSpaceEx( path, &dummy, &dummy, &fs ); + if( fs.QuadPart == 0 ) + return false; + } + } + return true; +} + +void CNoahApp::do_cmdline( bool directcall ) +{ + do_files( m_pCmd->param(), &m_pCmd->option(), !directcall ); +} + +void CNoahApp::do_files( const cCharArray& files, + const cCharArray* opts, + bool basicaly_ignore ) +{ + struct local { + ~local() {kiSUtil::switchCurDirToExeDir(); } // ディレクトリロックしないように + } _; + + //-- Archiver Manager にファイル名リストを記憶する + if( 0 == m_arcMan.set_files( files ) ) + return; + + //-- 作業用変数 + enum { unknown, melt, compress } + whattodo = unknown; + bool ctrl_mlt = keyPushed( VK_CONTROL ); + bool ctrl_cmp = ctrl_mlt; + bool alt = keyPushed( VK_MENU ) || keyPushed( VK_RWIN ) || keyPushed( VK_LWIN ); + const char *cmptype=NULL, *method=NULL; + kiPath destdir; + kiStr tmp(300); + + //-- ( もしあれば )コマンドラインオプションを解釈 + if( opts ) + for( unsigned int i=0; i!=opts->len(); i++ ) + switch( (*opts)[i][1] ) + { + case 'a': if( !basicaly_ignore ) + case 'A': whattodo = compress; break; + + case 'x': if( !basicaly_ignore ) + case 'X': whattodo = melt; break; + + case 'd': if( !basicaly_ignore ) + case 'D': destdir = (*opts)[i]+2; break; + + case 'w': if( !basicaly_ignore ) + case 'W': alt = true; break; + + case 't': if( !basicaly_ignore ) + case 'T': cmptype = (*opts)[i]+2; break; + + case 'm': if( !basicaly_ignore ) + case 'M': method = (*opts)[i]+2; break; + + case 'c': if( !basicaly_ignore ) { + case 'C': if((*opts)[i][2]!='x') ctrl_cmp = true; + if((*opts)[i][2]!='a') ctrl_mlt = true; + break;} + } + + //-- Load-INI ( 動作モード設定 ) + m_cnfMan.load( Mode ); + + //-- 圧縮解凍のどちらを行うか決定する。流れは以下の通り。 + // + // ・コマンドラインで、圧縮と指定されてれば無条件で圧縮へ + // + // ・そうでなければ、まずNoahの動作モード取得 + //  m0:圧縮専用 m1:圧縮優先 m2:解凍優先 m3:解凍専用 + //   コマンドラインで解凍と指定されていれば m3。 + //   指定が無ければ、m_cnfMan から読み込み。 + // + // ・m0 か、'm1でしかもファイルが複数' の時は無条件で圧縮へ + // + // ・そうでなければ、解凍ルーチンを割り当ててみる。 + //  この際、m3 以外のときは一個でも割り当て失敗したらエラー>圧縮へ + //  m3 でも、一個も割り当てられなければエラー。>処理終了 + + if( whattodo != compress ) + { + int mode = 3; + if( whattodo != melt ) + mode = m_cnfMan.mode(); + + if( mode==0 || ( mode==1 && m_arcMan.file_num()>=2 ) ) + whattodo = compress; + else + { + //-- 解凍ルーチン割り当ててみる + bool suc = m_arcMan.map_melters( mode ); + if( suc ) + whattodo = melt; + else + { + if( mode != 3 ) + whattodo = compress; + else + { + //-- 解凍専用モードだけど解凍不可!! + msgBox( tmp.loadRsrc(IDS_M_ERROR) ); + return; + } + } + } + } + + if( whattodo == melt ) + { + //-- 解凍設定は既にm_cnfMan.init()でロードされている… + + if( destdir.len()==0 ) + { + //-- 解凍先ディレクトリ取得 + if( m_cnfMan.mdirsm() ) + if( is_writable_dir(m_arcMan.get_basepath()) ) + destdir = m_arcMan.get_basepath(); + if( destdir.len()==0 ) + destdir = m_cnfMan.mdir(); + } + + //-- 解凍 + if( ctrl_mlt ) m_arcMan.do_listing( destdir ); + else { + ProcessNumLimitZone zone( mycnf().multiboot_limit(), "LimitterForNoahAtKmonosNet" ); + m_arcMan.do_melting( destdir ); + } + } + else + { + //-- Load-INI( 圧縮設定 ) + m_cnfMan.load( Compress ); + + if( destdir.len()==0 ) + { + //-- 圧縮先ディレクトリ取得 + if( m_cnfMan.cdirsm() ) + if( is_writable_dir(m_arcMan.get_basepath()) ) + destdir = m_arcMan.get_basepath(); + if( destdir.len()==0 ) + destdir = m_cnfMan.cdir(); + } + if( !cmptype ) cmptype = m_cnfMan.cext(); + else if( !method ) method = ""; + if( !method ) method = m_cnfMan.cmhd(); + + //-- 圧縮用ルーチンを割り当て + if( !m_arcMan.map_compressor( cmptype, method, ctrl_cmp ) ) + { + //-- 圧縮不能な形式!! + msgBox( tmp.loadRsrc(IDS_C_ERROR) ); + return; + } + + //-- 圧縮 + ProcessNumLimitZone zone( mycnf().multiboot_limit(), "LimitterForNoahAtKmonosNet" ); + m_arcMan.do_compressing( destdir, alt ); + } +} + +//----------------------------------------------// +//----------------- その他雑用 -----------------// +//----------------------------------------------// + +// from= 0:normal 1:melt 2:compress +void CNoahApp::open_folder( const kiPath& path, int from ) +{ + if( from==1 || from==2 ) //-- Shellに更新通知 + ::SHChangeNotify( SHCNE_UPDATEDIR, SHCNF_PATH, (const void*)(const char*)path, NULL ); + + //-- デスクトップだったら開かない + kiPath dir(path), tmp(kiPath::Dsk,false); + dir.beBackSlash(false), dir.beShortPath(), tmp.beShortPath(); + + if( !tmp.isSame( dir ) ) + { + //-- Load-INI( フォルダ開き設定 ) + m_cnfMan.load( OpenDir ); + if( (from==1 && !m_cnfMan.modir()) + || (from==2 && !m_cnfMan.codir()) ) + return; + + char cmdline[1000]; + wsprintf( cmdline, m_cnfMan.openby(), (const char*)dir ); + ::WinExec( cmdline, SW_SHOWDEFAULT ); + } +} + +// 全システム中で一意なテンポラリフォルダを作って返す +void CNoahApp::get_tempdir( kiPath& tmp ) +{ + char buf[MAX_PATH]; + + if( m_tmpDir.len()==0 ) + { + ::GetTempFileName( kiPath( kiPath::Tmp ), "noa", 0, buf ); + ::DeleteFile( buf ); + m_tmpDir = buf; + m_tmpDir.beBackSlash( true ); + m_tmpDir.mkdir(); + m_tmpID = ::GetCurrentProcessId(); + } + + ::GetTempFileName( m_tmpDir, "noa", m_tmpID++, buf ); + ::DeleteFile( buf ); + tmp = buf; + tmp.beBackSlash( true ); + tmp.mkdir(); +} ADDED Noah.dsp Index: Noah.dsp ================================================================== --- Noah.dsp +++ Noah.dsp @@ -0,0 +1,346 @@ +# Microsoft Developer Studio Project File - Name="Noah" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=Noah - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "Noah.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "Noah.mak" CFG="Noah - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "Noah - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "Noah - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "Noah" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Noah - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "tmp/rel" +# PROP Intermediate_Dir "tmp/rel" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /O1 /Ob2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_VISUALC" /Yu"stdafx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib lz32.lib version.lib /nologo /entry:"kilib_startUp" /subsystem:windows /pdb:none /machine:I386 /out:"Release/Noah.exe" /opt:"nowin98" +# SUBTRACT LINK32 /nodefaultlib + +!ELSEIF "$(CFG)" == "Noah - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "tmp/dbg" +# PROP Intermediate_Dir "tmp/dbg" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_VISUALC" /D "KILIB_LOG" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib lz32.lib version.lib /nologo /entry:"kilib_startUp" /subsystem:windows /debug /machine:I386 /out:"Debug/Noah.exe" /pdbtype:sept +# SUBTRACT LINK32 /profile /pdb:none /incremental:no + +!ENDIF + +# Begin Target + +# Name "Noah - Win32 Release" +# Name "Noah - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\ArcACE.cpp +# End Source File +# Begin Source File + +SOURCE=.\ArcB2e.cpp +# End Source File +# Begin Source File + +SOURCE=.\ArcCpt.cpp +# End Source File +# Begin Source File + +SOURCE=.\ArcDLL.cpp +# End Source File +# Begin Source File + +SOURCE=.\Archiver.cpp +# End Source File +# Begin Source File + +SOURCE=.\ArcMsc.cpp +# End Source File +# Begin Source File + +SOURCE=.\Noah.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoahAM.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoahCM.cpp +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\SubDlg.cpp +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\ArcACE.h +# End Source File +# Begin Source File + +SOURCE=.\ArcB2e.h +# End Source File +# Begin Source File + +SOURCE=.\ArcCpt.h +# End Source File +# Begin Source File + +SOURCE=.\ArcDLL.h +# End Source File +# Begin Source File + +SOURCE=.\Archiver.h +# End Source File +# Begin Source File + +SOURCE=.\ArcMsc.h +# End Source File +# Begin Source File + +SOURCE=.\NoahAM.h +# End Source File +# Begin Source File + +SOURCE=.\NoahApp.h +# End Source File +# Begin Source File + +SOURCE=.\NoahCM.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# Begin Source File + +SOURCE=.\SubDlg.h +# End Source File +# Begin Source File + +SOURCE=.\unacedef.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\icons\arc_b2e.ico +# End Source File +# Begin Source File + +SOURCE=.\b2e.ico +# End Source File +# Begin Source File + +SOURCE=.\default1.bin +# End Source File +# Begin Source File + +SOURCE=.\noah.ico +# End Source File +# Begin Source File + +SOURCE=.\Noah.rc +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# End Group +# Begin Group "K.I.LIB" + +# PROP Default_Filter "" +# Begin Group "Source" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\kilib\kl_app.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_carc.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_cmd.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_dnd.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_file.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_find.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_reg.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_rythp.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_str.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_wcmn.cpp +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_wnd.cpp +# End Source File +# End Group +# Begin Group "Header" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\kilib\kl_app.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_carc.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_cmd.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_dnd.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_file.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_find.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_misc.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_reg.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_rythp.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_str.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_wcmn.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kl_wnd.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\kilib\kilib.h +# End Source File +# Begin Source File + +SOURCE=.\kilib\kilibext.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\manifest.xml +# End Source File +# Begin Source File + +SOURCE=.\readme.txt +# End Source File +# Begin Source File + +SOURCE=.\Release\todo.txt +# End Source File +# End Target +# End Project ADDED Noah.dsw Index: Noah.dsw ================================================================== --- Noah.dsw +++ Noah.dsw @@ -0,0 +1,65 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# 警告: このワークスペース ファイル を編集または削除しないでください! + +############################################################################### + +Project: "Noah"=.\Noah.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + Noah + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "NoahXt"=.\NoahXt\NoahXt.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + NoahXt + .\noahxt + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "kinst"=.\uninst\kinst.dsp - Package Owner=<4> + +Package=<5> +{{{ + begin source code control + kinst + . + end source code control +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + ADDED Noah.h Index: Noah.h ================================================================== --- Noah.h +++ Noah.h @@ -0,0 +1,3 @@ +#pragma once + +#include "resource.h" ADDED Noah.ico Index: Noah.ico ================================================================== --- Noah.ico +++ Noah.ico cannot compute difference between binary files ADDED Noah.rc Index: Noah.rc ================================================================== --- Noah.rc +++ Noah.rc @@ -0,0 +1,676 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +#ifndef _MAC +///////////////////////////////////////////////////////////////////////////// +// +// Version +// + +VS_VERSION_INFO VERSIONINFO + FILEVERSION 3,1,9,9 + PRODUCTVERSION 3,1,9,9 + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x1L +#else + FILEFLAGS 0x0L +#endif + FILEOS 0x4L + FILETYPE 0x1L + FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "041104b0" + BEGIN + VALUE "Comments", "INTO THE LEGEND\0" + VALUE "CompanyName", "kMonos.NET\0" + VALUE "FileDescription", "Noah( DnD Melter/Freezer )\0" + VALUE "FileVersion", "3.199\0" + VALUE "InternalName", "sakasai\0" + VALUE "LegalCopyright", "Presented by k.inaba (1998-2010)\0" + VALUE "LegalTrademarks", "\0" + VALUE "OriginalFilename", "Noah.exe\0" + VALUE "PrivateBuild", "\0" + VALUE "ProductName", "Noah\0" + VALUE "ProductVersion", "3.199\0" + VALUE "SpecialBuild", "\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x411, 1200 + END +END + +#endif // !_MAC + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_CMPCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "圧縮" +FONT 9, "MS Pゴシック" +BEGIN + GROUPBOX "圧縮先フォルダ",IDC_STATIC,7,7,205,43 + CONTROL "元のファイルと同じ場所",IDC_DDIR1,"Button", + BS_AUTORADIOBUTTON | WS_GROUP,11,20,84,10 + CONTROL "指定した場所",IDC_DDIR2,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,11,33,50,10 + EDITTEXT IDC_DDIR,63,32,123,12,ES_AUTOHSCROLL | WS_GROUP + PUSHBUTTON "指定",IDC_REF,188,31,19,14,WS_GROUP + CONTROL "圧縮後開く",IDC_ODIR,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,163,18,43,9 + GROUPBOX "圧縮形式",IDC_STATIC,7,57,117,57 + COMBOBOX IDC_CMPEXT,14,81,34,163,CBS_DROPDOWNLIST | CBS_SORT | + CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_GROUP | + WS_TABSTOP + COMBOBOX IDC_CMPMHD,52,81,65,79,CBS_DROPDOWNLIST | + CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Noahの動作モード",IDC_STATIC,133,57,79,57 + CONTROL "圧縮専用",IDC_MODE1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,147,69,39,8 + CONTROL "圧縮優先",IDC_MODE2,"Button",BS_AUTORADIOBUTTON,147,79, + 38,8 + CONTROL "解凍優先",IDC_MODE3,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,147,89,39,8 + CONTROL "解凍専用",IDC_MODE4,"Button",BS_AUTORADIOBUTTON,147,98, + 39,12 +END + +IDD_ARCVIEW DIALOG DISCARDABLE 0, 0, 311, 157 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +FONT 9, "MS Pゴシック" +BEGIN + CONTROL "List1",IDC_FILELIST,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | WS_BORDER | WS_TABSTOP,0,22,312,120 + PUSHBUTTON "全解凍",IDOK,5,3,26,14 + PUSHBUTTON "解凍",IDC_MELTEACH,34,3,19,14 + PUSHBUTTON "反転",IDC_SELECTINV,78,3,19,14 + EDITTEXT IDC_DDIR,102,3,145,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_REF,249,3,8,14 + DEFPUSHBUTTON "表示",IDC_SHOW,56,3,19,14 + LTEXT "",IDC_STATUSBAR,0,146,309,11 +END + +IDD_MLTCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "解凍" +FONT 9, "MS Pゴシック" +BEGIN + GROUPBOX "解凍先フォルダ",IDC_STATIC,7,7,205,43 + CONTROL "書庫と同じ場所",IDC_DDIR1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,11,20,65,10 + CONTROL "指定した場所",IDC_DDIR2,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,11,33,50,10 + EDITTEXT IDC_DDIR,63,32,123,12,ES_AUTOHSCROLL | WS_GROUP + PUSHBUTTON "指定",IDC_REF,188,31,19,14,WS_GROUP + CONTROL "解凍後開く",IDC_ODIR,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,163,18,42,8 + GROUPBOX "",IDC_STATIC,7,52,205,62 + CONTROL "フォルダ自動生成",IDC_MKDIR,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,16,62,63,10 + CONTROL "ファイル一つなら作らない",IDC_MKDIR1,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,32,73,86,10 + CONTROL "フォルダ一つなら作らない",IDC_MKDIR2,"Button", + BS_AUTOCHECKBOX | WS_TABSTOP,32,84,86,10 + CONTROL "末尾の数字は省く",IDC_MKDIR3,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,32,95,64,10 +END + +IDD_WINCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Windows拡張" +FONT 9, "MS Pゴシック" +BEGIN + GROUPBOX "関連付け",IDC_STATIC,7,7,205,39 + CONTROL "&LZH",IDC_LZH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13, + 18,23,9 + CONTROL "&ZIP",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,13, + 30,23,10 + CONTROL "&CAB",IDC_CAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,40, + 18,26,10 + CONTROL "&RAR",IDC_RAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,40, + 30,25,9 + CONTROL "&TAR",IDC_TAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68, + 18,26,10 + CONTROL "&YZ1",IDC_YZ1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,68, + 30,23,9 + CONTROL "&GCA",IDC_GCA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,97, + 18,25,10 + CONTROL "AR&J",IDC_ARJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,97, + 30,24,10 + CONTROL "&BGA",IDC_BGA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126, + 18,25,9 + CONTROL "AC&E",IDC_ACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,126, + 30,25,9 + CONTROL "C&PT",IDC_CPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155, + 18,26,9 + CONTROL "JA&K",IDC_JAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,155, + 30,26,9 + CONTROL "&7Z",IDC_7Z,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,182, + 18,23,10 + PUSHBUTTON "他",IDC_ASS,190,30,17,14 + GROUPBOX "右ドラッグ&ドロップ",IDC_STATIC,7,51,132,29 + CONTROL "ここに圧縮(&H)",IDC_CMP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,15,63,57,10 + CONTROL "ここに解凍(&X)",IDC_MLT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,75,63,56,10 + GROUPBOX "ショートカット",IDC_STATIC,7,86,132,28 + CONTROL "送る(&S)",IDC_SND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 15,98,37,10 + CONTROL "デスクトップ(&D)",IDC_DSK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,75,97,60,10 + LTEXT "※ ユーザにadmin権限がないため、関連付けに失敗する可能性があります。", + IDC_NOADMIN,146,57,62,49 +END + +IDD_INFCFG DIALOG DISCARDABLE 0, 0, 219, 97 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "About" +FONT 9, "Courier New" +BEGIN + ICON IDI_MAIN,IDC_STATIC,28,21,20,20,SS_REALSIZEIMAGE + CTEXT "Noah 3.199\n\npresented by k.inaba",IDC_STATIC,13,45,53, + 36,WS_TABSTOP + EDITTEXT IDC_VERSION,78,7,134,83,ES_MULTILINE | ES_AUTOHSCROLL | + ES_READONLY | WS_VSCROLL +END + +IDD_PROGRESS DIALOG DISCARDABLE 0, 0, 214, 43 +STYLE DS_ABSALIGN | DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | + WS_SYSMENU +CAPTION "Extracting..." +FONT 9, "MS Pゴシック" +BEGIN + DEFPUSHBUTTON "STOP",IDCANCEL,157,7,50,14 + CONTROL "Progress1",IDC_BAR,"msctls_progress32",PBS_SMOOTH | + WS_BORDER,7,25,200,12 + LTEXT "",IDC_FNAME,7,7,142,11 +END + +IDD_PASSWORD DIALOG DISCARDABLE 0, 0, 206, 64 +STYLE DS_ABSALIGN | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | + WS_CAPTION | WS_SYSMENU +CAPTION "Noah" +FONT 9, "MS Pゴシック" +BEGIN + LTEXT "Input your password:",IDC_MESSAGE,4,5,196,20 + EDITTEXT IDC_EDIT,7,29,194,12,ES_AUTOHSCROLL + CONTROL "Mask",IDC_MASK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,15, + 47,31,10 + PUSHBUTTON "OK",IDOK,96,46,50,12 + PUSHBUTTON "Cancel",IDCANCEL,149,46,50,12 +END + +IDD_ANYASS DIALOG DISCARDABLE 0, 0, 207, 97 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "その他の形式の関連づけ" +FONT 9, "MS Pゴシック" +BEGIN + LISTBOX IDC_NASSOC,7,7,77,62,LBS_SORT | LBS_NOINTEGRALHEIGHT | + LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "追加 >>",IDC_ADD,90,18,26,14 + LISTBOX IDC_ASSOC,123,7,77,62,LBS_SORT | LBS_NOINTEGRALHEIGHT | + LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "<< 削除",IDC_DEL,90,38,27,14 + DEFPUSHBUTTON "実行",IDOK,95,76,50,14 + PUSHBUTTON "中断",IDCANCEL,150,76,50,14 +END + +IDD_PATHCHECK DIALOG DISCARDABLE 0, 0, 298, 69 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Noah 警告" +FONT 9, "MS Pゴシック" +BEGIN + PUSHBUTTON "はい(&Y)",IDYES,111,48,50,14 + PUSHBUTTON "中止(&C)",ID_ALLNO,241,48,50,14 + LTEXT "絶対パス、もしくは "".."" による相対パスで格納されたファイルです。展開を続けますか?", + IDC_STATIC,7,7,264,10 + LTEXT "",IDC_PATHNAME,16,17,275,23 + PUSHBUTTON "全てはい(&A)",ID_ALLYES,166,48,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_CMPCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_ARCVIEW, DIALOG + BEGIN + RIGHTMARGIN, 304 + TOPMARGIN, 3 + BOTTOMMARGIN, 148 + END + + IDD_MLTCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_WINCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_INFCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 90 + END + + IDD_PROGRESS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 207 + TOPMARGIN, 7 + BOTTOMMARGIN, 36 + END + + IDD_PASSWORD, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 199 + TOPMARGIN, 7 + BOTTOMMARGIN, 57 + END + + IDD_ANYASS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 90 + END + + IDD_PATHCHECK, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 291 + TOPMARGIN, 7 + BOTTOMMARGIN, 62 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAIN ICON DISCARDABLE "noah.ico" +IDI_B2E ICON DISCARDABLE "b2e.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// Accelerator +// + +IDR_ACCEL ACCELERATORS DISCARDABLE +BEGIN + "F", IDA_MYDIR, VIRTKEY, CONTROL, NOINVERT + VK_F1, IDA_HELP, VIRTKEY, NOINVERT +END + + +///////////////////////////////////////////////////////////////////////////// +// +// 24 +// + +1 24 MOVEABLE PURE "manifest.xml" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_M_ERROR "解凍できませんでした!\n書庫ではないか、壊れています。" + IDS_C_ERROR "対応していない圧縮形式に設定されています。\nNoahの設定を変更するか、適切なDLL等をインストールして下さい。" + IDS_CHOOSEDIR "出力先を選んで下さい。" + IDS_FNAME "ファイル名" + IDS_SIZE "サイズ" + IDS_DATETIME "日時" + IDS_RATIO "圧縮率" + IDS_METHOD "形式" + IDS_PATH "パス" + IDS_EXECUTING "Noahから起動したソフトが実行中です。このまま終わるとディスクに不要なファイルが残る可能性が大きいですが、終了しますか?" + IDS_NOLIST "エラー:リストアップ不可能な書庫です。" + IDS_ARCVIEW_MSG "[%d個のファイル] [圧縮率 %d%%] [%s]" +END + +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 英語 (アメリカ) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_ARCVIEW DIALOG DISCARDABLE 0, 0, 353, 155 +STYLE WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU | + WS_THICKFRAME +FONT 9, "MS Sans Serif" +BEGIN + CONTROL "List1",IDC_FILELIST,"SysListView32",LVS_REPORT | + LVS_SHOWSELALWAYS | LVS_NOSORTHEADER | WS_BORDER | + WS_TABSTOP,0,20,350,126 + PUSHBUTTON "Extract &All",IDOK,7,3,36,14 + PUSHBUTTON "E&xtract",IDC_MELTEACH,46,3,26,14 + PUSHBUTTON "&Inv",IDC_SELECTINV,97,3,19,14 + EDITTEXT IDC_DDIR,119,3,149,14,ES_AUTOHSCROLL + PUSHBUTTON "...",IDC_REF,273,3,13,14 + DEFPUSHBUTTON "&View",IDC_SHOW,75,3,19,14 +END + +IDD_WINCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Windows" +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Association",IDC_STATIC,7,7,205,36 + CONTROL "&LZH",IDC_LZH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12, + 18,28,10 + CONTROL "&ZIP",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,12, + 28,26,10 + CONTROL "&CAB",IDC_CAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,40, + 18,30,10 + CONTROL "&RAR",IDC_RAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,40, + 28,30,10 + CONTROL "&TAR",IDC_TAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70, + 18,29,10 + CONTROL "&YZ1",IDC_YZ1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,70, + 28,27,10 + CONTROL "&GCA",IDC_GCA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,99, + 18,30,10 + CONTROL "AR&J",IDC_ARJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,99, + 28,29,10 + CONTROL "&BGA",IDC_BGA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129, + 18,30,10 + CONTROL "AC&E",IDC_ACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,129, + 28,29,10 + CONTROL "C&PT",IDC_CPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159, + 18,29,10 + CONTROL "JA&K",IDC_JAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,159, + 28,29,10 + CONTROL "&7Z",IDC_7Z,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,188, + 18,21,10 + GROUPBOX "D&&D Shell Extension",IDC_STATIC,7,47,205,31 + CONTROL "Compress &Here",IDC_CMP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,14,61,65,10 + CONTROL "E&xpand Here",IDC_MLT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,85,61,72,10 + GROUPBOX "Shortcut",IDC_STATIC,7,84,205,30 + CONTROL "&SendTo",IDC_SND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 14,96,56,10 + CONTROL "&Desktop",IDC_DSK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 85,95,60,10 + PUSHBUTTON "...",IDC_ASS,193,31,13,9 +END + +IDD_MLTCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Extract" +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Destination Folder",IDC_STATIC,7,7,205,43 + CONTROL "Archive's Folder",IDC_DDIR1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,11,20,126,10 + CONTROL "",IDC_DDIR2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,11, + 33,10,8 + EDITTEXT IDC_DDIR,23,32,167,12,ES_AUTOHSCROLL | WS_GROUP + PUSHBUTTON "...",IDC_REF,194,31,13,14,WS_GROUP + CONTROL "Open",IDC_ODIR,"Button",BS_AUTOCHECKBOX | WS_GROUP | + WS_TABSTOP,163,18,42,10 + GROUPBOX "",IDC_STATIC,7,52,205,62 + CONTROL "Create Directory",IDC_MKDIR,"Button",BS_AUTOCHECKBOX | + WS_GROUP | WS_TABSTOP,16,62,183,10 + CONTROL "Not create when only 1 file is contained",IDC_MKDIR1, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,32,73,170,10 + CONTROL "Not create when only 1 folder is contained",IDC_MKDIR2, + "Button",BS_AUTOCHECKBOX | WS_TABSTOP,32,84,173,10 + CONTROL "Omit trail numbers",IDC_MKDIR3,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,32,95,169,10 +END + +IDD_CMPCFG DIALOG DISCARDABLE 0, 0, 219, 121 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Compress" +FONT 9, "MS Sans Serif" +BEGIN + GROUPBOX "Destination Folder",IDC_STATIC,7,7,205,43 + CONTROL "Source's Folder",IDC_DDIR1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,11,20,122,10 + CONTROL "",IDC_DDIR2,"Button",BS_AUTORADIOBUTTON | WS_TABSTOP,11, + 33,8,10 + EDITTEXT IDC_DDIR,23,32,167,12,ES_AUTOHSCROLL | WS_GROUP + PUSHBUTTON "...",IDC_REF,194,31,13,14,WS_GROUP + CONTROL "Open",IDC_ODIR,"Button",BS_AUTOCHECKBOX | WS_GROUP | + WS_TABSTOP,163,18,43,9 + GROUPBOX "Method",IDC_STATIC,7,57,117,57 + COMBOBOX IDC_CMPEXT,13,81,33,163,CBS_DROPDOWNLIST | CBS_SORT | + CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_GROUP | + WS_TABSTOP + COMBOBOX IDC_CMPMHD,49,81,66,79,CBS_DROPDOWNLIST | + CBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP + GROUPBOX "Which-To-Do",IDC_STATIC,133,57,79,57 + CONTROL "Compress Only",IDC_MODE1,"Button",BS_AUTORADIOBUTTON | + WS_GROUP,145,69,61,10 + CONTROL "mode-1",IDC_MODE2,"Button",BS_AUTORADIOBUTTON,145,79,59, + 10 + CONTROL "mode-2",IDC_MODE3,"Button",BS_AUTORADIOBUTTON | + WS_TABSTOP,145,89,60,10 + CONTROL "Extract Only",IDC_MODE4,"Button",BS_AUTORADIOBUTTON,145, + 99,60,10 +END + +IDD_ANYASS DIALOG DISCARDABLE 0, 0, 207, 97 +STYLE DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Other Format Association" +FONT 9, "MS Sans Serif" +BEGIN + LISTBOX IDC_NASSOC,7,7,77,62,LBS_SORT | LBS_NOINTEGRALHEIGHT | + LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "&Add >>",IDC_ADD,88,18,30,14 + LISTBOX IDC_ASSOC,123,7,77,62,LBS_SORT | LBS_NOINTEGRALHEIGHT | + LBS_EXTENDEDSEL | WS_VSCROLL | WS_TABSTOP + PUSHBUTTON "<< &Del",IDC_DEL,88,38,30,14 + DEFPUSHBUTTON "Execute",IDOK,95,76,50,14 + PUSHBUTTON "Abort",IDCANCEL,150,76,50,14 +END + +IDD_PATHCHECK DIALOG DISCARDABLE 0, 0, 298, 69 +STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU +CAPTION "Noah Warning" +FONT 9, "MS Sans Serif" +BEGIN + PUSHBUTTON "&Yes",IDYES,111,48,50,14 + LTEXT "Contains absolute path or parent path "".."". Do you really want to extrace this file?", + IDC_STATIC,7,7,270,10 + LTEXT "",IDC_PATHNAME,16,17,275,23 + PUSHBUTTON "Yes to &All",ID_ALLYES,165,48,50,14 + PUSHBUTTON "&Cancel",ID_ALLNO,241,48,50,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_ARCVIEW, DIALOG + BEGIN + RIGHTMARGIN, 350 + TOPMARGIN, 3 + BOTTOMMARGIN, 146 + END + + IDD_WINCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_MLTCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_CMPCFG, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 212 + TOPMARGIN, 7 + BOTTOMMARGIN, 114 + END + + IDD_ANYASS, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 200 + TOPMARGIN, 7 + BOTTOMMARGIN, 90 + END + + IDD_PATHCHECK, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 291 + TOPMARGIN, 7 + BOTTOMMARGIN, 62 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_M_ERROR "Can't extract !\nIt's a non-archive file or a broken archive." + IDS_C_ERROR "Unsupported compression method !\nMaybe because of the lack of DLL." + IDS_CHOOSEDIR "Choose a destination folder." + IDS_FNAME "NAME" + IDS_SIZE "SIZE" + IDS_DATETIME "TIME" + IDS_RATIO "RATIO" + IDS_METHOD "METHOD" + IDS_PATH "PATH" + IDS_EXECUTING "Application launched from Noah is living. Do you really want to close?" + IDS_NOLIST "Error: Can't ListUp The Contents of this Archive." + IDS_ARCVIEW_MSG "[%d files] [Ratio: %d%%] [%s]" +END + +#endif // 英語 (アメリカ) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + ADDED Noah.sln Index: Noah.sln ================================================================== --- Noah.sln +++ Noah.sln @@ -0,0 +1,20 @@ +サソ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual C++ Express 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Noah", "Noah.vcxproj", "{B9F0CC85-6A63-4320-A38A-2B9BCFDF9484}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Release|Win32 = Release|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {B9F0CC85-6A63-4320-A38A-2B9BCFDF9484}.Debug|Win32.ActiveCfg = Debug|Win32 + {B9F0CC85-6A63-4320-A38A-2B9BCFDF9484}.Debug|Win32.Build.0 = Debug|Win32 + {B9F0CC85-6A63-4320-A38A-2B9BCFDF9484}.Release|Win32.ActiveCfg = Release|Win32 + {B9F0CC85-6A63-4320-A38A-2B9BCFDF9484}.Release|Win32.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal ADDED Noah.suo Index: Noah.suo ================================================================== --- Noah.suo +++ Noah.suo cannot compute difference between binary files ADDED Noah.vcxproj Index: Noah.vcxproj ================================================================== --- Noah.vcxproj +++ Noah.vcxproj @@ -0,0 +1,167 @@ +サソ + + + + Debug + Win32 + + + Release + Win32 + + + + {B9F0CC85-6A63-4320-A38A-2B9BCFDF9484} + Win32Proj + Noah + + + + Application + true + MultiByte + + + Application + false + true + MultiByte + + + + + + + + + + + + + true + obj\$(Configuration)\ + + + false + obj\$(Configuration)\ + + + + Use + Level3 + Disabled + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + + + Windows + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;comctl32.lib;lz32.lib;version.lib;%(AdditionalDependencies) + $(IntDir)$(TargetName).pdb + kilib_startUp + + + manifest.xml + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) + false + + + false + Default + false + MultiThreaded + + + Windows + true + true + true + kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;comctl32.lib;lz32.lib;version.lib;%(AdditionalDependencies) + $(IntDir)$(TargetName).pdb + kilib_startUp + + + manifest.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Create + Create + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ADDED Noah.vcxproj.filters Index: Noah.vcxproj.filters ================================================================== --- Noah.vcxproj.filters +++ Noah.vcxproj.filters @@ -0,0 +1,186 @@ +サソ + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + 繝ェ繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + + 繝ェ繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + 繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + 繝倥ャ繝繝シ 繝輔ぃ繧、繝ォ + + + + + 繝ェ繧ス繝シ繧ケ 繝輔ぃ繧、繝ォ + + + ADDED NoahAM.cpp Index: NoahAM.cpp ================================================================== --- NoahAM.cpp +++ NoahAM.cpp @@ -0,0 +1,575 @@ +// NoahAM.cpp +//-- control many archiver routines -- + +#include "stdafx.h" +#include "resource.h" +#include "NoahApp.h" +#include "NoahAM.h" +#include "ArcDLL.h" +#include "ArcAce.h" +#include "ArcMsc.h" +#include "ArcB2e.h" +#include "ArcCpt.h" + +//----------------------------------------------// +//------ 実働部隊のデータで初期化しておく ------// +//----------------------------------------------// + +void CNoahArchiverManager::init() +{ + const char* kl = mycnf().kill(); + static int dead[128]; + while( *kl ) dead[ 0x7f & (*(kl++)) ] = 1; + + // 初期対応形式 + if( !dead['L'] ) m_AList.add( new CArcLzh ); + if( !dead['7'] ) m_AList.add( new CArc7z ), + m_AList.add( new CArc7zZip ); + if( !dead['Z'] ) m_AList.add( new CArcUnZip ); + if( !dead['z'] ) m_AList.add( new CArcZip ); + if( !dead['T'] ) m_AList.add( new CArcTar ); + if( !dead['C'] ) m_AList.add( new CArcCab ); + if( !dead['R'] ) m_AList.add( new CArcRar ); + if( !dead['A'] ) m_AList.add( new CArcArj ); + if( !dead['B'] ) m_AList.add( new CArcBga ); + if( !dead['Y'] ) m_AList.add( new CArcYz1 ); + if( !dead['G'] ) m_AList.add( new CArcGca ); + if( !dead['a'] ) m_AList.add( new CArcAce ); + if( !dead['M'] ) m_AList.add( new CArcMsc ); + if( !dead['c'] ) m_AList.add( new CArcCpt ); + + // 拡張スクリプトロード + char prev_cur[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, prev_cur); + ::SetCurrentDirectory( CArcB2e::init_b2e_path() ); + kiFindFile find; + find.begin( "*.b2e" ); + WIN32_FIND_DATA fd; + for( int t=0; find.next(&fd); t++ ) + m_AList.add( new CArcB2e(fd.cFileName) ); + m_b2e = (t>1); + ::SetCurrentDirectory(prev_cur); +} + +//----------------------------------------------// +//------------ ファイルリストを記憶 ------------// +//----------------------------------------------// + +unsigned long CNoahArchiverManager::set_files( const cCharArray& files ) +{ + //-- クリア + m_FName.empty(); + m_BasePathList.empty(); + + //-- 基底パスを取得( 出来るだけ利用範囲を広げるため、8.3形式で ) + if( files.len() != 0 ) + { + char spath[MAX_PATH]; + m_BasePath = + ( 0!=::GetShortPathName( files[0], spath, MAX_PATH ) ) + ? spath : ""; + if( !m_BasePath.beDirOnly() ) + { + m_BasePath.beSpecialPath( kiPath::Cur ); + m_BasePath.beBackSlash( true ); + } + } + + //-- 短いファイル名と長いのを両方取得しておく + m_FName.alloc( files.len() ); + m_BasePathList.alloc( files.len() ); + for( unsigned int i=0,c=0; i!=files.len(); i++ ) + if( kiFindFile::findfirst( files[i], &m_FName[c] ) ) + { + if( m_FName[c].cAlternateFileName[0] == '\0' ) + ::lstrcpy(m_FName[c].cAlternateFileName,m_FName[c].cFileName); + m_BasePathList[c] = files[i]; + if( !m_BasePathList[c].beDirOnly() ) + { + m_BasePathList[c].beSpecialPath( kiPath::Cur ); + m_BasePathList[c].beBackSlash( true ); + } + ++c; + } + m_FName.forcelen( c ); + m_BasePathList.forcelen( c ); + return c; +} + +//----------------------------------------------// +//--- ファイルリストに解凍ルーチンを割り当て ---// +//----------------------------------------------// + +// 指定された拡張子に対応しているルーチンを線形探索 +CArchiver* CNoahArchiverManager::fromExt( const char* ext ) +{ + kiStr tmp = ext; + tmp.lower(); + + for( unsigned int i=0; i!=m_AList.len(); i++ ) + if( m_AList[i]->extCheck( tmp ) + && (m_AList[i]->ability() & aMelt) ) + return m_AList[i]; + return NULL; +} + +bool CNoahArchiverManager::map_melters( int mode ) // 1:cmp 2:mlt 3:must_mlt +{ + // クリア + m_Melters.empty(); + +#define attrb (m_FName[ct].dwFileAttributes) +#define lname (m_FName[ct].cFileName) +#define sname (m_FName[ct].cAlternateFileName[0]==0 ? m_FName[ct].cFileName : m_FName[ct].cAlternateFileName) + + kiPath fnm; + const char* ext; + for( unsigned int ct=0, bad=0; ct!=file_num(); ct++ ) + { +// fnm = m_BasePath, fnm += sname; + fnm = m_BasePathList[ct], fnm += sname; + + //-- 0byteファイル / ディレクトリは弾く + if( !(attrb & FILE_ATTRIBUTE_DIRECTORY) && 0!=kiFile::getSize( fnm, 0 ) ) + { + //-- まず対応拡張子かどうかで候補Aを一つ選出 + CArchiver* x = fromExt( ext=kiPath::ext(lname) ); + + //-- 候補Aで、ファイル内容によるチェック + if( x && x->check( fnm ) ) + { + m_Melters.add( x ); + continue; + } + + //-- 候補Aが内容チェック不可なものだったらそれを使う + if( x && !(x->ability() & aCheck) ) + { + m_Melters.add( x ); + continue; + } + + //-- 候補Aがダメなら、その他の内容チェック可能なルーチン全てで試す + if( mode!=1 || 0==ki_strcmpi( "exe", ext ) ) + { + for( unsigned long j=0; j!=m_AList.len(); j++ ) + if( m_AList[j]!=x && m_AList[j]->check( fnm ) ) + { + m_Melters.add( m_AList[j] ); + break; + } + if( m_Melters.len() == ct+1 ) + continue; + } + } + + //-- チェックの結果、解凍不能でしたとさ + if( mode!=3 ) + return false; //-- 解凍専用モードでなければ終了 + m_Melters.add( NULL ), bad++; + } +#undef sname +#undef lname +#undef attrb + + return (ct!=bad); +} + +//----------------------------------------------// +//--- ファイルリストに圧縮ルーチンを割り当て ---// +//----------------------------------------------// + +bool CNoahArchiverManager::map_compressor( const char* ext, const char* method, bool sfx ) +{ + int m; + m_Method = -1; + m_Sfx = sfx; + + for( unsigned int i=0; i!=m_AList.len(); i++ ) + if( -1 != (m=m_AList[i]->cancompressby(ext,method,sfx)) ) + if( m!=-2 ) // 完全一致 + { + m_Compressor = m_AList[i]; + m_Method = m; + break; + } + else if( m_Method == -1 ) // 形式名のみ一致した最初のモノ + { + m_Compressor = m_AList[i]; + m_Method = m_AList[i]->cmp_mhd_default(); + } + return (m_Method != -1); +} + +//----------------------------------------------// +//------------ バージョン情報文字列 ------------// +//----------------------------------------------// + +void CNoahArchiverManager::get_version( kiStr& str ) +{ + kiStr tmp; + for( unsigned int i=0; i!=m_AList.len(); i++ ) + if( m_AList[i]->ver( tmp ) ) + str+=tmp, str+="\r\n"; +} + +//----------------------------------------------// +//--------------- 圧縮形式リスト ---------------// +//----------------------------------------------// + +static unsigned int find( const cCharArray& x, const char* o ) +{ + for( unsigned int i=0; i!=x.len(); i++ ) + if( 0==ki_strcmp( x[i], o ) ) + return i; + return 0xffffffff; +} + +static unsigned int find( const StrArray& x, const char* o ) +{ + for( unsigned int i=0; i!=x.len(); i++ ) + if( x[i]==o ) + return i; + return 0xffffffff; +} + +void CNoahArchiverManager::get_cmpmethod( + const char* set, + int& def_mhd, + StrArray& mhd_list, + bool need_ext, + cCharArray* ext_list ) +{ + def_mhd = -1; + + const char* x; + for( unsigned int i=0; i!=m_AList.len(); i++ ) + { + if( *(x = m_AList[i]->cmp_ext())=='\0' ) + continue; + if( need_ext ) + { + if( -1 == find( *ext_list, x ) ) + ext_list->add( x ); + } + if( 0 == ki_strcmp( set, x ) ) + { + if( mhd_list.len()==0 ) + { + def_mhd = m_AList[i]->cmp_mhd_default(); + for( unsigned int j=0; j!=m_AList[i]->cmp_mhd_list().len(); j++ ) + mhd_list.add( (m_AList[i]->cmp_mhd_list())[j] ); + } + else + { + for( unsigned int j=0; j!=m_AList[i]->cmp_mhd_list().len(); j++ ) + if( -1 == find( mhd_list, (m_AList[i]->cmp_mhd_list())[j] ) ) + mhd_list.add( (m_AList[i]->cmp_mhd_list())[j] ); + } + } + } + + if( def_mhd == -1 ) + def_mhd = 0; +} + +//----------------------------------------------// +//--------------- 書庫一覧モード ---------------// +//----------------------------------------------// + +#include "SubDlg.h" + +void CNoahArchiverManager::do_listing( kiPath& destdir ) +{ + kiWindow* mptr = app()->mainwnd(); + kiPath ddir; + int mdf = mycnf().mkdir(); + bool rmn = mycnf().mnonum(); + destdir.beBackSlash( true ); + + //-- ダイアログの個数カウンタをクリア + kiArray views; + CArcViewDlg::clear(); + + //-- ダイアログ起動 + for( unsigned int i=0; i!=m_FName.len(); i++ ) + { + if( !m_Melters[i] ) + continue; + + arcname an( + m_BasePathList[i], +// m_BasePath, + m_FName[i].cAlternateFileName[0]==0 ? m_FName[i].cFileName : m_FName[i].cAlternateFileName, + m_FName[i].cFileName ); + ddir = destdir; + + if( mdf ) + generate_dirname( m_FName[i].cFileName, ddir, rmn ); + + CArcViewDlg* x = new CArcViewDlg( m_Melters[i],an,ddir ); + views.add( x ); + x->createModeless( NULL ); + } + + //-- 全部終了するまで待機 + kiWindow::msgLoop( kiWindow::GET ); + + //-- お終い + app()->setMainWnd( mptr ); + for( i=0; i!=views.len(); i++ ) + delete views[i]; +} + +//----------------------------------------------// +//----------------- 解凍作業 -------------------// +//----------------------------------------------// + +void CNoahArchiverManager::do_melting( kiPath& destdir ) +{ + //-- 設定ロード + const int mdf = mycnf().mkdir(); // Make Directory Flag( 0:no 1:no1file 2: noddir 3:yes ) + const bool rmn = mycnf().mnonum(); // Remove NuMber ? + + //-- 出力先 + destdir.beBackSlash( true ); + destdir.mkdir(), destdir.beShortPath(); + + for( unsigned int i=0; i!=m_FName.len(); i++ ) + if( m_Melters[i] ) + { + //-- 出力先 + + int mk=2; // 0:no 1:yes 2:??? + kiPath ddir( destdir ), dnm; + if( mdf==0 ) + mk=0; + else if( mdf==3 ) + mk=1; + else + { + kiPath anm(m_BasePathList[i]); +// kiPath anm(m_BasePath); + anm+=m_FName[i].cFileName; + int c = m_Melters[i]->contents( anm, dnm ); + if( c==aSingleDir || (c==aSingleFile && mdf==1) ) + mk=0; // 2重フォルダ防止処理(強) + else if( c==aMulti ) + mk=1; + } + if( mk ) + { + generate_dirname( m_FName[i].cFileName, ddir, rmn ); + if( mk==2 && kiSUtil::exist(ddir) ) + mk=1; + ddir+='\\'; + ddir.mkdir(); + ddir.beShortPath(); + } + + //-- 解凍! + + arcname an( m_BasePathList[i], +// arcname an( m_BasePath, + m_FName[i].cAlternateFileName[0]==0 ? m_FName[i].cFileName : m_FName[i].cAlternateFileName, + m_FName[i].cFileName ); + int result = m_Melters[i]->melt( an, ddir ); + if( result<0x8000 ) + { + if( mk==2 ) // 2重フォルダ防止処理(弱) + break_ddir( ddir, mdf==2 ); + else if( mk==0 && dnm.len() ) // 2重フォルダ防止処理(強) + if( dnm.len()<=1 || dnm[1]!=':' ) // 絶対パスは開かない + ddir+=dnm, ddir+='\\'; + // 出力先を開くかも + myapp().open_folder( ddir, 1 ); + } + else if( result!=0x8020 ) + { + //エラー! + char str[255]; + wsprintf( str, "%s\nError No: [%x]", + (const char*)kiStr().loadRsrc( IDS_M_ERROR ), result ); + app()->msgBox( str ); + } + } +} + +void CNoahArchiverManager::generate_dirname( const char* src, kiPath& dst, bool rmn ) +{ + // srcで示された書庫名からディレクトリ名を生成し、 + // dstへ足す。rmn==trueなら末尾の数字も削除 + + // 一番左の . と左から二番目の . を探す + const char *fdot=NULL, *sdot=NULL, *tail; + for( tail=src; *tail; tail=kiStr::next(tail) ) + if( *tail=='.' ) + sdot=fdot, fdot=tail; + + // .tar.xxx か、.xxx.gz/.xxx.z/.xxx.bz2 なら二つ削除 + if( fdot ) + { + tail = fdot; + if( sdot ) + if( 0==::lstrcmpi(fdot,".gz") + || 0==::lstrcmpi(fdot,".z") + || 0==::lstrcmpi(fdot,".bz2") + || (sdot+4==fdot + && (sdot[1]=='t'||sdot[1]=='T') + && (sdot[2]=='a'||sdot[2]=='A') + && (sdot[3]=='r'||sdot[3]=='R') + )) + tail = sdot; + } + + // 末尾の数字と'-'と'_'と'.'削除。半角スペースも。 + bool del[256]; + ki_memzero( del, sizeof(del) ); + if( rmn ) + { + del['-'] = del['_'] = del['.'] = true; + for( char c='0'; c<='9'; ++c ) + del[c] = true; + } + del[' '] = true; + + const char* mjs=NULL; + for( const char *x=src; x to 移動 + if( ::MoveFile( now, to ) ) + { + dir.remove(); + dir.beBackSlash( false ), dir.beDirOnly(); + return true; + } + } + } +//-- フォルダだった場合 ---------------------------------------- + else + { + // 'base/aaa/aaa/' だと中のaaaを外にmoveできない。 + // よって、回避策。-> 'base/aaa_noah_tmp_178116/aaa/' + + dir.beBackSlash( false ); + kiFindFile::findfirst( dir, &fd3 ); + kiPath dirx( dir ); dirx+="_noah_tmp_178116"; + + if( ::MoveFile( dir, dirx ) ) + { + // now 現在のファイル名 + kiStr now( dirx ); now+='\\', now+=fd.cFileName; + + // ディレクトリを移動 + if( ::MoveFile( now, to ) ) + { + dirx.remove(); + dir=to, dir.beBackSlash( true ); + return true; + } + else + { + // 'base/aaa_noah_tmp_178116/aaa/' -> 'base/aaa/aaa/' + dir.beDirOnly(), dir+=fd3.cFileName; + ::MoveFile( dirx, dir ); + } + } + + dir.beBackSlash( true ); + } +//------------------------------------------------------------ + return false; +} + +//----------------------------------------------// +//----------------- 圧縮作業 -------------------// +//----------------------------------------------// + +void CNoahArchiverManager::do_compressing( kiPath& destdir, bool each ) +{ + int result = 0xffff, tr; + + // 出力先を確実に作っておく + destdir.beBackSlash( true ); + destdir.mkdir(); + destdir.beShortPath(); + + // 個別圧縮モードか、Archiving不可の形式なら一個ずつ + if( each || !(m_Compressor->ability() & aArchive) ) + { + wfdArray templist; + + for( unsigned int i=0; i!=m_FName.len(); i++ ) + { + templist.empty(); + templist.add( m_FName[i] ); + tr = m_Compressor->compress( m_BasePath,templist,destdir,m_Method,m_Sfx ); + if( tr<0x8000 || tr==0x8020 ) + result = tr; + } + } + else + result = m_Compressor->compress( m_BasePath,m_FName,destdir,m_Method,m_Sfx ); + + // 開くかも + if( result<0x8000 ) + myapp().open_folder( destdir, 2 ); + else if( result!=0x8020 ) + { + //エラー! + char str[255]; + wsprintf( str, "%s\nError No: [%x]", "Compression Error", result ); + app()->msgBox( str ); + } +} ADDED NoahAM.h Index: NoahAM.h ================================================================== --- NoahAM.h +++ NoahAM.h @@ -0,0 +1,67 @@ +// NoahAM.h +//-- CNoahArchiverManager -- control many archiver routines -- + +#ifndef AFX_NOAHAM_H__CCE30761_D91B_4570_931A_6C165B19B22F__INCLUDED_ +#define AFX_NOAHAM_H__CCE30761_D91B_4570_931A_6C165B19B22F__INCLUDED_ + +#include "Archiver.h" + +class CNoahArchiverManager +{ +public: //-- 外向けインターフェイス ------------ + + // 初期化 + void init(); + + // ファイルリストを記憶 + unsigned long set_files( const cCharArray& files ); + unsigned long file_num() { return m_FName.len(); } + const kiPath& get_basepath() { return m_BasePath; } + bool map_melters( int mode ); + bool map_compressor( const char* ext, const char* method, bool sfx ); + + // 解凍( 解凍先Dir以外の情報は中で勝手に取得します ) + void do_melting( kiPath& destdir ); + // 閲覧( 解凍先Dir以外の情報は中で勝手に取得します ) + void do_listing( kiPath& destdir ); + // 圧縮 + void do_compressing( kiPath& destdir, bool each ); + + + // バージョン情報 + void get_version( kiStr& str ); + // 圧縮形式リスト + void get_cmpmethod( const char* set, int& def_mhd, StrArray& mhd_list, bool need_ext=false, cCharArray* ext_list=NULL ); + // b2eが一個以上読み込まれていればtrue + bool b2e_enabled() { return m_b2e; } + + +private: //-- 内部処理 --------------------------- + + // 2重フォルダ解消など + bool break_ddir( kiPath& dir, bool onlydir ); + CArchiver* fromExt( const char* ext ); + void generate_dirname( const char* src, kiPath& dst, bool rmn ); + + kiPath m_BasePath; + wfdArray m_FName; + kiArray m_AList; + kiArray m_BasePathList; + bool m_b2e; + + // 解凍用割り当て + kiArray m_Melters; + // 圧縮用割り当て + CArchiver* m_Compressor; + int m_Method; + bool m_Sfx; + +public: + ~CNoahArchiverManager() + { + for( unsigned int i=0; i!=m_AList.len(); i++ ) + delete m_AList[i]; + } +}; + +#endif ADDED NoahApp.h Index: NoahApp.h ================================================================== --- NoahApp.h +++ NoahApp.h @@ -0,0 +1,45 @@ +// NoahApp.h +//-- CNoahApp -- application object of 'Noah' -- + +#ifndef AFX_NOAHAPP_H__11AA6C03_4946_4279_B79C_F28896001357__INCLUDED_ +#define AFX_NOAHAPP_H__11AA6C03_4946_4279_B79C_F28896001357__INCLUDED_ + +#include "NoahAM.h" +#include "NoahCM.h" + +class CNoahApp : public kiApp +{ +public: //-- 外向けインターフェイス ------ + + //-- 圧縮/解凍作業 + void do_cmdline( bool directcall=false ); + void do_files( const cCharArray& files, + const cCharArray* opts=NULL, + bool basicaly_ignore=false ); + + //-- 雑用(笑) + void open_folder( const kiPath& path,int from=0 ); + void get_tempdir( kiPath& tmp ); + bool is_writable_dir( const kiPath& path ); + + //-- Noahオブジェクト取得用マクロ +# define myapp() (*(CNoahApp*)app()) +# define myarc() (*(((CNoahApp*)app())->arc())) +# define mycnf() (*(((CNoahApp*)app())->cnf())) + +public: //-- 内部処理 -------------------- + + CNoahArchiverManager* arc(){ return &m_arcMan; } + CNoahConfigManager* cnf() { return &m_cnfMan; } +private: + void run( kiCmdParser& cmd ); + + CNoahArchiverManager m_arcMan; + CNoahConfigManager m_cnfMan; + kiCmdParser* m_pCmd; + + kiPath m_tmpDir; + UINT m_tmpID; +}; + +#endif ADDED NoahCM.cpp Index: NoahCM.cpp ================================================================== --- NoahCM.cpp +++ NoahCM.cpp @@ -0,0 +1,738 @@ +// NoahCM.cpp +//-- CNoahConfigManager -- save / load / modify the setting of 'Noah' -- + +#include "stdafx.h" +#include "resource.h" +#include "NoahApp.h" +#include "NoahCM.h" + +//----------------------------------------------// +//---------- INIファイル名の設定など -----------// +//----------------------------------------------// + +void CNoahConfigManager::init() +{ + //-- caldix.iniがもしあればDLLインストール先を読み込み。環境変数に追加 + { + kiIniFile caldini; + caldini.setFileName( "caldix.ini" ); + caldini.setSection( "conf" ); + kiStr dll_to = caldini.getStr( "dll", "" ); + if( dll_to.len() != 0 ) + { + int siz = ::GetEnvironmentVariable( "PATH", NULL, 0 ); + char* buf = new char[siz+1]; + ::GetEnvironmentVariable( "PATH", buf, siz+1 ); + ::SetEnvironmentVariable( "PATH", (kiStr(buf)+=";")+=dll_to ); + delete [] buf; + } + } + + //-- 設定読み込み済みフラグをクリア + m_Loaded = 0; + + //-- iniファイル名設定 + char usr[256]; + DWORD siz=sizeof(usr); + if( !::GetUserName( usr, &siz ) ) + ki_strcpy( usr, "Default" ); + m_Ini.setFileName( "Noah.ini" ); + m_Ini.setSection( usr ); + + //-- 解凍用設定は全部ロードしておく + load( Melt ); +} + +//----------------------------------------------// +//------------ 設定の load & save --------------// +//----------------------------------------------// + +typedef bool (WINAPI * XT_IA)(); +typedef void (WINAPI * XT_LS)(bool*,bool*); +typedef void (WINAPI * XT_SS)(bool,bool); +typedef void (WINAPI * XT_AS)(bool*); +typedef void (WINAPI * XT_LSEX)(const char*,bool*); +typedef void (WINAPI * XT_SSEX)(const char*,bool); + +void CNoahConfigManager::load( loading_flag what ) +{ + if( (what & Mode) && !(m_Loaded & Mode) ) //----------- モード + { + m_Mode = m_Ini.getInt( "Mode", 2 ) & 3; + m_MiniBoot = m_Ini.getBool( "MiniBoot", false ); + m_OneExt = m_Ini.getBool( "OneExt", false ); + m_ZeroExt = m_Ini.getBool( "NoExt", false ); + m_MbLim = max( 1, m_Ini.getInt( "MultiBootLimit", 4 ) ); + } + if( (what & Melt) && !(m_Loaded & Melt) ) //----------- 解凍 + { + const char* x = m_Ini.getStr( "MDir", kiPath( kiPath::Dsk ) ); + m_MDirSm = (*x=='@'); + m_MDir = (*x=='@') ? x+1 : x; + const int m = m_Ini.getInt( "MkDir", 2 ); + m_MNoNum = ( m>=16 ); + m_MkDir = ( m&3 ); + m_Kill = m_Ini.getStr( "Kill", "" ); + } + if( (what & Compress) && !(m_Loaded & Compress) ) //--- 圧縮 + { + const char* x = m_Ini.getStr( "CDir", kiPath( kiPath::Dsk ) ); + m_CDirSm = (*x=='@'); + m_CDir = (*x=='@') ? x+1 : x; + m_CExt = m_Ini.getStr( "CExt", "zip" ); + m_CMhd = m_Ini.getStr( "CMhd", "7-zip" ); + } + if( (what & Shell) && !(m_Loaded & Shell) ) //---------- ショートカット + //---------- 関連づけ + //---------- シェルエクステンション + { + m_OldVer = m_Ini.getBool( "OldAbout", false ); + + kiPath SndLink(kiPath::Snd),DskLink(kiPath::Dsk); + SndLink += "Noah.lnk", DskLink += "Noah.lnk"; + m_SCSendTo = kiSUtil::exist(SndLink); + m_SCDesktop= kiSUtil::exist(DskLink); + + m_bShlOK = NOSHL; + m_hNoahXtDLL = kiSUtil::loadLibrary( "NoahXt" ); + if( m_hNoahXtDLL ) + { + XT_IA Init = (XT_IA)getProc( "Init" ); + m_bShlOK = ( Init() ? SHLOK : NOADMIN ); + XT_LS LoadSE = (XT_LS)getProc( "LoadSE" ); + XT_AS LoadAssoc = (XT_AS)getProc( "LoadAS" ); + XT_LSEX LoadASEx = (XT_LSEX)getProc( "LoadASEx" ); + LoadSE( &m_SECmp, &m_SEExt ); + LoadAssoc( m_bAsso ); + LoadASEx( "7z\0", &m_bAsso[12] ); + } + } + if( (what & OpenDir) && !(m_Loaded & OpenDir) ) //------ フォルダオープン + { + m_MODir = m_Ini.getBool( "MODir", true ); + m_CODir = m_Ini.getBool( "CODir", true ); + m_OpenBy = m_Ini.getStr( "OpenBy", kiPath(kiPath::Win)+"explorer.exe \"%s\"" ); + } + + m_Loaded |= what; +} + +void CNoahConfigManager::save() +{ + kiStr tmp; + + //-- モード + m_Ini.putInt( "Mode", m_Mode ); + //-- 解凍 + tmp = m_MDirSm ? "@" : "", tmp+= m_MDir; + m_Ini.putStr( "MDir", tmp ); + m_Ini.putInt( "MkDir", m_MkDir+(m_MNoNum?16:0) ); + //-- 圧縮 + tmp = m_CDirSm ? "@" : "", tmp+= m_CDir; + m_Ini.putStr( "CDir", tmp ); + m_Ini.putStr( "CExt", m_CExt ); + m_Ini.putStr( "CMhd", m_CMhd ); + //-- ショートカット + kiPath SndLink(kiPath::Snd); SndLink += "Noah.lnk"; + kiPath DskLink(kiPath::Dsk); DskLink += "Noah.lnk"; + if( m_SCSendTo ) + { + if( !kiSUtil::exist(SndLink) ) + kiSUtil::createShortCut( kiPath(kiPath::Snd), "Noah" ); + } + else + ::DeleteFile(SndLink); + if( m_SCDesktop ) + { + if( !kiSUtil::exist(DskLink) ) + kiSUtil::createShortCut( kiPath(kiPath::Dsk), "Noah" ); + } + else + ::DeleteFile(DskLink); + //-- 関連づけ・シェルエクステンション + if( m_bShlOK ) + { + XT_SS SaveSE = (XT_SS)getProc( "SaveSE" ); + XT_AS SaveAssoc = (XT_AS)getProc( "SaveAS" ); + XT_SSEX SaveASEx = (XT_SSEX)getProc( "SaveASEx" ); + SaveSE( m_SECmp, m_SEExt ); + SaveAssoc( m_bAsso ); + SaveASEx( "7z\0", m_bAsso[12] ); + } + //-- フォルダオープン + m_Ini.putBool("MODir", m_MODir ); + m_Ini.putBool("CODir", m_CODir ); +} + +void CNoahConfigManager::dialog() +{ + CNoahConfigDialog dlg; + dlg.createModeless( NULL ); + + app()->setMainWnd( &dlg ); + + if( dlg.isAlive() ) + kiWindow::msgLoop(); +} + +FARPROC CNoahConfigManager::getProc( const char* name ) +{ + return ::GetProcAddress( m_hNoahXtDLL, name ); +} + +//----------------------------------------------// +//--------------- ダイアログ関係 ---------------// +//----------------------------------------------// + +///////// 初期化 ///////////// + +#define IDI_LZH 101 +#define IDI_ZIP 102 +#define IDI_CAB 103 +#define IDI_RAR 104 +#define IDI_TAR 105 +#define IDI_YZ1 106 +#define IDI_GCA 107 +#define IDI_ARJ 108 +#define IDI_BGA 109 +#define IDI_ACE 110 +#define IDI_OTH 111 +#define IDI_JAK 112 + +#define icon_is(_x) { if( mycnf().m_hNoahXtDLL ) setIcon( ::LoadIcon( mycnf().m_hNoahXtDLL, MAKEINTRESOURCE(_x) ) ); } + CNoahConfigDialog::CCmprPage::CCmprPage() : kiPropSheetPage( IDD_CMPCFG ) icon_is( IDI_ACE ) + CNoahConfigDialog::CMeltPage::CMeltPage() : kiPropSheetPage( IDD_MLTCFG ) icon_is( IDI_LZH ) + CNoahConfigDialog::CWinXPage::CWinXPage() : kiPropSheetPage( IDD_WINCFG ) icon_is( IDI_YZ1 ) + CNoahConfigDialog::CInfoPage::CInfoPage() : kiPropSheetPage( IDD_INFCFG ) icon_is( IDI_GCA ) +#undef icon_is + +CNoahConfigDialog::CNoahConfigDialog() +{ + //-- [icon] Noahのプロパティ + m_Header.dwFlags |= PSH_PROPTITLE | PSH_USEICONID; + m_Header.pszIcon = MAKEINTRESOURCE( IDI_MAIN ); + m_Header.pszCaption = "Noah"; + + //-- アクセラレータをセット + loadAccel( IDR_ACCEL ); + + //-- ページをどかどかと追加 + m_Pages.add( new CCmprPage ); + m_Pages.add( new CMeltPage ); + m_Pages.add( new CWinXPage ); + m_Pages.add( new CInfoPage ); +} + +BOOL CNoahConfigDialog::onInit() +{ + //-- DnD ON, 前面へ + ::DragAcceptFiles( hwnd(), TRUE ); + setFront( hwnd() ); + return FALSE; +} + +///////// 各種コマンド ///////////// + +void CNoahConfigDialog::onCommand( UINT id ) +{ + //-- アクセラレータトラップ + if( id == IDA_HELP ) onHelp(); + else if( id == IDA_MYDIR ) myapp().open_folder( kiPath( kiPath::Exe ) ); +} + +void CNoahConfigDialog::onHelp() +{ + kiPath exepos( kiPath::Exe ); + + //-- exeと同じ箇所にあるmanual.htmを起動 + kiPath hlp(exepos); hlp+="manual.htm"; + if( kiSUtil::exist(hlp) ) + ::ShellExecute( hwnd(), NULL, hlp, NULL, NULL, SW_MAXIMIZE ); + else + { + //-- 無ければreadme.txtを + hlp=exepos; hlp+="readme.txt"; + if( kiSUtil::exist(hlp) ) + ::ShellExecute( hwnd(), NULL, hlp, NULL, NULL, SW_SHOWDEFAULT ); + } +} + +void CNoahConfigDialog::onDrop( HDROP hdrop ) +{ + //-- ダイアログへのドラッグ&ドロップ + sendOK2All(); + + //-- 途中で邪魔にならないように、消える + ::ShowWindow( hwnd(), SW_HIDE ); + + char str[MAX_PATH]; + StrArray reallist; + cCharArray dummy; + + unsigned long max = ::DragQueryFile( hdrop, 0xffffffff, NULL, 0 ); + for( unsigned int i=0; i!=max; i++ ) + { + ::DragQueryFile( hdrop, i, str, MAX_PATH ); + reallist.add( kiStr(str) ); + } + for( i=0; i!=max; i++ ) + dummy.add( (const char*)reallist[i] ); + myapp().do_files( dummy, NULL ); + + // 復帰 + ::DragFinish( hdrop ); + ::ShowWindow( hwnd(), SW_SHOW ); +} + +///////// 終了時処理など ///////////// + +void CNoahConfigDialog::shift_and_button() +{ + if( app()->keyPushed( VK_SHIFT ) ) + { + app()->setMainWnd( NULL ); + myapp().do_cmdline(); + } +} + +bool CNoahConfigDialog::onOK() +{ + onApply(); + ::PostQuitMessage( 0 ); + return true; +} + +void CNoahConfigDialog::onApply() +{ + mycnf().save(); + shift_and_button(); +} + +bool CNoahConfigDialog::onCancel() +{ + sendOK2All(); + ::ShowWindow( hwnd(), SW_HIDE ); + shift_and_button(); + ::PostQuitMessage( 0 ); + return true; +} + +///////// 圧縮設定・解凍設定の共通部分 ///////////// + +static void dirinit( kiDialog* dlg, bool same, bool open, const char* dir ) +{ + dlg->sendMsgToItem( same ? IDC_DDIR1 : IDC_DDIR2 , BM_SETCHECK, TRUE ); + if( open ) + dlg->sendMsgToItem( IDC_ODIR , BM_SETCHECK, TRUE ); + dlg->sendMsgToItem( IDC_DDIR , WM_SETTEXT , 0, (LPARAM)dir ); +} + +static void dirok( kiDialog* dlg, bool& same, bool& open, kiPath& dir ) +{ + same = ( BST_CHECKED==dlg->sendMsgToItem( IDC_DDIR1, BM_GETCHECK ) ); + open = ( BST_CHECKED==dlg->sendMsgToItem( IDC_ODIR, BM_GETCHECK ) ); + static char str[MAX_PATH]; + dlg->sendMsgToItem( IDC_DDIR, WM_GETTEXT, MAX_PATH, (LPARAM)str ); + dir = str; +} + +static bool dirdlg( kiDialog* dlg, UINT msg, WPARAM wp ) +{ + if( msg==WM_COMMAND && LOWORD(wp)==IDC_REF ) + { + kiSUtil::getFolderDlgOfEditBox( + dlg->item(IDC_DDIR), dlg->hwnd(), kiStr().loadRsrc(IDS_CHOOSEDIR) ); + return true; + } + return false; +} + +///////// 圧縮設定 ///////////// + +BOOL CNoahConfigDialog::CCmprPage::onInit() +{ + // 圧縮先フォルダ + dirinit( this, mycnf().cdirsm(), mycnf().codir(), mycnf().cdir() ); + + // 動作モード + sendMsgToItem( IDC_MODE1 + mycnf().mode(), BM_SETCHECK, TRUE ); + + // 圧縮形式 + correct( mycnf().cext(), true ); + int ind=sendMsgToItem( IDC_CMPMHD, CB_FINDSTRINGEXACT, -1, (LPARAM)(const char*)mycnf().cmhd() ); + if( ind!=CB_ERR ) + sendMsgToItem( IDC_CMPMHD, CB_SETCURSEL, ind ); + + // ツールチップ + m_tooltip = ::CreateWindowEx( + 0, TOOLTIPS_CLASS, NULL, TTS_ALWAYSTIP, + CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, + hwnd(), NULL, app()->inst(), NULL ); + SetUpToolTip(); + + ::SetFocus(hwnd()); + return TRUE; +} + +bool CNoahConfigDialog::CCmprPage::onOK() +{ + // 圧縮先フォルダ + dirok( this, mycnf().m_CDirSm, mycnf().m_CODir, mycnf().m_CDir ); + + // 動作モード + for( int i=0; i!=4; i++ ) + if( BST_CHECKED==sendMsgToItem( IDC_MODE1 + i, BM_GETCHECK ) ) + { mycnf().m_Mode = i; break; } + + // 圧縮形式 + char str[200]=""; + sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)str ); + if( *str ) + { + mycnf().m_CExt = str; + sendMsgToItem( IDC_CMPMHD, CB_GETLBTEXT, sendMsgToItem( IDC_CMPMHD, CB_GETCURSEL ), (LPARAM)str ); + mycnf().m_CMhd = str; + } + + onCancel(); // 終了処理 + return true; +} + +bool CNoahConfigDialog::CCmprPage::onCancel() +{ + // 終了処理 + ::DestroyWindow( m_tooltip ); + return true; +} + +void CNoahConfigDialog::CCmprPage::SetUpToolTip() +{ + char ext[200]=""; + sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)ext ); + char mhd[200]=""; + sendMsgToItem( IDC_CMPMHD, CB_GETLBTEXT, sendMsgToItem( IDC_CMPMHD, CB_GETCURSEL ), (LPARAM)mhd ); + + TOOLINFO ti = {sizeof(TOOLINFO)}; + ti.uFlags = TTF_SUBCLASS; + { + ti.uId = 0; + ti.hwnd = item(IDC_CMPEXT); + ::GetClientRect( item(IDC_CMPEXT), &ti.rect ); + SendMessage( m_tooltip, TTM_DELTOOL, 0, (LPARAM)&ti ); + if( *ext ) + { + ti.lpszText = ext; + SendMessage( m_tooltip, TTM_ADDTOOL, 0, (LPARAM)&ti ); + } + } + { + ti.uId = 1; + ti.hwnd = item(IDC_CMPMHD); + ::GetClientRect( item(IDC_CMPMHD), &ti.rect ); + SendMessage( m_tooltip, TTM_DELTOOL, 0, (LPARAM)&ti ); + if( *mhd ) + { + ti.lpszText = mhd; + SendMessage( m_tooltip, TTM_ADDTOOL, 0, (LPARAM)&ti ); + } + } +} + +BOOL CALLBACK CNoahConfigDialog::CCmprPage::proc( UINT msg, WPARAM wp, LPARAM lp ) +{ + if( dirdlg( this, msg, wp ) ) + return TRUE; + + if( msg==WM_COMMAND && HIWORD(wp)==CBN_SELCHANGE && LOWORD(wp)==IDC_CMPEXT ) + { + char str[200]=""; + sendMsgToItem( IDC_CMPEXT, CB_GETLBTEXT, sendMsgToItem( IDC_CMPEXT, CB_GETCURSEL ), (LPARAM)str ); + if( *str ) + correct( str, false ); + SetUpToolTip(); + return TRUE; + } + else if( msg==WM_COMMAND && HIWORD(wp)==CBN_SELCHANGE && LOWORD(wp)==IDC_CMPMHD ) + { + SetUpToolTip(); + } + return FALSE; +} + +void CNoahConfigDialog::CCmprPage::correct( const char* ext, bool first ) +{ + cCharArray extl; + StrArray mhdl; + int mhdef; + myarc().get_cmpmethod( ext, mhdef, mhdl, first, &extl ); + + if( first ) + for( unsigned int i=0; i!=extl.len(); i++ ) + sendMsgToItem( IDC_CMPEXT, CB_ADDSTRING, 0, (LPARAM)extl[i] ); + sendMsgToItem( IDC_CMPEXT, CB_SELECTSTRING, 0, (LPARAM)ext ); + + sendMsgToItem( IDC_CMPMHD, CB_RESETCONTENT ); + for( unsigned int j=0; j!=mhdl.len(); j++ ) + sendMsgToItem( IDC_CMPMHD, CB_ADDSTRING, 0, (LPARAM)(const char*)mhdl[j] ); + sendMsgToItem( IDC_CMPMHD, CB_SETCURSEL, mhdef ); +} + + +///////// 解凍設定 ///////////// + +BOOL CNoahConfigDialog::CMeltPage::onInit() +{ + // 解凍先フォルダ + dirinit( this, mycnf().mdirsm(), mycnf().modir(), mycnf().mdir() ); + + // フォルダ自動生成 + if( mycnf().mkdir()!=0 ) + sendMsgToItem( IDC_MKDIR ,BM_SETCHECK, TRUE ); + if( mycnf().mkdir()==1 ) + sendMsgToItem( IDC_MKDIR1,BM_SETCHECK, TRUE ); + if( mycnf().mkdir()==2 ) + sendMsgToItem( IDC_MKDIR2,BM_SETCHECK, TRUE ); + if( mycnf().mnonum() ) + sendMsgToItem( IDC_MKDIR3,BM_SETCHECK, TRUE ); + correct(); + + return FALSE; +} + +bool CNoahConfigDialog::CMeltPage::onOK() +{ + // 解凍先フォルダ + dirok( this, mycnf().m_MDirSm, mycnf().m_MODir, mycnf().m_MDir ); + + // フォルダ自動生成 + mycnf().m_MNoNum = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR3, BM_GETCHECK ) ); + if( BST_CHECKED!=sendMsgToItem( IDC_MKDIR ,BM_GETCHECK ) ) + mycnf().m_MkDir = 0; + else + { + if( BST_CHECKED==sendMsgToItem( IDC_MKDIR1 ,BM_GETCHECK ) ) + mycnf().m_MkDir = 1; + else if( BST_CHECKED==sendMsgToItem( IDC_MKDIR2 ,BM_GETCHECK ) ) + mycnf().m_MkDir = 2; + else + mycnf().m_MkDir = 3; + } + return true; +} + +BOOL CALLBACK CNoahConfigDialog::CMeltPage::proc( UINT msg, WPARAM wp, LPARAM lp ) +{ + if( dirdlg( this, msg, wp ) ) + return TRUE; + + if( msg==WM_COMMAND ) + if( LOWORD(wp)==IDC_MKDIR || LOWORD(wp)==IDC_MKDIR1 ) + { + correct(); + return TRUE; + } + + return FALSE; +} + +void CNoahConfigDialog::CMeltPage::correct() +{ + BOOL _mk = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR ,BM_GETCHECK ) ); + BOOL _1f = ( BST_CHECKED==sendMsgToItem( IDC_MKDIR1,BM_GETCHECK ) ); + ::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR1), _mk ); + ::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR2), _mk && !_1f ); + ::EnableWindow( ::GetDlgItem(hwnd(),IDC_MKDIR3), _mk ); + if( _1f ) + sendMsgToItem( IDC_MKDIR2, BM_SETCHECK, TRUE ); +} + +///////// Windows拡張設定 ///////////// + +BOOL CNoahConfigDialog::CWinXPage::onInit() +{ + if( !mycnf().m_bShlOK ) + for( UINT i=IDC_LZH; i<=IDC_MLT; i++ ) + ::EnableWindow( item(i), FALSE ); + else + { + for( UINT i=IDC_LZH; i<=IDC_7Z; i++ ) + if( mycnf().m_bAsso[i-IDC_LZH] ) + sendMsgToItem( i, BM_SETCHECK, TRUE ); + if( mycnf().m_SECmp ) + sendMsgToItem( IDC_CMP ,BM_SETCHECK, TRUE ); + if( mycnf().m_SEExt ) + sendMsgToItem( IDC_MLT ,BM_SETCHECK, TRUE ); + } + if( !mycnf().m_bShlOK || !myarc().b2e_enabled() ) + { + ::ShowWindow( item(IDC_ASS), SW_HIDE ); + ::EnableWindow( item(IDC_ASS), FALSE ); + } + if( mycnf().m_bShlOK!=1 ) + ::ShowWindow( item(IDC_NOADMIN), SW_HIDE ); + if( mycnf().m_SCSendTo ) + sendMsgToItem( IDC_SND, BM_SETCHECK, TRUE ); + if( mycnf().m_SCDesktop ) + sendMsgToItem( IDC_DSK, BM_SETCHECK, TRUE ); + + return FALSE; +} + +bool CNoahConfigDialog::CWinXPage::onOK() +{ + mycnf().m_SCSendTo = ( BST_CHECKED==sendMsgToItem( IDC_SND ,BM_GETCHECK ) ); + mycnf().m_SCDesktop= ( BST_CHECKED==sendMsgToItem( IDC_DSK ,BM_GETCHECK ) ); + for( UINT i=IDC_LZH; i<=IDC_7Z; i++ ) + mycnf().m_bAsso[i-IDC_LZH] = ( BST_CHECKED==sendMsgToItem( i, BM_GETCHECK ) ); + mycnf().m_SECmp = ( BST_CHECKED==sendMsgToItem( IDC_CMP ,BM_GETCHECK ) ); + mycnf().m_SEExt = ( BST_CHECKED==sendMsgToItem( IDC_MLT ,BM_GETCHECK ) ); + + return true; +} + +BOOL CALLBACK CNoahConfigDialog::CWinXPage::proc( UINT msg, WPARAM wp, LPARAM lp ) +{ + if( msg==WM_COMMAND ) + if( LOWORD(wp)==IDC_ASS ) + { + CAssPage x( hwnd() ); + return TRUE; + } + return FALSE; +} + +CNoahConfigDialog::CAssPage::CAssPage( HWND parent ) : kiDialog( IDD_ANYASS ) +{ + doModal( parent ); +} + +BOOL CNoahConfigDialog::CAssPage::onInit() +{ + typedef void (WINAPI * XT_LAX)(const char*,bool*); + XT_LAX LoadASEx = (XT_LAX)mycnf().getProc( "LoadASEx" ); + static const char* const ext_list[] = + { "lzh","zip","cab","rar","tar","yz1","gca","arj","gza","ace","cpt","jak","7z" }; + + // b2e検索 + kiPath wild( kiPath::Exe ); + wild += "b2e\\*.b2e"; + kiFindFile find; + find.begin( wild ); + + char* first_dot; + bool state; + HWND lst[] = { item(IDC_NASSOC), item(IDC_ASSOC) }; + + for( WIN32_FIND_DATA fd; find.next(&fd); ) + { + // # 付きは圧縮専用 + if( fd.cFileName[0] == '#' ) + continue; + + // 拡張子を切り出し + ::CharLower( fd.cFileName ); + first_dot = const_cast(kiPath::ext_all(fd.cFileName)-1); + *first_dot = '\0'; + + // 基本形式ならここではねる + for( int i=0; i(kiPath::ext(fd.cFileName)-1) = '\0'; + ::SendMessage( lst[state?1:0], LB_SETITEMDATA, + ::SendMessage( lst[state?1:0], LB_ADDSTRING, 0, (LPARAM)fd.cFileName ), + state?1:0 ); + } + + return FALSE; +} + +BOOL CALLBACK CNoahConfigDialog::CAssPage::proc( UINT msg, WPARAM wp, LPARAM lp ) +{ + if( msg==WM_COMMAND ) + { + char str[300]; + DWORD dat; + HWND from=item(IDC_NASSOC), to=item(IDC_ASSOC); + + switch( LOWORD(wp) ) + { + case IDC_DEL: + from=item(IDC_ASSOC), to=item(IDC_NASSOC); + case IDC_ADD:{ + int end = ::SendMessage( from, LB_GETCOUNT, 0, 0 ); + for( int i=0; i +#include +#include +#include + +// カレントディレクトリを安全なところに移してLoadLibrary +static HMODULE safepathLoadLibrary(LPCTSTR lpFileName) +{ + char original_cur[MAX_PATH], sys[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, original_cur); + ::GetSystemDirectory(sys, MAX_PATH); + ::SetCurrentDirectory(sys); + HMODULE han = ::LoadLibrary(lpFileName); + ::SetCurrentDirectory(original_cur); + return han; +} + +//------------------------------------------------------- +//-- Noah Config API ------------------------------------ +//------------------------------------------------------- + + + +bool WINAPI Init(); +void WINAPI LoadSE( bool* a, bool* x ); +void WINAPI SaveSE( bool a, bool x ); +void WINAPI LoadAS( bool asso[] ); +void WINAPI SaveAS( bool asso[] ); +void WINAPI LoadASEx( const char* ext, bool* x ); +void WINAPI SaveASEx( const char* ext, bool x ); + + + +//------------------------------------------------------- +//-- グローバル変数 ------------------------------------- +//------------------------------------------------------- + + + +char g_szNoah[MAX_PATH]; // Where is Noah ? +char g_szDLL[MAX_PATH]; // What's my name ? +bool g_bJpn; // am I in Japanese Mode ? +bool g_isNT; // is Windows NT/2000 ? +int g_cRef; // reference counter +bool g_bChanged; // association changed ? + + + +//------------------------------------------------------- +//-- GUID {953AFAE9-C2A9-4674-9811-D7E281B001E1} -------- +//------------------------------------------------------- + + + +static const GUID CLSID_NoahXt = + { 0x953afae9, 0xc2a9, 0x4674, { 0x98, 0x11, 0xd7, 0xe2, 0x81, 0xb0, 0x1, 0xe1 } }; +static const char* ProgID_NoahXt = "NoahXt"; + + + +//-------------------------------------------------------- +//-- シェルエクステンション・本体 -------------------------- +//-------------------------------------------------------- + + + +class noahXt : public IContextMenu, IShellExtInit +{ +public: + noahXt() { m_szDir[0]=0; m_pDataObj=NULL; m_cRef=0L; g_cRef++; } + ~noahXt() { if( m_pDataObj ) m_pDataObj->Release(); g_cRef--; } + STDMETHODIMP_(ULONG) AddRef() { return (++m_cRef); } + STDMETHODIMP_(ULONG) Release() { if( --m_cRef )return m_cRef; delete this; return 0L; } + STDMETHODIMP QueryInterface( REFIID riid, void** ppv ) + { + *ppv = NULL; + AddRef(); + if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IShellExtInit ) ) + *ppv = (IShellExtInit*)this; + else if( IsEqualIID( riid, IID_IContextMenu ) ) + *ppv = (IContextMenu*)this; + else + { + Release(); + return E_NOINTERFACE; + } + return NOERROR; + } + STDMETHODIMP Initialize( const ITEMIDLIST* pF, IDataObject* pD, HKEY ) + { + ::SHGetPathFromIDList( pF, m_szDir ); + if( m_pDataObj )m_pDataObj->Release(); + if( pD ) (m_pDataObj=pD)->AddRef(); + return NOERROR; + } + +#define CMPR_CMD_E ("Com&press Here") +#define EXTR_CMD_E ("E&xtract Here") +#define CMPR_CMD (g_bJpn ? "ここに圧縮(&P)" : CMPR_CMD_E) +#define EXTR_CMD (g_bJpn ? "ここに解凍(&X)" : EXTR_CMD_E) +#define CMPR_HLP (g_bJpn ? "ファイルをNoahで圧縮します。" : "Compress These Files By Noah") +#define EXTR_HLP (g_bJpn ? "ファイルをNoahで展開" : "Extract Files By Noah") + + // 右クリックメニューへ追加 + STDMETHODIMP QueryContextMenu( HMENU h, UINT i, UINT id, UINT idLast, UINT flag ) + { + if( (flag&0x000F)!=CMF_NORMAL && !(flag&CMF_VERBSONLY) && !(flag&CMF_EXPLORE) ) + return NOERROR; + + // レジストリから設定読み込み + // できれば、ここでm_bEXTに関しては拡張子判定を行いたいところ…(^^; + LoadSE( &m_bCMP, &m_bEXT ); + + if( m_bCMP ) ::InsertMenu( h, i++, MF_STRING|MF_BYPOSITION, id++, CMPR_CMD ); + if( m_bEXT ) ::InsertMenu( h, i++, MF_STRING|MF_BYPOSITION, id++, EXTR_CMD ); + return MAKE_HRESULT( SEVERITY_SUCCESS, 0, id ); + } + // コマンド実行 + STDMETHODIMP InvokeCommand( LPCMINVOKECOMMANDINFO lpcmi ) + { + if( 0==HIWORD(lpcmi->lpVerb) ) + switch( filter_cmd( LOWORD(lpcmi->lpVerb) ) ) + { + case 0: return operation( "-a" ); + case 1: return operation( "-x" ); + } + return E_INVALIDARG; + } + // ヘルプ文字列など + STDMETHODIMP GetCommandString( UINT cmd, UINT flag, UINT*, LPSTR pszName, UINT cchMax ) + { + cmd = filter_cmd( cmd ); + if( cmd==2 ) + return E_FAIL; + switch( flag ) + { + case GCS_HELPTEXT: ::lstrcpyn( pszName, cmd==0 ? CMPR_HLP : EXTR_HLP, cchMax ); break; + case GCS_VERB: ::lstrcpyn( pszName, cmd==0 ? CMPR_CMD_E : EXTR_CMD_E, cchMax ); break; + } + return NOERROR; + } +private: + // コマンドIDを compress=0, melt=1, else=2 にフィルタリング + UINT filter_cmd( UINT i ) + { + if( m_bCMP )if( m_bEXT )return (i<=1 ? i : 2); + else return (i==0 ? 0 : 2); + else if( m_bEXT )return (i==0 ? 1 : 2); + else return 2; + } + // Noah.exeへ渡す処理 "Compress Here" or "Extract Here" + STDMETHODIMP operation( const char* opt ) + { + STGMEDIUM md; + FORMATETC fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL}; + if( SUCCEEDED( m_pDataObj->GetData( &fe, &md ) ) ) + { + const HDROP& hDrop = (HDROP)md.hGlobal; + const int num = ::DragQueryFile( hDrop, 0xffffffff, NULL, 0 ); + if( num ) + { + // main command + char* cmd = new char[10 + MAX_PATH * (num+2)]; + ::lstrcpy( cmd, g_szNoah ); + ::lstrcat( cmd, " " ); + ::lstrcat( cmd, opt ); + // destdir + ::lstrcat( cmd, " \"-D" ); + ::lstrcat( cmd, m_szDir ); + ::lstrcat( cmd, "\"" ); + // filelist + char str[MAX_PATH]; + for( int i=0; i!=num; i++ ) + { + ::DragQueryFile( hDrop, i, str, sizeof(str) ); + ::lstrcat( cmd, " \"" ); + ::lstrcat( cmd, str ); + ::lstrcat( cmd, "\"" ); + } + // call 'Noah' + ::WinExec( cmd, SW_SHOWDEFAULT ); + delete [] cmd; + } + ::ReleaseStgMedium( &md ); + } + return NOERROR; + } +private: + ULONG m_cRef; + IDataObject* m_pDataObj; + char m_szDir[MAX_PATH]; + bool m_bCMP, m_bEXT; +}; + +//-- クラス工場 ------------------------------------------- + +class noahXtClassFactory : public IClassFactory +{ +public: + noahXtClassFactory() { m_cRef = 0L; g_cRef++; } + ~noahXtClassFactory() { g_cRef--; } + STDMETHODIMP_(ULONG) AddRef() { return (++m_cRef); } + STDMETHODIMP_(ULONG) Release() { if( --m_cRef )return m_cRef; delete this; return 0L; } + STDMETHODIMP LockServer( BOOL ) { return NOERROR; } + STDMETHODIMP QueryInterface( REFIID riid, void** ppv ) + { + *ppv = NULL; + AddRef(); + if( IsEqualIID( riid, IID_IUnknown ) || IsEqualIID( riid, IID_IClassFactory ) ) + { + *ppv = (IClassFactory*)this; + return NOERROR; + } + Release(); + return E_NOINTERFACE; + } + STDMETHODIMP CreateInstance( IUnknown* pOuter, REFIID riid, void** ppvObj ) + { + *ppvObj = NULL; + if( pOuter ) + return CLASS_E_NOAGGREGATION; + noahXt* pXt = new noahXt; + return pXt ? pXt->QueryInterface( riid, ppvObj ) : E_OUTOFMEMORY; + } +private: + ULONG m_cRef; +}; + +//-- システム向けAPI --------------------------------------- + +extern "C" int APIENTRY +DllMain( HINSTANCE inst, DWORD why, LPVOID reserved ) +{ + if( why==DLL_PROCESS_ATTACH ) + { + ::GetModuleFileName( inst, g_szDLL, sizeof(g_szDLL) ); + ::lstrcpy( g_szNoah, g_szDLL ); + for( char *p=g_szNoah,*y=g_szNoah-1; *p; p=::CharNext(p) ) + if( *p=='\\' ) + y=p; + ::lstrcpy( y+1, "Noah.exe" ); + ::GetShortPathName( g_szNoah, g_szNoah, MAX_PATH ); + + OSVERSIONINFO osVer; + osVer.dwOSVersionInfoSize = sizeof(osVer); + ::GetVersionEx( &osVer ); + g_isNT = ( osVer.dwPlatformId == VER_PLATFORM_WIN32_NT ); + + g_bJpn = (::GetUserDefaultLangID()==0x0411); + g_cRef = 0; + g_bChanged = false; + } + else if( why==DLL_PROCESS_DETACH ) + { + if( g_bChanged ) + ::SHChangeNotify( SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL ); + } + return TRUE; +} + +STDAPI DllCanUnloadNow() +{ + return ( g_cRef==0 ? S_OK : S_FALSE ); +} + +STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void** ppvOut ) +{ + *ppvOut = NULL; + if( IsEqualIID( rclsid, CLSID_NoahXt ) ) + { + noahXtClassFactory* p = new noahXtClassFactory; + return p->QueryInterface( riid, ppvOut ); + } + return CLASS_E_CLASSNOTAVAILABLE; +} + + + +//-------------------------------------------------------- +//-------------------------------------------------------- +//-------------------------------------------------------- + + +//-- kiRegKey from K.I.LIB -------------------------// +//------ 'not using kiStr && REG_SZ only' version --// + + +class kiRegKey +{ +public: + kiRegKey() + { m_hKey = NULL; } + ~kiRegKey() + { close(); } + operator HKEY() const + { return m_hKey; } + bool open( HKEY parent, LPCTSTR keyname, REGSAM access ) + { close(); return (ERROR_SUCCESS == ::RegOpenKeyEx( parent, keyname, 0, access, &m_hKey )); } + bool create( HKEY parent, LPCTSTR keyname, REGSAM access ) + { close(); DWORD x; return (ERROR_SUCCESS == ::RegCreateKeyEx( parent, keyname, 0, REG_NONE, REG_OPTION_NON_VOLATILE, access, NULL, &m_hKey, &x )); } + void close() + { if( m_hKey ) ::RegCloseKey( m_hKey ); } + static bool exist( HKEY parent, LPCTSTR keyname ) + { HKEY k; if( ERROR_SUCCESS!=::RegOpenKeyEx( parent,keyname,0,KEY_READ,&k ) ) return false; ::RegCloseKey( k ); return true; } + bool set( LPCTSTR valname, LPCTSTR val ) + { return (ERROR_SUCCESS == ::RegSetValueEx( m_hKey, valname, 0, REG_SZ, (BYTE*)val, ::lstrlen(val)+1 )); } + bool get( LPCTSTR valname, char* val, DWORD siz ) + { return ( ERROR_SUCCESS == RegQueryValueEx( m_hKey, valname, NULL, NULL, (BYTE*)val, &siz )); } + bool del( LPCTSTR valname ) + { return (ERROR_SUCCESS == RegDeleteValue( m_hKey, valname )); } + static void delSubKey( HKEY k, LPCTSTR n ) + { + if( !g_isNT ) + { + ::RegDeleteKey( k, n ); + return; + } + + // NT系では、サブキーのあるキーは消せないので再帰的に。 + // しかもEnum中にDeleteはできない上にvector等も + // 封印しているためわけのわからんコードになってます。 + + // 消したいキーを開く + HKEY k2; + while( ERROR_SUCCESS == ::RegOpenKeyEx( k,n,0,KEY_ENUMERATE_SUB_KEYS|KEY_SET_VALUE,&k2 ) ) + { + // 1個目の子キー名を取得 + char buf[200]; + DWORD bs = sizeof(buf); + if( ERROR_SUCCESS == ::RegEnumKeyEx( k2,0,buf,&bs,NULL,NULL,NULL,NULL ) ) + { + // あればそれを削除 + delSubKey( k2, buf ); + ::RegCloseKey( k2 ); + } + else + { + // なければ、消したいキーを消せる + ::RegCloseKey( k2 ); + ::RegDeleteKey( k, n ); + return; + } + } + } +private: + HKEY m_hKey; +}; + + + +//-------------------------------------------------------- +//-- Noahの設定用APIなど ---------------------------------- +//-------------------------------------------------------- + + + +char g_szAsCmd[MAX_PATH+10]; +char g_szAsIcon[MAX_PATH+10]; + + +// 管理者権限判別 +//-- IsAdmin() : very very thanks! to ardry, the author of 'meltice'. + +bool IsAdmin() +{ + bool isadmin=false; + + //-- 9x対策のため、動的にDLLロード + HINSTANCE hInstDll = safepathLoadLibrary( "NetAPI32" ); + if( !hInstDll ) + return false; + + //-- NetUserGetLocalGroupes API 取得 + typedef NET_API_STATUS (NET_API_FUNCTION *PNETUSRGETLCLGRP)(LPCWSTR,wchar_t *,DWORD,DWORD,VOID*,DWORD,LPDWORD,LPDWORD); + PNETUSRGETLCLGRP pNetUserGetLocalGroups = (PNETUSRGETLCLGRP)::GetProcAddress(hInstDll, "NetUserGetLocalGroups"); + if( !pNetUserGetLocalGroups ) + { + ::FreeLibrary( hInstDll ); + return false; + } + + //-- ユーザー名取得 + char userA[256]; + wchar_t userW[256]; + DWORD tmp = 256; + ::GetUserName( userA, &tmp ); + ::MultiByteToWideChar( CP_ACP, 0, userA, -1, userW, 255 ); + + //-- 本筋 + LOCALGROUP_USERS_INFO_0* pBuf; + DWORD entry; + char buf[256]; + + if( 0 == pNetUserGetLocalGroups(NULL,userW,0,0,(BYTE**)&pBuf,-1,&entry,&tmp) ) + { + for( unsigned int i=0; i +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=NoahXt - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "NoahXt.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "NoahXt.mak" CFG="NoahXt - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "NoahXt - Win32 Release" ("Win32 (x86) Dynamic-Link Library" 用) +!MESSAGE "NoahXt - Win32 Debug" ("Win32 (x86) Dynamic-Link Library" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "NoahXt" +# PROP Scc_LocalPath "." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "NoahXt - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../tmp/relxt" +# PROP Intermediate_Dir "../tmp/relxt" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NOAHXT_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /GX /O2 /Ob0 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NOAHXT_EXPORTS" /FD /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"../Release/NoahXt.dll" /opt:"nowin98" +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "NoahXt - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../tmp/dbgxt" +# PROP Intermediate_Dir "../tmp/dbgxt" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NOAHXT_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "NOAHXT_EXPORTS" /FD /GZ /c +# SUBTRACT CPP /YX /Yc /Yu +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /out:"../Debug/NoahXt.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "NoahXt - Win32 Release" +# Name "NoahXt - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\NoahXt.cpp +# End Source File +# Begin Source File + +SOURCE=.\NoahXt.def +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\icon\arc_ace.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_arj.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_bga.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_cab.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_gca.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_jak.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_lzh.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_oth.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_rar.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_tar.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_yz1.ico +# End Source File +# Begin Source File + +SOURCE=.\icon\arc_zip.ico +# End Source File +# Begin Source File + +SOURCE=.\noahxt.rc +# End Source File +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\icon\arc_7z.ico +# End Source File +# End Target +# End Project ADDED NoahXt/NoahXt.rc Index: NoahXt/NoahXt.rc ================================================================== --- NoahXt/NoahXt.rc +++ NoahXt/NoahXt.rc @@ -0,0 +1,84 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_LZH ICON DISCARDABLE "icon\\arc_lzh.ico" +IDI_ZIP ICON DISCARDABLE "icon\\arc_zip.ico" +IDI_CAB ICON DISCARDABLE "icon\\arc_cab.ico" +IDI_RAR ICON DISCARDABLE "icon\\arc_rar.ico" +IDI_TAR ICON DISCARDABLE "icon\\arc_tar.ico" +IDI_YZ1 ICON DISCARDABLE "icon\\arc_yz1.ico" +IDI_GCA ICON DISCARDABLE "icon\\arc_gca.ico" +IDI_ARJ ICON DISCARDABLE "icon\\arc_arj.ico" +IDI_BGA ICON DISCARDABLE "icon\\arc_bga.ico" +IDI_ACE ICON DISCARDABLE "icon\\arc_ace.ico" +IDI_OTH ICON DISCARDABLE "icon\\arc_oth.ico" +IDI_JAK ICON DISCARDABLE "icon\\arc_jak.ico" +IDI_7Z ICON DISCARDABLE "icon\\arc_7z.ico" + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + ADDED NoahXt/icon/arc_7z.ico Index: NoahXt/icon/arc_7z.ico ================================================================== --- NoahXt/icon/arc_7z.ico +++ NoahXt/icon/arc_7z.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_ace.ico Index: NoahXt/icon/arc_ace.ico ================================================================== --- NoahXt/icon/arc_ace.ico +++ NoahXt/icon/arc_ace.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_arj.ico Index: NoahXt/icon/arc_arj.ico ================================================================== --- NoahXt/icon/arc_arj.ico +++ NoahXt/icon/arc_arj.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_bga.ico Index: NoahXt/icon/arc_bga.ico ================================================================== --- NoahXt/icon/arc_bga.ico +++ NoahXt/icon/arc_bga.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_cab.ico Index: NoahXt/icon/arc_cab.ico ================================================================== --- NoahXt/icon/arc_cab.ico +++ NoahXt/icon/arc_cab.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_gca.ico Index: NoahXt/icon/arc_gca.ico ================================================================== --- NoahXt/icon/arc_gca.ico +++ NoahXt/icon/arc_gca.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_jak.ico Index: NoahXt/icon/arc_jak.ico ================================================================== --- NoahXt/icon/arc_jak.ico +++ NoahXt/icon/arc_jak.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_lzh.ico Index: NoahXt/icon/arc_lzh.ico ================================================================== --- NoahXt/icon/arc_lzh.ico +++ NoahXt/icon/arc_lzh.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_oth.ico Index: NoahXt/icon/arc_oth.ico ================================================================== --- NoahXt/icon/arc_oth.ico +++ NoahXt/icon/arc_oth.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_rar.ico Index: NoahXt/icon/arc_rar.ico ================================================================== --- NoahXt/icon/arc_rar.ico +++ NoahXt/icon/arc_rar.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_tar.ico Index: NoahXt/icon/arc_tar.ico ================================================================== --- NoahXt/icon/arc_tar.ico +++ NoahXt/icon/arc_tar.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_yz1.ico Index: NoahXt/icon/arc_yz1.ico ================================================================== --- NoahXt/icon/arc_yz1.ico +++ NoahXt/icon/arc_yz1.ico cannot compute difference between binary files ADDED NoahXt/icon/arc_zip.ico Index: NoahXt/icon/arc_zip.ico ================================================================== --- NoahXt/icon/arc_zip.ico +++ NoahXt/icon/arc_zip.ico cannot compute difference between binary files ADDED NoahXt/resource.h Index: NoahXt/resource.h ================================================================== --- NoahXt/resource.h +++ NoahXt/resource.h @@ -0,0 +1,28 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by NoahXt.rc +// +#define IDI_LZH 101 +#define IDI_ZIP 102 +#define IDI_CAB 103 +#define IDI_RAR 104 +#define IDI_TAR 105 +#define IDI_YZ1 106 +#define IDI_GCA 107 +#define IDI_ARJ 108 +#define IDI_BGA 109 +#define IDI_ACE 110 +#define IDI_7Z 111 +#define IDI_JAK 112 +#define IDI_OTH 113 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 114 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1000 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif ADDED ReadMe.txt Index: ReadMe.txt ================================================================== --- ReadMe.txt +++ ReadMe.txt @@ -0,0 +1,91 @@ + +このソース群の利用条件については、Noahのバイナリの方に +つけてある利用条件に従います。基本的には、どう使うのも自由。 +Visual C++ 6.0 Professional Edition / Visual C++ 2010 Express Edition 用です。 + + +☆ワークスペース等 + + - Noah.sln (VC++ 2010 用ワークスペース) + - Noah.dsw (VC++ 6.0 用ワークスペース) + - Noah.dsp ('Noah.exe' 用プロジェクト) + - stdafx.h/cpp (pre-complied header生成用) + - NoahXt/ + - NoahXt.dsp ('NoahXt.dll' 用プロジェクト) + - NoahXt.def (ExportするAPI一覧) + - stdafx.h/cpp (pre-complied header生成用) + - uninst/ + - kinst.dsp ('uninst.exe' 用プロジェクト) + - stdafx.h/cpp (pre-complied header生成用) + + +☆リソース + + - Noah.rc (リソーススクリプト) + - resource.h (リソースID定義ヘッダ) + - *.ico (アイコンデータ) + + +☆ソースコード + + - / + - NoahApp.h|Noah.cpp (Noahメインルーチン) + - NoahCM.h|cpp (設定関係全般) + - NoahAM.h|cpp (圧縮解凍処理の上位ルーチン) + - SubDlg.h|cpp (書庫内容閲覧/パスワード/状況表示ダイアログ) + - Archiver.h|cpp (圧縮解凍ルーチンのinterface) + - ArcDLL.h|cpp (DLL利用ルーチン) + - ArcB2e.h|cpp (B2Eスクリプト利用ルーチン) + - ArcACE.h|cpp (UnaceV2.dll利用ルーチン) + - ArcMSC.h|cpp (MS-Compress対応ルーチン) + - ArcCPT.h|cpp (CompactPro対応ルーチン) + + - NoahXt/ + - NoahXt.cpp (関連付け・シェルエクステンション) + + - uninst/ + - kinst.cpp (インストーラ) + + - kilib/ + - kilib.h (K.I.LIBのメインヘッダ) + - kilibext.h (K.I.LIBの拡張機能用ヘッダ) + + - kl_app.h|cpp (スタートアップポイント。アプリケーション全体の情報管理) + - kl_wnd.h|cpp (ウインドウ、ダイアログ、プロパティシート管理) + - kl_reg.h|cpp (レジストリ、iniファイルの入出力) + - kl_dnd.h|cpp (OLEドラッグ&ドロップ処理) + - kl_find.h|cpp (ファイル検索) + - kl_wcmn.h|cpp (主にWindows-Shell周りの便利関数群) + + - kl_cmd.h|cpp (コマンドラインパーサ) + - kl_str.h|cpp (文字列処理&パス文字列処理) + - kl_file.h|cpp (ファイル入出力) + - kl_misc.h|cpp (汎用クラス。配列のtemplateなど) + + - kl_carc.h|cpp (統合アーカイバDLLラッパ) + - kl_rythp.h|cpp (Rythpスクリプト処理) + + +☆構成 + + - CNoahApp : kiApp + - (ArcManやCnfManと連絡を取り、行う処理を決定する処理) + + - CNoahArchiveManager + - (適切なCArchiverへ圧縮解凍を回す処理) + - kiArray + + - CNoahConfigManager + - (ini読み書き処理やNoahXt.dllとの連携) + - CNoahConfigDialog : kiPropSheet + - CCmprPage : kiPropSheetPage + - CInfoPage : kiPropSheetPage + - CMeltPage : kiPropSheetPage + - CWinXPage : kiPropSheetPage + + - CArchiver + - (書庫操作用の共通インターフェイス) + - (ここから各種解凍エンジン専用クラスが派生する) + + - K.I.LIB + - (汎用性の極めて低いWin32用ライブラリ) ADDED Release/Noah.exe Index: Release/Noah.exe ================================================================== --- Release/Noah.exe +++ Release/Noah.exe cannot compute difference between binary files ADDED Release/NoahXt.dll Index: Release/NoahXt.dll ================================================================== --- Release/NoahXt.dll +++ Release/NoahXt.dll cannot compute difference between binary files ADDED Release/ReadMe.txt Index: Release/ReadMe.txt ================================================================== --- Release/ReadMe.txt +++ Release/ReadMe.txt @@ -0,0 +1,184 @@ + +★ Noah 3.199 +★ 2010/11/25 + + + この文書は、Windows95/98/Me/NT4/2000/XP/2003/Vista/7用圧縮解凍ソフト +"Noah"の上級者向けパッケージの説明書です。Windows用圧縮解凍ソフトを +一度は使ったことがあるという層を対象としています。難しいと感じた方は、 +初心者用パッケージを入手して、そちらを利用することをお勧めします。 +※ 説明書とインストーラが違うだけで、どちらも全く同じ性能です。 + + + +【更新内容 @ 3.198->3.199】 + + ・インストーラ版添付の caldix のバージョンを 1.21 に更新 + ・標準で tar.xz と tar.lzma の圧縮に対応(最新のTar32.dllが必要です) +  (関連づけは、設定画面で一端tarの関連づけを外して保存終了してから、 +   もう一度tarに関連づけ直してください。.xz と .lzma が Noah に +   関連づけされます。) + +【更新内容 @ 3.195->3.198】 + + ・JVNVU#707943 : Windows プログラムの DLL 読み込みに脆弱性 +   http://jvn.jp/cert/JVNVU707943/index.html +  へ対処しました + + ・初期設定時の圧縮形式を lzh から zip に変更しました + ・ACEの自己解凍書庫の認識範囲を広げました + ・Noah.exe 本体をUPX圧縮しないようにしました + ・b2eに\を/に置き換える(slash A)を追加 + ・Noahの設定画面へのD&Dでの圧縮・展開機能をマニュアルに記載 + ・半角1文字の名前のフォルダを圧縮したものを展開すると、展開後フォルダが開かれないバグを修正 + ・ACE書庫の書庫内閲覧モードで、圧縮方式の判定が間違っていたのを修正 + ・7-zip 形式での圧縮や展開で、"-" で始まるファイル名を扱えるように修正 + ・b2e を使っていた場合多バイト文字で終わる名前のファイルを圧縮できなかったバグ修正 + ・D&D処理後、Noahがそのまま起動していると出力先フォルダを削除できないバグを修正 + ・バッファオーバーフローとリソースリークの危険をいくつか修正 + ・b2eの引き算がおかしかった(常に0になっていた)バグを修正 + ・MSCompress形式での圧縮時にタイムスタンプを元ファイルと合わせるように修正 + ・圧縮/解凍先ディレクトリ設定のエディットボックスにIMEで入力すると文字化けするバグを修正 + ・b2eのscanでファイルをリストアップしたとき最後にゴミが混じるバグを修正 + ・(検索結果などから)異なるディレクトリにある書庫を一括でNoahに渡しても解凍はできるように変更 + + (3.197) MSVCR100.dll がないと動かなくなっていたのを修正 + (3.198) Windows XP SP2 以上でないと動かなくなっていたのを修正 + + +【対応形式】 + + ・外部モジュール不要 +    圧縮:MS-Compress +    解凍:MS-Compress, cpt + + ・統合アーカイバDLL( http://www.csdinc.co.jp/archiver/ )が必要 +    圧縮:lzh, zip, cab, tar, bga, yz1, 7z (※tarはSFX圧縮不可) +    解凍:lzh, zip, cab, tar, bga, yz1, 7z, rar, arj, gca +  分割結合:jak + + ・UnaceV2.dll( http://www.winace.com/ )が必要 +    解凍:ace + + + +【使い方】 + + ・インストール&アンインストール +   関連付けやシェル拡張をしない限りレジストリは使いません。 +   適当なところにおいて、要らなくなったらさっくり消してください。 + + ・解凍&圧縮 +   Noahのアイコンにファイルをドロップ。 +   書庫なら解凍、そうでなければ圧縮します。 + + ・書庫の中身を閲覧 +   Ctrlを押しながら解凍。 + + ・自己解凍形式で圧縮 +   Ctrlを押しながら圧縮。 + + ・一個一個別のファイルに圧縮 +   Altを押しながら圧縮。 + + ・テンポラリ設定 +   Shiftを押しながらドロップ→設定変更→Shiftを押しながらキャンセル。 +   最後にShiftを押さず終了すると、ただの設定変更にもなります。 + + + +【Noahの動作モードについて】 + +   設定項目のほとんどはだいたい直感で分かると思いますので、ここでは唯一 +  わかりにくい "動作モード" について説明します。これは、ファイルをドロップ +  したときに Noah がどう動作するかを決めておくものです。 + +  [圧縮専用] … どんなファイルを渡されても圧縮。 +  [解凍専用] … どんなファイルを渡されても解凍を試みる。圧縮に回すことはない。 + +  については説明入れるまでもなくOKと思います。残り二つについては、どちらも +  基本方針は「書庫なら解凍、それ以外は圧縮」なんですが、若干違いがあります。 + +  ・書庫を複数ドロップした場合 +    [解凍優先] … それぞれ解凍します。 +    [圧縮優先] … 圧縮します。 +   複数の書庫を一つにまとめたい時は圧縮優先。 + +  ・拡張子のおかしな書庫( lzh書庫なのに、拡張子がgif、など )をドロップした場合 +    [解凍優先] … 解凍します。 +    [圧縮優先] … 圧縮します。 +   つまり圧縮優先の時は、拡張子からして書庫でない、と判定したら +   内容でのチェックはせずに、すぐに圧縮ルーチンへ回してしまうと言うことです。 + + + +【Noah.iniの隠し設定】 + +  OpenBy=ディレクトリを開くコマンド + +   デフォルトは explorer "%s" です。 +   %sは実行時にディレクトリ名に置き換えられます。 +   例えば explorer /e,"%s" とすればエクスプローラで開けます。 + +  MiniBoot=1 + +   b2eから実行ファイルを起動する際に、最小化状態で +   実行したい場合は、MiniBoot=1 と書いて下さい。 + +  OldAbout=1 + +   バージョン情報表示が遅いときにこれを入れると簡易表示になります。 + +  OneExt=1 + +   aaa.bbb.ccc を圧縮したときの書庫名を aaa.lzh ではなく +   aaa.bbb.lzh としたいときに設定します。他に、NoExt=1 +   にすると aaa.bbb.ccc.lzh になります。 + +  MultiBootLimit=4 + +   Noah.exeが一発圧縮解凍用に一度に起動できる最大個数を制限します。デフォルトは4。 + + + +【アイコンの変更方法】 + +  Noahを書庫ファイルに関連づけたときに設定されるアイコンは、 +  全て NoahXt.dll に含まれています。このDLLを差し替えることで、 +  他のアイコンセットを使用することもできます。 +   SB Room ( http://homepage3.nifty.com/scriba/ ) +  にて沢山のアイコンが公開されていますので、是非ご覧下さい。 + + + +【コマンドラインオプション】 + +  -a 必ず圧縮 -x 必ず解凍 -cx 閲覧 -ca SFX圧縮 -w 個別圧縮 +  -dDirName 出力先 -tTypeName 圧縮形式 -mMethod 圧縮メソッド + + + +【利用条件】 + + --- NYSL ver 0.9982 ( http://www.kmonos.net/nysl/ ) --- + + A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、 + ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。 + + A-1. フリーウェアです。作者からは使用料等を要求しません。 + A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。 + A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。 + A-4. 変更したものや部分的に使用したものは、あなたのものになります。 + 公開する場合は、あなたの名前の下で行って下さい。 + + B. このソフトを利用することによって生じた損害等について、作者は + 責任を負わないものとします。各自の責任においてご利用下さい。 + + C. 著作者人格権は K.INABA に帰属します。著作権は放棄します。 + + D. 以上の3項は、ソース・実行バイナリの双方に適用されます。 + + + +-------------------------------------------------------- +by k.inaba( http://www.kmonos.net/ ) ADDED Release/b2e/aboutb2e.txt Index: Release/b2e/aboutb2e.txt ================================================================== --- Release/b2e/aboutb2e.txt +++ Release/b2e/aboutb2e.txt @@ -0,0 +1,697 @@ + +=★ B2E(Bridge To Executables) Script 仕様書 +=★ 2010/10/14 +=★ k.inaba ( http://www.kmonos.net/ ) + + + +1.概要 ------------------------------------------------------ + +  Noahは、定義ファイルを追加することで他のexeのフロントエンド + となることが出来ます。つまり、「コマンドライン用の圧縮解凍ソ + フトは面倒!」と思ったら、Noahと連携させて簡単なGUIで操作が + できるようになるわけです。 + +  定義ファイルは、Noah.exeと同じ階層のb2eフォルダに入れること + で自動で認識されます。以下ではこの定義ファイルの書き方を解説 + していきます。 + + + +2.ファイル名 ------------------------------------------------ + + ・拡張子は b2e + ・ファイル名に対応拡張子を記述 + + ex) 拡張子ishとuueとuuを展開可能にするためのスクリプトなら +    ish.uue.uu.b2e + ex) となります。zzを展開するためのモノなら、単に +    zz.b2e + ex) ですね。圧縮しか行わない場合は出来れば、 +    #rar.b2e + ex) のように、頭に # を付けて下さい。(必須ではありません) + + + +3.サンプル ------------------------------------------------------- + + | load: + | (name Rar.exe) + | (type rar Fast Default *Best) + | + | encode: + | (if (method 1) (cmd a -m1 -r0 (arc.rar) (list\*.*))) + | (if (method 2) (cmd a -m3 -r0 (arc.rar) (list\*.*))) + | (if (method 3) (cmd a -m5 -mm -r0 (arc.rar) (list\*.*))) + | + | sfx: + | (cmd s (arc)) + + | load: + | (name 777.exe) + | (type 777 777) + | + | encode: + | (if (method 1) (cmd a (arc.777) (list\*) -mg)) + | + | decode: + | (cmd x (arc)) + + + +4.構造 ------------------------------------------------------ + + ・load: EXE名などを書く部分 + ・decode: 解凍コマンドを書く部分 + ・encode: 圧縮コマンドを書く部分 + ・sfx: 書庫→SFX変換コマンドを書く部分 + + の4セクションに分かれます。 + + + +5.load: ----------------------------------------------------- + + | load: + | (name EXE名) + | (type 圧縮形式名 圧縮レベル名1 圧縮レベル名2 ...) + + と書きます。圧縮を行わない時は、type の文は書かなくてOK。 + ※ 圧縮レベル名の頭に * を付けると、それが標準圧縮レベルになります。 + + + +6.decode: --------------------------------------------------- + + | decode: + | (cmd 実行するコマンド) + + コマンド中の以下の文字列については自動で置き換えられます。 + +  (arc) … 解凍する書庫名 +  (dir) … 解凍先フォルダ名 +  (arc-.xx ln) … 書庫名から拡張子.xxを除いたもの + + + +7.encode: --------------------------------------------------- + + | encode: + | (if (method 1) (cmd 圧縮レベル1のときのコマンド)) + | (if (method 2) (cmd 圧縮レベル2のときのコマンド)) + | 以下同様 + + 自動置き換えは以下の通り。 + +  (arc.xxx) … 圧縮先書庫名(拡張子xxx) +  (dir) … 圧縮したいファイルのあるフォルダ名 +  (arc d) … 圧縮先フォルダ名 +  (list) … 圧縮したいファイルのリスト +  (list\*) … 圧縮したいファイルのリスト +  (list\*.*) … 圧縮したいファイルのリスト + { ↑フォルダ名を渡すときに使うワイルドカードが違います } + { それぞれ、"dir" "dir\*" "dir\*.*" という形式を使います } + { どれを使えばよいやらわからなかったら、とりあえず } + { (list\*) と書いておいてください。 } + + + +8.sfx: ------------------------------------------------------ + + | sfx: + | (cmd 書庫からSFXへ変換するコマンド) + + 自動置き換えは以下の通り。 + +  (arc) … 元書庫名 +  (arc.exe) … SFX書庫名 +  (dir) … 作業フォルダ名 + + + +9.encode1: sfxd: -------------------------------------------- + +  書庫化機能がない圧縮ソフトやテキストエンコーダなど、圧縮時 + には一つしかファイルを受け取らないソフトがあります。このよう + なソフトに対応するときは、encode: の代わりに、encode1: と + 書いておいてください。そうすればNoah側で適当にうまいこと処理 + します。 + +  書庫→SFX変換機能がなく、直接一気にSFXに圧縮するしかない + ソフトもあります。そんなときには sfx: の代わりに sfxd: を + 使います。SFX圧縮時にはNoahは直接 sfxd: を使うようになります。 + +  encode1: も sfxd: も、自動置き換えは encode: と全く同じです。 + + + +10.休憩 ------------------------------------------------------- + +  さっぱりわからないぃ〜状態の人は、実際に完成したファイルを + 眺めてみると、頭が整理されるかもしれません。 + +  http://b2efile.tripod.co.jp/ +   ( yc氏のサイト。100個以上のb2eが公開されています。 ) + +  仕様書なんてこんな固いもん見てもわかるか!状態の人は、 + 実際どんな手順で書いていけばよいか、を解説したサイトが + きっと役に立つことでしょう。 + +  http://homepage3.nifty.com/scriba/manu/ +   ( SB氏のサイトの一角。Noah付属のものよりずっと丁寧な +    マニュアルとなっています。 ) + + + さて、ここから下は、結構内容が濃いです。知らなくても普通に + b2eを書く分には全く困らない知識ばっかりです。(^^; + それでも読んでみたい奇特な人だけどうぞ…… + + + + + + + + + + + + + + + + + + + + + +=★ +=★ 第二部 +=★ + + + +11.英語モードでexeを実行する技 ------------------------------- + + 日本語版WindowsのDOS窓で動かすと、なんだか ロロロロン と出てきて + 格好悪かったり、最悪の場合全く動かない…というアーカイバに + 出会ったことはありませんか? + これらは、"usモード" に切り替えてから実行すると上手く動く + ことが多いです。Noahでこの切り替えを行うには、最初の name で、 + +  (name EXE名 us) + + と、後ろに us を付けて下さい。これで、そのb2eに書かれた(cmd)や + (xcmd)の実行の際には、自動でusモードになるようになります。 + + + +12.統合アーカイバDLL用スクリプト ----------------------------- + + load: のところで (name DLL名) とすればOKですが、それだと +  ・ファイル内容による書庫判定 +  ・書庫閲覧&部分解凍 + が出来ません。致命的です。 + + 前者を有効にするには、 +  check: + って一行どこかに書いてください。中身は要りません。 + + 後者を有効にするには、decode1: セクションを書きます。 + 自動置き換えは decode: セクションと同じものに加え、 + (list) と書くとそこに解凍ファイル名リストが入るようになります。 + decode1: セクションでは、出来るだけグラフやエラーメッセージを + 抑止するようなオプションをつけて cmd して下さい。 + + DLL名からAPI名を算出するため、大文字小文字は間違えないように。 + 基本的には[最初一文字大、あと小]で大丈夫ですが、UnZip は Z も + 大文字に。UnGCA も要注意。 + + また、元々Noahに内蔵されているルーチンはb2eより優先されるため、 + ただb2eファイルを追加しただけでは、例えばUnlha32.dll用の動作を + 置き換えることは出来ません。noah.ini ファイルに次の形式で + 隠し設定を記述することで、内蔵ルーチンを使わないようにできます。 + +  Kill=使いたくない内蔵ルーチン + +   例えば Kill=LCT なら、Unlha32,Cab32,Tar32 を使用しなくなります。 +     L … Unlha32 Z … UnZip32 z … Zip32j +     R … Unrar32 C … Cab32  T … Tar32 +     B … Bga32  G … UnGCA32 A … Unarj32j +     a … UnaceV2 Y … Yz1   c … Cpt +     7 … 7-zip32 M … MS-Compress + + + +13.大量のb2eを入れると --------------------------------------- + + バージョン情報の表示が遅くなる環境があるそうです。 + そんな場合は Noah.ini ファイルに +  OldAbout=1 + と一行付け加えてください。 + + + +14. As a Script Language -------------------------------------- + +  上でさんざん[自動置き換え]として (arc) とかを紹介しましたが、 + 気分的には全然違います。( 機能名 引数1 引数2 ... ) の形の + functionをひたすら組み合わせて書く、Lispのまがい物のような + スクリプト言語のつもり。 + +  例 (+ 25 8)    = 33 +    (* 3 7)    = 21 +    (+ 11 (* 3 4)) = 23 + + こんな感じで計算もできます。+ だったら一個目の数と二個目の数を + 足した結果を返す[関数]と考えられるのと同様、(arc) も、適当な + オプションをとって書庫名を返す[関数]として実装しています。 + +==================================================== +◇変数処理 + + 変数名はアルファベット一文字、a-z, A-Z の52個が使えます。 + +  例 (let a 25) +    (let b 10) +    (+ %a %b) + + 最後の足し算の計算結果は 35 になります。 + letで変数に値を代入して、%変数名、で入れた値を取り出せます。 + +  例 (let d (arc d)) +    (cmd a -d%d (list\*.*)) + + 変数には文字列も入るので、上のような使い方も可能です。 + +==================================================== +◇使うときに注意が必要な文字 + + 送りたいコマンドや圧縮レベル名などに %"() の4種類の字を + そのまま書くとバグります。 + それぞれ %%, %", %(, %) というように前に % を付けて下さい。 + +==================================================== +◇全functionリファレンス + + ★実行制御系 + +  (exec ...) + + 機能:左から順に、単純に引数を実行していく + 返値:最後の引数の値 + +  (if A B C) + + 機能:Aが真ならBを実行。Cがある場合,Aが偽ならCを実行 + 返値:実行した方の文(BかC)の値 + +  (while A B) + + 機能:Aが真である間、Bを繰り返し実行 + 返値:無し + + ★代入系 + +  (let A B) + + 機能:変数Aに、Bを代入。 + ※Aには、変数名から%を除いた文字が入る。 + 返値:Aに入った値 + + ★演算系 + +  ( + A B) … A+B +  ( - A B) … A−B +  ( * A B) … A×B +  ( / A B) … A÷B +  (mod A B) … AをBで割った余り + +  ( = A B) … AとBが等しければ真、等しくなければ偽 +  ( ! A B) … AとBが等しければ偽、等しくなければ真 +  ( ! A)   … Aが偽なら、真なら偽 +  ( < A B) … A < B なら真、でなければ偽 +  ( > A B) … A > B なら真、でなければ偽 +  (between A B C) … A <= B <= C なら真、それ以外なら偽 + +  ( + A B) … A or B (足し算は、論理和にも使えます) +  ( * A B) … A and B(掛け算は、論理積にも使えます) + + ★load: 系 + + (name A) + (type A B C D ...) + + 上の説明通り。 + +  (use A B C D ...) + +    そのb2eで、nameで指定したexe以外に利用するファイルがあるなら +    このuseによって設定します。例えば +     ex) (use sfx32gui.dat zcrypt23.dll) +    などと書いておくと、Noahのバージョン情報に、sfx32gui.datなどが +    表示されるようになります。ただし、ここに書いたからと言って +    実際の圧縮解凍作業に変化はありません。 + + ★その他のセクションで使えるもの(単純) + + (dir) + + 基準フォルダ名を「ショートファイル名・フルパス」で返します。 + decode:中は解凍先、encode:中は圧縮元 sfx:中は作業ディレクトリ + をたぶん返します。 + + (is_folder) + + ドロップされたものがフォルダ一つだったら真、でなければ偽。 + + (is_file) + + ドロップされたものがファイル一つだったら真、でなければ偽。 + + (is_multiple) + + ドロップされたものが複数だったら真、でなければ偽。 + + (cd A) + + カレントディレクトリをAに設定します。 + + (method A) + + encode: encode1: sfxd: の時のみ意味があります。 + 単に (method) と書くと、ユーザーが指定した圧縮レベルを返します。 + (method 1) などと書くと、指定したレベルが 1 かどうかの真偽を返します。 + + (size A) + + ファイルAのサイズをバイト単位で返します。 + +  (slash A) + +    文字列Aの中の \ を / に置き換えた文字列を返します。 +    Unix系のコマンドで \ をディレクトリと認識してくれないもの向けに。 + +  (find A) + +    名前がAのファイルをPATHの通ったディレクトリから探し、 +    見つかったらフルパス、見つからなければ偽を返します。 +     ex) (if (find notepad.exe) (....)) +    notepad.exeがある時だけ何か実行。 +     ex) (let s (find stubwin.sfx)) (cmd s %s (arc)) +    stubwin.sfxをシステムフォルダなどから探してきてsにそのフルパスを入れる。 + + (cmd ARG1 ARG2 ARG3 ...) + + (name)で指定した実行ファイルへコマンドを送ります。 + 上では(arc)は自動置き換え…とか書きましたが、 + functionを使っているので当然の如く + (cmd ##(arc)##) + とかやっても ##c:\windows\install.cab## というコマンドが送られたりはしません。 + つまり、スペースで離された一パラメータの場合しか置き換えは効かないわけです。 + そうでない置き換えをしたいときには、(let) で一旦変数に代入してから + 変数名を埋め込めばOKです。 +    (cmd)命令自体の値は、実行の終了コードとなります。 +     ex) (if (! 0 (cmd ...)) エラー処理) +    xcmdについても同様。 + + (xcmd A ARG1 ARG2 ...) + + 外部コマンド呼び出し。 + 最初に実行ファイル名を書いて、以降のパラメータでコマンドを書きます。 + (xcmd del A) とか (xcmd copy B C) など、DOSの内部コマンドの起動も可能。 + + ★その他のセクションで使えるもの(複雑) + + (input MESSAGE DEFAULT) + + ユーザーに文字列を入力させるときに使います。入力を促すメッセージを + 第一引数に、デフォルトの入力値を第二引数に書いて下さい(省略可能)。 + 入力された文字列が値として返されます。 + (let p (input "パスワードを入れてね")) + (cmd x -p%p (arc)) + とかそんな感じに利用。 + + (arc[+-].ext [slfnd]) + + 書庫名指定。Noah は内部変数として、 +  ・書庫のあるフォルダ名 <-- 書庫の存在するDir(解SFX) or 出力先Dir(圧) +  ・書庫名(LongFileName) <-- 書庫名(解SFX) or dropした一個目のファイル名(圧) +  ・書庫名(ShortFileName) <-- 書庫名(解SFX) or dropした一個目のファイル名(圧) + を持っています。 + + まず右の[slfnd]は置いといて左の部分を解説。 + +  (arc … 書庫名をそのままストレートに +  (arc. … 書庫名から拡張子を全て除いたもの +  (arc.lzh … 書庫名から拡張子を全て除いて、.lzh につけかえたもの +  (arc+.lzh … 書庫名の拡張子は取らず、後ろに .lzh をくっつけたもの +  (arc-.szip … szipという拡張子だったらそれをとりのぞいたもの、 +          # そうでなかったら、後ろに .decompressed をくっつけたもの + + それぞれ +  ===解凍・SFX変換時の書庫名指定 +  ===CPShrink対策 (--;) +  ===圧縮時の普通の書庫名指定 +  ===aaa.txt を圧縮するとき書庫名を aaa.txt.gz にしたいとき便利 +  ===aaa.txt.gz を解凍するとき名前を aaa.txt に戻したいとき便利 + です。 + + 次、[slfnd] の解説。1番目のパラメータにこれらの文字があると、 +  s … 書庫名にはShortFileNameを使う +  l … 書庫名にはLongFileNameを使う +  f … 書庫名はディレクトリ+名前(FullPath)で。 +  n … 書庫名は名前(NameOnly)で。 +  d … 書庫名はディレクトリ(Direcotry)で。 + という指定になります。 + +  s === 短いファイル名しか通さないアーカイバに便利。 +  d === 書庫名を直接指定できないで、出力先しか指定できないものに便利。 + + デフォルトオプション( 単に (arc) と書いたときのオプション )は、 +  decode: lf +  encode: lf +  sfx: ln + + 例題。書庫名が "c:\programs\あいうえお.lzh" の場合、 + +  1) (arc d) +  2) (arc-.lzh sn) +  3) (arc.cab lf) +  4) (arc+.txt ln) + + はそれぞれどうなるでしょう? + + (list[r|\*|\*.*] [slfn]) + + 圧縮時に、ファイル名リストを返します。 + slfn は (arc) と同じ。デフォルトは ln。 + \* 等については、ディレクトリ名を渡すときの渡し方指定になります。 + 例えば (listr) コマンドを使うと、ディレクトリをワイルドカードで + 渡さずにNoahが自力で展開してからexeに渡せます。 + + 例題。"c:\file\" の中の "かきくけこ.txt" "abcde.bmp" "xxx"(ディレクトリ) を渡す場合、 + +  5) (list) +  6) (list\* s) +  7) (list\*.* lf) +  8) (list sf) + + はそれぞれどうなるでしょう? + + (resp A) + (resq A) + + 引数の内容を改行で区切ってテンポラリファイルに出力し、そのテンポラリ + ファイルのファイル名を返します。respは、引数A内の二重引用符を消しません。 + resqは、変数A内の二重引用符を消去します。 + (resp@ A) とすると "@tempfilename"、(resp-o A) とすると "-otempfilename" + のような返し方も可能です。 + + 言ってしまえば、 + (cmd -a -mz (arc.cab) (resp@ (listr))) + という使い方を想定しています。 + + + +15.例題の答え ------------------------------------------------- + + 1) c:\programs\ + 2) あいう~1 + 3) c:\programs\あいうえお.cab + 4) あいうえお.lzh.txt + 5) かきくけこ.txt abcde.bmp xxx + 6) かきく~1.txt abcde.bmp xxx\* + 7) c:\file\かきくけこ.txt c:\file\abcde.bmp c:\file\xxx\*.* + 8) c:\file\かきく~1.txt c:\file\abcde.bmp c:\file\xxx + + + + + + + + + + +=★ +=★ 第三部 +=★ + +16.list:セクション、(scan) ----------------------------------- + + 前述の decode1: セクションと、今から説明する list: セクションを + 追加することで、外部exeを利用するタイプのb2eでも書庫内容閲覧を + 行えるようになります。万能ではありません。うまく行けば儲けモノ。(^^; + + list: セクションでは普通、次のfunctionを使って格納ファイル名の + リストを手に入れます。 + +  (scan A B C D E command...) + + まず command... というコマンドを実行し、その出力を解析します。 + つまり、command... にはリスト表示コマンドを書くことになります。 + + 解析オプション A,B,C,D,E は次のような意味です。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、 + 先頭E文字飛ばしてファイル名として読み込み。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + 具体例を見て行きましょう。 + + + + +例1)7za.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + +7-Zip (A) 2.30 Beta 10 Copyright (c) 1999-2002 Igor Pavlov 2002-01-11 + +Listing archive: b2e.7z + + Date Time Attr Size Compressed Name +------------------- ----- ------------ ------------ ------------ +2002-01-19 00:20:48 ....A 459 103732 b2e\7z.b2e +2002-01-19 11:39:38 ....A 212 0 b2e\bh.b2e +2002-01-19 00:37:34 ....A 193 0 b2e\bix.b2e +2002-01-19 12:04:52 ....A 200 0 b2e\j.b2e +2002-01-19 00:19:46 ....A 215 0 b2e\rk.b2e +2002-01-19 12:04:32 ....A 231 0 b2e\sbc.b2e +2002-01-19 00:54:16 ....A 199 0 b2e\uha.b2e +2002-01-19 12:10:44 ....A 426044 0 Noah.exe +------------------- ----- ------------ ------------ ------------ + 427753 103732 8 files + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +"---"で始まる行の1行後ろから、"---"で始まる行の直前まで1行ずつ読み、 +先頭53文字飛ばして、残りがファイル名となっています。従って、b2eの書き方は + +list: + (scan "---" 1 "---" 1 53 l (arc)) + +となります。 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + +例2)imp.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + +IMP 1.12 High-Performance Archiver. Copyright 1998-2000 Technelysium Pty Ltd. + +Name/Comment + Size Created Modified Attr OS Unit +---------- ------------------- ------------------- ----- ----- --------- +b2e\j.b2e + 196 Jan 19 2002 12:22am Jan 19 2002 12:12pm A.... Win32 1 +b2e\uha.b2e + 199 Jan 19 2002 12:38am Jan 19 2002 12:54am A.... Win32 1 +b2e\bix.b2e + 195 Jan 19 2002 12:34am Jan 19 2002 12:12pm A.... Win32 1 +b2e\bh.b2e + 214 Jan 19 2002 12:58am Jan 19 2002 12:13pm A.... Win32 1 +b2e\7z.b2e + 461 Jan 18 2002 06:11pm Jan 19 2002 12:12pm A.... Win32 1 +b2e\sbc.b2e + 233 Jan 19 2002 11:52am Jan 19 2002 12:14pm A.... Win32 1 +b2e\rk.b2e + 217 Nov 26 2001 09:52am Jan 19 2002 12:13pm A.... Win32 1 +b2e\imp.b2e + 235 Jan 19 2002 12:21pm Jan 19 2002 12:24pm A.... Win32 1 +Noah.exe + 426044 Nov 25 2001 10:08pm Jan 19 2002 12:19pm A.... Win32 1 + +Total: 427994 bytes in 9 files +Compressed size: 104730 bytes (24% of original) +Newest file modified Jan 19 2002 12:24pm + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +"---"で始まる行の1行後ろから、空行の直前まで2行ずつ読み、 +先頭0文字飛ばしたところがファイル名となっています。従って、b2eの書き方は + +list: + (scan "---" 1 "" 2 0 v (arc)) + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + + +Eは「先頭E文字飛ばして」の意味と書きましたが、これでは不十分な場合があります。 +ファイル名が右揃えになっていて、左端が一定ではない場合など。このようなときには、 +「頭から○番目の固まり」という形で指定したくなります。 + + + +例3)sbc.exe の出力結果 ++++++++++++++++++++++++++++++++++++++++++++++++++++ + +トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト +ョョ SBC v0.910 beta Copyright (c) 2000-2001 Sami J. M・inen (sjm@pp.inet.fi) ッッ +UNREGISTERED VERSION! Evaluate 30 days, then please register! See the docs! +トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト +Listing archive: "b2e.SBC"... + Filename Size Date Time Attr. + -------- ---- ---- ---- ----- + b2e/j.b2e 199 01/19/2002 00:33:16 A + b2e/uha.b2e 199 01/19/2002 00:54:16 A + b2e/bix.b2e 193 01/19/2002 00:37:34 A + b2e/7z.b2e 459 01/19/2002 00:20:48 A + b2e/rk.b2e 215 01/19/2002 00:19:46 A + b2e/bh.b2e 212 01/19/2002 11:39:38 A + b2e/sbc.b2e 210 01/19/2002 11:59:50 A + Noah.ilk 807600 01/19/2002 00:17:50 A + UNACEV2.DLL 75264 12/27/2001 02:00:00 A + Noah.exe 426044 01/19/2002 00:17:52 A + +Archive contains 10 files, 1310595 bytes of original data. + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + +" --------"で始まる行の1行後ろから、空行の直前まで +1行ずつ読み、先頭から1つ目の固まりがファイル名です。というわけで + +list: + (scan " --------" 1 "" 1 -1 l (arc)) + +となります。ブロック単位で指定したいときは、マイナスをつけて指定します。 + ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + + +(scan A B C D E command...) +   Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、 +   先頭E文字飛ばしてファイル名として読み込み。 + + 特別な仕様。 +  Aを "" にした場合、「先頭からB行目」から読むようになります。 +  「""で始まる行のB行後ろから」ではなくて。 + +  Cを "" にした場合、「空行の直前まで」になります。 +  「""で始まる行(どんな行にも当てはまってしまう)まで」ではなくて。 + +(xscan A B C D E command...) +   Aで始まる行の B行後ろから Cで始まる行の直前まで D行ずつ読み、 +   先頭E文字飛ばしてファイル名として読み込み。 +   command... の一個目に、外部実行ファイルを指定します。 ADDED Release/b2e/jak.b2e Index: Release/b2e/jak.b2e ================================================================== --- Release/b2e/jak.b2e +++ Release/b2e/jak.b2e @@ -0,0 +1,19 @@ +load: + (name Jack32.dll) + (type jak 1.20MB *1.44MB) + +check: + +decode: + (cmd -c (arc) (dir)) + +decode1: + (cmd -c (arc) (dir)) + +encode1: + (if (method 1) (cmd -r -m0 -v:1213 (list) (arc d))) + (if (method 2) (cmd -r -m0 -v:1423 (list) (arc d))) + +sfxd: + (if (method 1) (cmd -r -m1 -v:1213 (list) (arc d))) + (if (method 2) (cmd -r -m1 -v:1423 (list) (arc d))) ADDED Release/caldix.exe Index: Release/caldix.exe ================================================================== --- Release/caldix.exe +++ Release/caldix.exe cannot compute difference between binary files ADDED Release/html/cmpr.png Index: Release/html/cmpr.png ================================================================== --- Release/html/cmpr.png +++ Release/html/cmpr.png cannot compute difference between binary files ADDED Release/html/efaq.htm Index: Release/html/efaq.htm ================================================================== --- Release/html/efaq.htm +++ Release/html/efaq.htm @@ -0,0 +1,18 @@ + + + + + + + +

1. I can't extract Any archive by Noah!

+

+Have you installed the DLLs ? +

+ +

2. Where to get DLL?

+

+Here. +

+ + ADDED Release/html/eindex.htm Index: Release/html/eindex.htm ================================================================== --- Release/html/eindex.htm +++ Release/html/eindex.htm @@ -0,0 +1,31 @@ + + + + + + + + + +
    +
  1. TOP
    • +
    • TO RUN NOAH...
    • +
    • USAGE
    • +
    • FAQ
    • +
    • INFOMATION
    • +
    + + ADDED Release/html/emanual.htm Index: Release/html/emanual.htm ================================================================== --- Release/html/emanual.htm +++ Release/html/emanual.htm @@ -0,0 +1,16 @@ + + + + Noah User's Manual + + + + + +<body><p> +<a href="eindex.html">INDEX</a> +</p><p> +You should view this manual using the browser which supports 'FRAME' ... +</p></body> + + ADDED Release/html/esonota.htm Index: Release/html/esonota.htm ================================================================== --- Release/html/esonota.htm +++ Release/html/esonota.htm @@ -0,0 +1,33 @@ + + + + + + + +

    License( NYSL version 0.9982en )

    +
    +  A. This software is "Everyone'sWare". It means:
    +    Anybody who has this software can use it as if you're
    +    the author.
    +
    +    A-1. Freeware. No fee is required.
    +    A-2. You can freely redistribute this software.
    +    A-3. You can freely modify this software. And the source
    +        may be used in any software with no limitation.
    +
    +  B. The author is not responsible for any kind of damages or loss
    +    while using or misusing this software, which is distributed
    +    "AS IS". No warranty of any kind is expressed or implied.
    +    You use AT YOUR OWN RISK.
    +
    + +

    About Us

    +
    +
    K.INABA ( kMonos.NET )
    +Program. +
    SB ( SB Room )
    +Icon Design. +
    + + ADDED Release/html/etop.htm Index: Release/html/etop.htm ================================================================== --- Release/html/etop.htm +++ Release/html/etop.htm @@ -0,0 +1,16 @@ + + + + + + + +

    Noah User's Manual

    +

    +Thank you for downloading Noah! +

    +This document is a manual for "Noah" +- a tiny archiver for Windows 95/98/Me/NT4/2000/XP/2003. +

    + + ADDED Release/html/eusage.htm Index: Release/html/eusage.htm ================================================================== --- Release/html/eusage.htm +++ Release/html/eusage.htm @@ -0,0 +1,98 @@ + + + + + + + +

    DLLs you need

    +

    +Most of Noah's compression/decompression engine is offered as DLL file. +You must install those DLLs to '/windows/system' directory to handle corresponding archives. +

    +

    +Here is all formats that Noah supports by default. +

    + +

    +many of these DLLs are take parts in Common Archivers Library Project. +

    +

    +You can use 'DLL Download' in StartMenu->Noah to download and +install these DLLs automatically. Try it. +

    + +

    Compression

    +

    +Drag-and-Drop files to Noah's icon. Then you'll have an archive at the direcotry +you specified in the configure dialog. +

    +

    +If you drop files with 'Ctrl' key pressed, then you can archive them to +an SFX archive (executable and self-extractable archive.)
    +*) for lzh, cab, bga archives only. +

    +

    +When you drop multiple files, normally Noah will pack them to one archive. +But if you drop files with 'Alt' key pressed, then each files is compressed to +different archives. +

    + +

    Extraction

    +

    +Drag-and-Drop archives to Noah's icon. Noah automatically decides which operation +(compress, or extract) to do by analyzing dropped files. +

    + +

    View

    +

    +When you drop archives with 'Ctrl' key pressed, Noah will go into 'Arc-View-Mode'. +In this mode, you can directly open files inside the archive, etc. +

    + +

    Configuration

    + +

    Compress Tab

    +

    +Destination Folder: specify where to put the arhive.
    +Method: the type of archive you want to create. 'zip' - 'normal' is recommended.
    +Which-To-Do: +Noah automatically decides whick operation - Compress or Extract - to do. +You can change this decision's rule here.
    +mode-1 = gives priority to 'Compress' operation.
    +mode-2 = gives priority to 'Extract' operation. (default)
    +

    + +

    Extract Tab

    +

    +Destination Folder: specify where to put the extracted files.
    +Create Directory etc: automatically create a directory with same name of the archive at the Destination Folder, or not.
    +

    + +

    Windows Tab

    +

    +Association: After checking these boxes, you can extract archives by Double-Clicking.
    +D&D Shell Extension: On the menu shown at D&D in explorer by right mouse key.
    +Shortcut: Shortcut.
    +

    + +

    About Tab

    +

    +Show the version of Noah and installed DLLs. +

    + + ADDED Release/html/extr.png Index: Release/html/extr.png ================================================================== --- Release/html/extr.png +++ Release/html/extr.png cannot compute difference between binary files ADDED Release/html/faq.htm Index: Release/html/faq.htm ================================================================== --- Release/html/faq.htm +++ Release/html/faq.htm @@ -0,0 +1,87 @@ + + + + + + + +

    Q:DLL自動ダウンロードしたのに、UnaceV2.dll が入っていません。

    +

    +このDLLに関しては、自動ダウンロードが出来ません。 +申し訳ありませんが、UnaceV2.dllが必要な方は手動でインストールして下さい。 +

    + +

    Q:圧縮って何?書庫って?SFXって?ドラッグ&ドロップって?

    +

    +「用語集」を見てください。 +

    + +

    Q:15個くらいのファイルを圧縮しようとしたら、 +「アクセスは拒否されました」と出て圧縮できません。

    +

    +これは、Windows のバグです。Noah でこれを回避して圧縮するには、 +[ 設定ダイアログを開いてそこにドラッグ&ドロップ ] という方法をとって下さい。 +

    + +

    Q:圧縮してもほとんど小さくなりません。
    +Q:圧縮するとサイズが増えます。

    +

    +世の中には、実は既に圧縮してあるファイルがたくさんあります。よく +使われるものの中では、デジカメで撮った写真(JPEG形式)や、ホームページの画像 +ファイル(GIF,PNG形式)、音楽ファイル(MP3,WMA形式)などが該当します。これらの +ファイルは、何せ既に圧縮してあるため、Noahでそれ以上に小さくする事は不可能です。 +むしろ、逆に大きくなってしまうこともあり得ます。 +

    +

    +サイズが増えてしまう点については、多分「圧縮」という用語が +パソコンの話になると普通とちょっと違って特殊なのが原因の誤解かも知れません。 +例えばNoahで sample.html という 100KB のファイルを圧縮すると、 +sample.html のサイズが減って 50KB に…はなりません。 +

    +

    +sample.html ファイルはそのまま残して置いて、sample.lzh という +別のファイルを作ります。この sample.lzh が sample.html を +圧縮したものになりますので、sample.lzh の方だけメールで送るなど +すれば、受け取った方がそれを解凍して sample.html が手に入ることに +なります。 +

    +

    +元のファイルはそのままで、別に圧縮したファイルをつくるので、 +ちょっと見には、サイズは増えてしまうわけですね。 +どちらかというと「圧縮」と言うよりは「縮小コピー」という感覚です。 +

    + +

    Q:[abc].txt や -def-.doc という名前のファイルが圧縮できない

    +

    +'[' や ']' を含んでいたり、'-' で始まるファイルを処理しようとすると、 +誤動作することが多いです。申し訳ありませんが、ファイル名を変更するか +適当なフォルダに移してから、フォルダごと圧縮してください。 +

    + +

    Q:圧縮してからJAK分割しようと思ったのにNoahに送ったら解凍されてしまいます。

    +

    +分割の時だけ、設定を「常に圧縮」に変えて圧縮して下さい。 +でないと書庫だから解凍してしまいます。 +一度だけ設定を変える変え方は、
    +1.Shiftを押しながらドラッグ&ドロップ
    +2.出てくるダイアログで「圧縮専用」「jak」を選ぶ
    +3.Shiftを押しながらキャンセルを押す
    +

    + +

    Q:Shiftで送ったらメモ帳が開きます。

    +

    +窓の手などのカスタマイズソフトで、 +「未登録ファイルはとりあえずメモ帳で開く」的設定にしていると +この問題が発生します。Noahではどうしようもないのでそのカスタマイズを +やめるか、Noahの設定は普通のダブルクリックで行って下さるようお願いします。 +

    + +

    Q:書庫アイコンを他のものに変えたい。

    +

    +Noahのアイコンを変える +にアイコン変更方法が書かれています。また、このページからのリンクをたどると、 +Noah用アイコンセットが幾つか手に入ります。お好きな物をどうぞ。 +作者のK.INABAは標準のアイコンが好きなんですけどねー。(^^; +

    + + ADDED Release/html/icon.htm Index: Release/html/icon.htm ================================================================== --- Release/html/icon.htm +++ Release/html/icon.htm @@ -0,0 +1,52 @@ + + + + + + + +

    書庫アイコン変更について

    +

    +2004/08/04 リリースの Noah version 3.194 にて、 +Noahで扱う書庫ファイル(圧縮ファイル)のアイコンを変更しました。 +これまで +

    +

    + + +

    +

    +のような「卵と雛」の絵で圧縮ファイルが表示されていましたが、新しいバージョンでは、 +

    +

    + + +

    +

    +のような「手紙と羽ペン」の絵になります。よろしくお願いします。 +

    + +

    Q&A: 3.194を入れてもアイコンが変わりません。

    +

    +一度Noahの設定画面を開いて[Windows拡張]を選び、[関連づけ]の枠内の +チェックを全て外し、[適用]を押してください。その後、もう一度 +チェックを全て付け直して、再度[適用]を押します。これで、 +新しいアイコン画像に置き換わると思います。 +

    + +

    Q&A: 他のアイコンに変えたい

    +

    +SB Roomに、 +Noah用アイコンセットが多数公開されています。是非ご覧下さい。 +

    + + +

    Q&A: 7z形式じゃない書庫が7zのアイコンになっちゃいました。

    +

    +お手数ですが、もう一度Noahの設定画面を開いて、関連づけのやり直しをお願いします。 +手順は、二つ上の"Q&A: 3.194を入れてもアイコンが変わりません。"に書いてある +通りです。 +

    + + + ADDED Release/html/index.css Index: Release/html/index.css ================================================================== --- Release/html/index.css +++ Release/html/index.css @@ -0,0 +1,34 @@ + +body { + color: #330; + background: #f5fff5; + margin: 0.5em; +} + +div.navi { + font-size: smaller; + text-align: center; + font-weight: bolder; + margin-bottom: 1em; +} + +a { + color: blue; + text-decoration: none; +} a:hover { + color: #090; + background: transparent url("niji.gif") repeat-x bottom; +} + +ol { + margin-left: 1.5em; + padding: 0; +} +ul { + margin: 1em 0 1em 0.5em; + list-style-type: square; + padding: 0; +} +li { + margin-bottom: 0.1em; +} ADDED Release/html/index.htm Index: Release/html/index.htm ================================================================== --- Release/html/index.htm +++ Release/html/index.htm @@ -0,0 +1,44 @@ + + + + + + + + + +
      +
    1. 表紙
      • +
      • 使い方:基礎編
      • +
      • 使い方:発展編
      • +
      • 用語集
      • +
      • よくある質問
          +
      • +
      • その他
      • +
      + + ADDED Release/html/jmanual.htm Index: Release/html/jmanual.htm ================================================================== --- Release/html/jmanual.htm +++ Release/html/jmanual.htm @@ -0,0 +1,16 @@ + + + + Noah User's Manual + + + + + +<body><p> +<a href="index.html">INDEX</a> +</p><p> +You should view this manual using the browser which supports 'FRAME' ... +</p></body> + + ADDED Release/html/new_lzh.gif Index: Release/html/new_lzh.gif ================================================================== --- Release/html/new_lzh.gif +++ Release/html/new_lzh.gif cannot compute difference between binary files ADDED Release/html/new_zip.gif Index: Release/html/new_zip.gif ================================================================== --- Release/html/new_zip.gif +++ Release/html/new_zip.gif cannot compute difference between binary files ADDED Release/html/niji.gif Index: Release/html/niji.gif ================================================================== --- Release/html/niji.gif +++ Release/html/niji.gif cannot compute difference between binary files ADDED Release/html/noahman.css Index: Release/html/noahman.css ================================================================== --- Release/html/noahman.css +++ Release/html/noahman.css @@ -0,0 +1,76 @@ + +body { + color: #330; + background: #fff5ff; + margin: 1em; + padding: 0; +} + +a:link, a:visited, a:active { + color: blue; + text-decoration: none; +} a:hover { + color: #090; + background: transparent url("niji.gif") repeat-x bottom; +} + +h1 { + font-size: 300%; + font-family: fantasy; + font-weight: bolder; + text-align: center; + color: #090; + margin-top: 1em; + margin-bottom: 2em; +} +h2 { + color: black; + background: #eeeed0; + font-size: 120%; + margin-top: 2em; +} +h3 { + color: black; + background: #eeeed0; + font-size: 120%; +} +h4 { + color: #040; + font-size: 80%; + margin-left: 2em; +} + +p { + margin-left: 1em; +} +p.intro { + text-align: center; +} +div.down1 { + margin-left: 2em; + margin-bottom: 1em; +} + +address { + font-style: normal; + margin-left: 1em; +} + +dl { + margin-left: 1em; +} +dd { + margin-left: 2em; + margin-bottom: 1em; + font-size: smaller; +} +ul { + margin-left: 2em; +} + +em { + color: #933; + font-weight: bolder; + font-style: normal; + text-decoration: none; +} ADDED Release/html/old_lzh.gif Index: Release/html/old_lzh.gif ================================================================== --- Release/html/old_lzh.gif +++ Release/html/old_lzh.gif cannot compute difference between binary files ADDED Release/html/old_zip.gif Index: Release/html/old_zip.gif ================================================================== --- Release/html/old_zip.gif +++ Release/html/old_zip.gif cannot compute difference between binary files ADDED Release/html/sonota.htm Index: Release/html/sonota.htm ================================================================== --- Release/html/sonota.htm +++ Release/html/sonota.htm @@ -0,0 +1,222 @@ + + + + + + + +

      更新履歴

      +
      +
      3.199
        +
      • インストーラ版添付の caldix のバージョンを 1.21 に更新
      • +
      • 標準で tar.xz と tar.lzma の圧縮に対応(最新のTar32.dllが必要です)。 +(関連づけは、設定画面で一端tarの関連づけを外して保存終了してから、 +もう一度tarに関連づけ直してください。.xz と .lzma が Noah に +関連づけされます。)
      • +
      +
      3.198
        +
      • Windows XP SP2 以上でないと動かなくなっていた問題を修正
      • +
      +
      3.197
        +
      • MSVCR100.dll がないと動かなくなっていた問題を修正
      • +
      +
      3.196
        +
      • JVNVU#707943 + : Windows プログラムの DLL 読み込みに脆弱性 への対処
      • +
      • 初期設定時の圧縮形式を lzh から zip に変更しました
      • +
      • ACEの自己解凍書庫の認識範囲を広げました
      • +
      • Noah.exe 本体をUPX圧縮しないようにしました
      • +
      • b2eに\を/に置き換える(slash A)を追加
      • +
      • Noahの設定画面へのD&Dでの圧縮・展開機能をマニュアルに記載
      • +
      • 半角1文字の名前のフォルダを圧縮したものを展開すると、展開後フォルダが開かれないバグを修正
      • +
      • ACE書庫の書庫内閲覧モードで、圧縮方式の判定が間違っていたのを修正
      • +
      • 7-zip 形式での圧縮や展開で、"-" で始まるファイル名を扱えるように修正
      • +
      • b2e を使っていた場合多バイト文字で終わる名前のファイルを圧縮できなかったバグ修正
      • +
      • D&D処理後、Noahがそのまま起動していると出力先フォルダを削除できないバグを修正
      • +
      • バッファオーバーフローとリソースリークの危険をいくつか修正
      • +
      • b2eの引き算がおかしかった(常に0になっていた)バグを修正
      • +
      • MSCompress形式での圧縮時にタイムスタンプを元ファイルと合わせるように修正
      • +
      • 圧縮/解凍先ディレクトリ設定のエディットボックスにIMEで入力すると文字化けするバグを修正
      • +
      • b2eのscanでファイルをリストアップしたとき最後にゴミが混じるバグを修正
      • +
      • (検索結果などから)異なるディレクトリにある書庫を一括でNoahに渡しても解凍はできるように変更
      • +
      +
      3.195
        +
      • 7zの書庫アイコンを追加。
      • +
      • 7z書庫の圧縮モードに LZMA(fast), LZMA(std) を追加。
      • +
      • ace書庫,cpt書庫内の絶対パスや".."が含まれている名前のファイルを
        +   展開しようとしたときに確認メッセージを出すように変更。
      • +
      • jar書庫(Java Archive)を7-zip32.DLLで展開するようにしました。
      • +
      • Noahと同じフォルダにcaldix.iniファイルがあるときには、
        +   DLLをcaldixのインストール先からも検索するようにしました。
        +  (ただし、システムフォルダの方が優先です。)
      • +
      • 書庫の存在するディレクトリが読込専用かどうかの
        +   判定ルーチンを変更(まだテスト中)
      • +
      +
      3.194
        +
      • 書庫アイコン変更。
      • +
      • GCAの自己解凍書庫が展開できなくなっていたバグ修正。
      • +
      • zipの展開に7-zip32.DLLを優先して使うようにしました。
      • +
      • 7z.sfx無しで、7-zip32.DLLのみで7z形式の自己解凍書庫を
        +  作成できるようにしました。
      • +
      • b2e: xscanコマンドを追加
      • +
      • b2e: ゼロ引数の(cmd)の形を許可
      • +
      • b2e: +が論理OR、*が論理ANDとしても使えるようにしました。
      • +
      • 他、細かなバグフィックスを幾つか
      • +
      +
      3.193
        +
      • Win9x 系で、自動判別を行わない場合に圧縮解凍が全くできなくなっていたバグの修正
      • +
      • zip - 7zip形式の設定を圧縮率最優先にした
      • +
      • 書庫閲覧モードで、[ファイル数][合計圧縮率][書庫形式] を表示するようにした
      • +
      • iniファイルに隠し設定項目NoExtを追加
      • +
      +
      3.192
        +
      • 書庫ファイル中に"explorer.exe"というファイルが存在した場合に
        +  解凍後にこれを自動実行してしまうセキュリティホールの修正
      • +
      • ファイル名先頭の'.'は拡張子の始まりとみなさないで書庫名を作るようにした
        + (例えば、".htaccess"を圧縮するとこれまでは".lzh"という書庫が)
        + (出来ましたが、新バージョンでは".htaccess.lzh"になります。)
      • +
      • iniファイルに設定項目MultiBootLimitを追加
      • +
      +
      3.191
        +
      • b2eスクリプトに関する細々としたバグフィックス
      • +
      • メールアドレス、URL変更に伴う付属文書の更新
      • +
      +
      3.19
        +
      • aaa.bbb.ccc を圧縮したら aaa.lzh ではなく aaa.bbb.lzh とするための設定項目をiniファイルに追加。
      • +
      +
      3.18
        +
      • 圧縮形式名などのところにマウスを当てるとツールチップ表示するようにした
      • +
      • b2e の (cmd), (xcmd) で終了コードを返すように変更
      • +
      +
      3.17
        +
      • 7-zip32.dll対応に関する色々
      • +
      • NT系で、書庫閲覧モードからファイルをドロップ出来ないことが多かったバグ修正
      • +
      +
      3.16
        +
      • MS-Compress形式とb2e利用形式での圧縮率表示が変だったのを修正
      • +
      • iniファイルに設定項目 MiniBoot を追加
      • +
      • UnaceV2.dllなどのバージョン番号も可能なら表示するようにした
      • +
      • b2e: (find) (use) 追加
      • +
      +
      3.15
        +
      • caldix.iniを消し忘れないようにアンインストーラを修正
      • +
      • [閲覧モード] 圧縮後サイズが42MB以上のファイルについて圧縮率表示が変だったのを修正
      • +
      • [閲覧モード] 項目のソートを可能にした。
      • +
      • [閲覧モード] 超絶手抜き右クリックメニュー
      • +
      • [b2e] size, <, > の3コマンド追加
      • +
      • [b2e] 数値でない値に対しても = や ! での比較を行えるようにした
      • +
      +
      3.14
        +
      • 英語版モードの調整色々(Thanks! > ardryさん
      • +
      • フォルダをドロップしたときの書庫名は、ピリオド以降を除かないように変更
      • +
      • b2e に input コマンド追加
      • +
      • インストーラ版に同梱のcaldixをVer 1.10に
      • +
      +
      3.131
        +
      • '%' の混じった名前のファイルをb2eスクリプトで扱えないバグ修正
      • +
      +
      3.13
        +
      • '@' で始まるファイルの圧縮への対応を強化
      • +
      • 書庫内ファイルリストに余計なゴミが表示されることがあったバグ修正
      • +
      +
      3.12
        +
      • 解凍先フォルダ名を、「書庫名の最初の . 以降を全部除いたもの」ではなく「書庫名の最後の . 以降を全部除いたもの」にするよう変更。
      • +
      +
      3.11
        +
      • '-'で始まったり'['を含んだりする名前のファイルのzip圧縮を可能にした
      • +
      • zip無圧縮書庫の作成に対応
      • +
      +
      3.10+
        +
      • 添付するcaldixのバージョンを1.06に変更しただけ
      • +
      +
      3.10
        +
      • 圧縮形式の設定を正しくロード出来ないことがあったバグ修正
      • +
      • b2eに、scan コマンド追加
      • +
      +
      3.06
        +
      • NT系でaceの分割書庫を解凍できなかったバグ修正
      • +
      • b2eに、resp, resq, listr コマンド追加
      • +
      +
      3.05
        +
      • Windows XP 正式対応版です
      • +
      • XP の VisualStyle に対応
      • +
      • NT系でUSモードb2eが動かなかったバグ修正
      • +
      +
      3.04
        +
      • Yz1書庫の内容閲覧を可能にした (YZ1.DLL ver 0.20以上が必要)
      • +
      • コマンドラインオプション -cx, -ca 追加
      • +
      • b2eに、USモードで外部アプリを起動する機能を追加
      • +
      • ライセンスをNYSL 0.99に変更
      • +
      +
      3.031
        +
      • 閲覧モードでダブルクリックしてもファイル内容を表示できなくなってたバグ修正
      • +
      • ライセンスをNYSL 0.03に変更
      • +
      +
      3.03
        +
      • DLLでエラーが発生したときその旨表示するようにしたつもり
      • +
      • 64KB以上のAce書庫を解凍するときグラフが変だったバグ修正
      • +
      • GCAの空フォルダをファイルと誤認識してたバグを修正
      • +
      • 閲覧モードで.hlpをダブルクリックしたとき、作業用に.cntも解凍しておく仕様に変更
      • +
      • manual.htmが無いときにヘルプボタンを押されたらreadme.txtを開くように変更
      • +
      • b2eファイルに反応して関連づけ項目を増やすようにした
      • +
      • b2eオプション追加:(arc.)
      • +
      +
      3.02
        +
      • 設定と設定ダイアログが一致しないことがあるバグ修正
      • +
      • SFXや、Password付きのGCA書庫の展開に対応
      • +
      • CPT書庫展開時、ResourceForkのみのファイルも展開するよう変更
      • +
      • CPTの判別強化。以上2点、Thanks! > N2さん
      • +
      • b2eコマンド追加:(del filename)
      • +
      +
      3.01
        +
      • 関連付けのチェックボックスグレーアウト処理を正常化
      • +
      • b2eでの0除算を禁止
      • +
      • 書庫判定優先順位を変更(拡張子優先気味)
      • +
      • lh6やlh7で圧縮できなかったバグ修正
      • +
      +
      +
      +
      3.00
        +
      • フルリニューアル
      • +
      +
      + +

      利用条件等( NYSL version 0.9982 )

      +
      +  A. 本ソフトウェアは Everyone'sWare です。このソフトを手にした一人一人が、
      +     ご自分の作ったものを扱うのと同じように、自由に利用することが出来ます。
      +
      +    A-1. フリーウェアです。作者からは使用料等を要求しません。
      +    A-2. 有料無料や媒体の如何を問わず、自由に転載・再配布できます。
      +    A-3. いかなる種類の 改変・他プログラムでの利用 を行っても構いません。
      +    A-4. 変更したものや部分的に使用したものは、あなたのものになります。
      +         公開する場合は、あなたの名前の下で行って下さい。
      +
      +  B. このソフトを利用することによって生じた損害等について、作者は
      +     責任を負わないものとします。各自の責任においてご利用下さい。
      +
      +  C. 著作者人格権は K.INABA に帰属します。著作権は放棄します。
      +
      +  D. 以上の3項は、ソース・実行バイナリの双方に適用されます。
      +
      + +

      参考サイト

      + +
      +
      統合アーカイバ・プロジェクト(http://www.csdinc.co.jp/archiver/
      +書庫操作関係の共通仕様DLLを作ろう!というプロジェクトです。 +圧縮・解凍に関する情報満載なので、誰でも一度は目を通しておくことをお勧めします。 +
      Tomozo(http://www.tomozo.ne.jp/
      +更新情報お知らせサイトです。ここでメールアドレスを登録すると、 +Noahがバージョンアップしたときに通知メールを受け取れるようになります。 +
      + +

      開発者

      +
      +
      K.INABA( kMonos.NET
      +プログラミング。 +
      SB( SB Room
      +アイコン製作。 +
      + + ADDED Release/html/top.htm Index: Release/html/top.htm ================================================================== --- Release/html/top.htm +++ Release/html/top.htm @@ -0,0 +1,21 @@ + + + + + + + +

      Noah User's Manual

      +

      +Noahダウンロードありがとうございます。 +

      +"Noah"は、Windows 95/98/Me/NT4/2000/XP/2003 上で
      +ファイルの圧縮・解凍を行うためのソフトです。

      +使用する前に必ず「使い方:基礎編」には
      +目を通しておいて下さい。 +

      +重要! +2004/08/04 : 書庫アイコン変更について +

      + + ADDED Release/html/usage0.htm Index: Release/html/usage0.htm ================================================================== --- Release/html/usage0.htm +++ Release/html/usage0.htm @@ -0,0 +1,59 @@ + + + + + + + +

      Noahを使う下準備 - DLLをインストールしよう! -

      +

      +※この作業は、NoahをインストールするときにDLLの自動インストールを +終わらせた方には必要ありません。もう既にNoahは使えるようになっています。 +

      +

      インターネットへ接続できる場合(お勧め)

      +

      +スタートメニューのNoahのところから「DLL自動インストール」を選んで実行して下さい。 +あとは画面の指示に従って操作をすれば、自動でDLLのインストールは完了です! +

      + +

      手動でやる場合

      +

      DLL入手

      +

      +統合アーカイバプロジェクトから +ダウンロードするか、雑誌の付録等で手に入れてください。 +Unlha32.dll と UnZip32.dll があればとりあえずは十分です。 +

      +

      インストール

      +

      +手に入れたDLLは、最初は電子レンジの絵のファイルになっているはずです。 +それを実行して、画面の指示に従っていけば、あとは自動でインストールされます。 +これでNoahを使う準備は完了です。 +

      + +

      Noahで使える全DLL(参考資料)

      +
    2. UnaceV2.dll
    3. +
    4. Unarj32j.dll
    5. +
    6. Bga32.dll
    7. +
    8. Cab32.dll
    9. +
    10. Jack32.dll
    11. +
    12. UnGCA32.dll
    13. +
    14. Unlha32.dll
    15. +
    16. Unrar32.dll & Unrar.dll
    17. +
    18. Tar32.dll
    19. +
    20. Yz1.dll
    21. +
    22. Zip32j.dll & Zip32.dll
    23. +
    24. UnZip32.dll
    25. + + +

      アンインストール

      +

      +Noahの使用を止める場合は、Windowsの「コントロールパネル」の「アプリケーションの +追加と削除」から「圧縮解凍ソフト Noah」を選んで削除してください。 +

      +

      +また、スタートメニューのNoahのグループから「Noah アンインストール」を +選んでもNoahの削除が可能です。 +

      + + + ADDED Release/html/usage1.htm Index: Release/html/usage1.htm ================================================================== --- Release/html/usage1.htm +++ Release/html/usage1.htm @@ -0,0 +1,96 @@ + + + + + + + +

      圧縮する

      +
        +
      • 圧縮したいファイルを右クリック→「送る」メニュー→Noah
      • +
      • 圧縮したいファイルをNoahのアイコンにドラッグ&ドロップ
      • +
      • 圧縮したいファイルを右ボタンでドラッグ&ドロップ→ここに圧縮
      • +
      • 圧縮したいファイルをNoahの設定画面にドラッグ&ドロップ
      • +
      +

      +の4つのうち、どれでも可能です。好みの方法でどうぞ。 +

      + +

      解凍する

      +
        +
      • 解凍したいファイルをダブルクリック
      • +
      • 解凍したいファイルを右クリック→「送る」メニュー→Noah
      • +
      • 解凍したいファイルをNoahのアイコンにドラッグ&ドロップ
      • +
      • 解凍したいファイルを右ボタンでドラッグ&ドロップ→ここに解凍
      • +
      • 解凍したいファイルをNoahの設定画面にドラッグ&ドロップ
      • +
      +

      +の5つのうち、どれでも可能です。好みの方法でどうぞ。 +圧縮と全く同じ手順のものばかりですが、圧縮すべきか解凍すべきかは +Noahが自動で判断するので問題ありません。 +

      + +

      自己解凍形式で圧縮する

      +

      +圧縮の操作を、「Ctrl」キーを押しながら行ってください。 +すると、自己解凍形式で圧縮できます。途中で何かいろいろ入力を促す +画面が出ることがありますが、無視してOKボタンなどを押してしまって大丈夫です。 +

      + +

      設定変更

      +
        +
      • Noahのアイコンをダブルクリック
      • +
      • スタートメニュー→Noah→Noah
      • +
      • Shiftを押しながら適当なファイルを[送る]や[ドラッグ&ドロップ]
      • +
      +

      +の3つのうち、どれでも設定変更画面を起動することが可能です。 +

      +

      +裏技として、「Shiftを押しながら適当なファイルを[送る]や[ドラッグ&ドロップ]」のあと、 +「Shiftを押しながらOK」で「設定を変えながら変更後の設定で圧縮/解凍」、 +「Shiftを押しながらキャンセル」で、「設定は変えないけれど今回だけは画面に残っている設定で圧縮/解凍」 +が可能です。例えば、普段はlzhだけれど今日だけzipで圧縮したい、というときにShiftキャンセルが便利です。 +

      +

      +以下は各々の設定項目の説明。 +

      +

      [圧縮]タブ

      +

      +圧縮タブの画面 +

      +
        +
      • 「圧縮先フォルダ」では、Noahで作った書庫ファイルを置く場所を指定します。
      • +
      • 「圧縮形式」は、どの圧縮法で圧縮するかを指定する欄です。 +よく分からないときはlzh lh5にしておきましょう。
      • +
      • 「動作モード」は、貴方が圧縮と解凍のどちらをよく使うか考えて選んでください。 +圧縮しかしないなら「圧縮専用」。普段は解凍だけだけど、たまに圧縮もするなら「解凍優先」 +といった具合です。適切な設定にするとNoahの起動速度が少しあがることがありますが、 +基本的には大して変わらないので、解凍優先をお勧めします。 +(→動作モードについて
      • +
      +

      [解凍]タブ

      +

      +解凍タブの画面 +

      +
        +
      • 「解凍先フォルダ」では、Noahで解凍したファイルを置く場所を指定します。
      • +
      • 「フォルダ自動生成」をONにしておくと、解凍先に書庫と同じ名前のフォルダを +作って、その中に整理してファイルを解凍します。下の3つは細かい設定です。
      • +
      +

      [Windows拡張]タブ

      +

      +Windows拡張タブの画面 +

      +
        +
      • 「関連付け」では、ダブルクリックしたときにNoahで解凍する書庫形式を指定します。
      • +
      • 「右ドラッグ&ドロップ」ではWindowsでファイルを右ドロップしたときに出る +メニューで、Noahで圧縮解凍出来るようにするか否かを指定します。
      • +
      • 「ショートカット」は送るメニューやデスクトップにNoahのアイコンを置くかどうかの設定です。
      • +
      +

      [About]タブ

      +

      +Noahや、使っているDLLのバージョン情報を表示します。 +

      + + ADDED Release/html/usage2.htm Index: Release/html/usage2.htm ================================================================== --- Release/html/usage2.htm +++ Release/html/usage2.htm @@ -0,0 +1,153 @@ + + + + + + + +

      個別圧縮

      +

      +たくさんのファイルをまとめて普通の方法で圧縮すると、 +全部一つの書庫に固めてしまいます。大抵の場合は一つにまとまった方が便利なのですが、 +たまに、一つ一つバラバラに圧縮したいこともあるかと思います。 +

      +

      +そんなときは「Alt」キーを押しながら圧縮すれば、それぞれ別々に圧縮するようになります。 +

      + +

      書庫内閲覧モード

      +

      +普通の方法で解凍すると、書庫の中にあるファイルを +みんな一度に全部解凍してしまうわけですが、書庫の中の一部のファイルだけちょっと +見てみたい、というときはこの「書庫閲覧モード」が役に立ちます。 +このモードでは、書庫の中にあるファイルの一覧を表示して、必要なものだけ解凍、 +というような操作が可能です。 +

      +

      +書庫閲覧モードにするには、「Ctrl」キーを押しながら解凍して下さい。 +

      + +

      Noahで扱える形式

      +

      圧縮、解凍とも可能なもの

      +
      +
      lzh (Unlha32.dll)
      +
      日本で一番よく使われている圧縮法です。lh5,6,7 は、数字が大きい方が圧縮率がよくなりますが、まだテスト中のため、lh5 以外の書庫を公的な場で利用することは禁止されています。
      + +
      zip (UnZip32.dll Zip32j.dll Zip32.dll)
      +
      世界で一番よく使われている圧縮法です。海外の方へ渡すときはこれで。passwordを選ぶと解凍にパスワードが必要な書庫が作成できます。storeを選ぶと、圧縮は行わず一つのファイルにまとめる作業だけを行います。
      + +
      cab (Cab32.dll)
      +
      Microsoft社の開発した圧縮形式です。特に LZX21 は最強の圧縮効率で知られています。
      + +
      tar (Tar32.dll)
      +
      UNIX で主に使われます。ノーマルなtarは圧縮機能はないので、gzip や bzip2 という圧縮方法を組み合わせるのが一般的です。
      + +
      yz1 (Yz1.dll)
      +
      高速性と、テキストファイルの圧縮率がよいことで知られる日本産の圧縮法です。
      + +
      bga (Bga32.dll)
      +
      同じgzipやbzip2を使うので圧縮率は同等ですが、tarは[書庫化→圧縮]なのに対しこちらは[圧縮→書庫化]という順序で処理するため、書庫内の一部のファイルだけ扱うようなときは高速です。
      + +
      ??_
      +
      希に、ソフトのインストーラについてくることがあります。普通はまず使わないでしょう。
      +
      +

      解凍のみ可能なもの

      +
      +
      rar (Unrar32.dll Unrar.dll)
      +
      新進の圧縮法の中では一番広まっている形式ですね。
      + +
      ace (UnaceV2.dll)
      +
      これも新しい圧縮法の一つ。性能ではrarを越えたかな。
      + +
      gca (Ungca32.dll)
      +
      cabを越える圧縮率でしかもかなり高速な、期待の圧縮法です。お勧め…したいところですが、残念ながらNoahでは圧縮できません。(^^;
      + +
      arj (Unarj32.dll)
      +
      古い圧縮形式です。時々外国のFTPサーバ等で見かける程度。
      + +
      cpt
      +
      Macintosh向けの圧縮形式です。これも最近はあまり見ません。
      +
      +

      分割・結合

      +
      +
      jak (Jack32.dll)
      +
      Noahでは「圧縮形式」欄に入れてしまったのですが、これは実は間違いで、jakは、ファイルを決まったサイズに分割します。1.44MB だと、丁度フロッピーディスクのサイズになります。
      +
      + +

      動作モードについて

      +

      +Noahは、圧縮と解凍のうち適切な方を勝手に判断して実行します。 +たいていの場合は判断に迷うことは無いのですが、時々 +「圧縮すべきか解凍すべきか?」が微妙なことがあります。 +そんな時にはどちらの動作を行うのか、Noahに指示しておくことができます。 +それが、「動作モード」の設定です。 +

      +

      +微妙な場合というのは、書庫を複数いっぺんにドロップしたときです。 +全部それぞれ解凍したいのか、それとも沢山の書庫を一つにまとめておきたいのか、 +果たしてどちらなのかは Noah には判断し難いです。こんな場合どうすればよいかは、 +ユーザーの皆さんが好きな方をNoahに指示してあげてください。つまり…、 +

      +
        +
      • [解凍優先] に設定していたら、それぞれを解凍します。
      • +
      • [圧縮優先] に設定していたら、一つの書庫にまとめて圧縮します。
      • +
      +

      +なお [圧縮専用] や [解凍専用] は、Noahに自動判定をさせないで、 +どんなときも圧縮/解凍しろ!と指示するときに使うモードです。 +

      + +

      コマンドラインオプション

      +
        +
      • -a 必ず圧縮
      • +
      • -x 必ず解凍
      • +
      • -w 圧縮の時は個別圧縮で
      • +
      • -ca 圧縮の時は自己解凍形式で
      • +
      • -cx 解凍の時は書庫内閲覧で
      • +
      • -dDirName 出力先
      • +
      • -tTypeName 圧縮形式
      • +
      • -mMethod 圧縮メソッド
      • +
      + +

      隠し設定

      +

      +Noahのインストール先フォルダに作成されるnoah.iniファイルに +以下のような行を追加することで、更に細かい設定を行うことが出来ます。 +通常は必要ありません。 +

      +
      +
      OpenBy=ディレクトリを開くコマンド
      +
      +デフォルトは explorer "%s" です。 +%sは実行時にディレクトリ名に置き換えられます。 +例えば explorer /e,"%s" とすればエクスプローラで開けます。 +
      +
      MiniBoot=1
      +
      +b2eから実行ファイルを起動する際に、最小化状態で +実行したい場合は、MiniBoot=1 と書いて下さい。 +
      +
      OldAbout=1
      +
      +バージョン情報表示が遅いときにこれを入れると簡易表示になります。 +
      +
      OneExt=1
      +
      +aaa.bbb.ccc を圧縮したときの書庫名を aaa.lzh ではなく +aaa.bbb.lzh としたいときに設定します。 +
      +
      NoExt=1
      +
      +aaa.bbb.ccc を圧縮したときの書庫名を aaa.lzh ではなく +aaa.bbb.ccc.lzh としたいときに設定します。この設定よりも、 +OneExt=1の方が優先されます。 +
      +
      MultiBootLimit=4
      +
      +Noah.exeが一発圧縮解凍用に一度に起動できる最大個数を制限します。デフォルトは4。 +
      + + +
      + + ADDED Release/html/win.png Index: Release/html/win.png ================================================================== --- Release/html/win.png +++ Release/html/win.png cannot compute difference between binary files ADDED Release/html/yougo.htm Index: Release/html/yougo.htm ================================================================== --- Release/html/yougo.htm +++ Release/html/yougo.htm @@ -0,0 +1,65 @@ + + + + + + + +

      圧縮・解凍

      +

      +パソコンに文章や絵を記録するとき、普通に「保存」すると、例えば100文字書いたときなら +100文字分、5000文字書いたときなら5000文字分の大きさの「ファイル」として記録されます。 +ところが大抵のファイルは、うまく処理すると、もっとずっと小さなファイルに保存することが +出来てしまうのです!小さなファイルに出来れば、メールにして送るときの電話代も節約できるなど、 +いいことずくめです。この魔法のような技が、圧縮です。 +

      +

      +…と、これだけではあまりにも怪しげですね。もう少し圧縮の原理について説明しましょう。 +「すもももももももものうち」という文章を記録することを考えてみます。普通に記録すると、 +12文字分になります。ところが、「すも×8のうち」と、[も] が8個並んでることを [も×8] +と表すようにすれば、なんと7文字で済むことになります。 +

      +

      +※ 実際にはこれよりかなり複雑な計算を行って、圧縮の効率を上げています。 +

      +

      +圧縮したファイルは「すも×8のうち」みたいに、ある意味謎の記号の並ぶファイルに +なってしまっていますので、残念ながらそのまま使うことは出来ません。圧縮した文章を +もう一度ワープロで開きたいときは、元の状態に戻してやる必要があります。 +この戻す作業のことを「解凍」といいます。 +

      +

      +そして、Noahは、この圧縮と解凍をするためのソフトなわけです。 +

      + +

      書庫・アーカイブ

      +

      +「複数のファイルを一つにまとめたファイル」のこと。 +書庫でもアーカイブでもどちらも同じ意味です。 +大抵は一つにまとめると同時に圧縮も行われるので、 +混同されて圧縮したファイルのことを書庫と呼ぶことも多々あります。 +

      + +

      自己解凍形式書庫

      +

      +圧縮は便利なのですが、一度圧縮してしまうと、 +解凍ソフトを持っていないと解凍できない、という不便な点があります。 +そこで、解凍ソフトなしでも自分で自分を解凍できてしまうような +風に圧縮してしまうと言う手があります。それが自己解凍形式書庫 +(通称SFX)です。 +

      + +

      ドラッグ&ドロップ

      +

      +和訳すると、「引きずり落とす」ことです。…って何の説明にもなってないですね。
      +ファイルをマウスの矢印で指し、マウスのボタンを押し、押したままファイルを引きずり、 +どこか(Noahの上とか)でボタンを放して落とす一連の作業のことを言います。 +文字だけではよくわからない、という方は、本屋でパソコン入門書を立ち読みするか、 +知り合いの方にドラッグ&ドロップの実演をしてもらってみて下さい。(^^; +

      +

      +D&D、DnD、ドロップなどと省略して書かれることが多いです。 +また私は、マウスの右ボタンでのDnDのことを[右ドラッグ&ドロップ]と言っています。 +

      + + ADDED Release/manual-e.htm Index: Release/manual-e.htm ================================================================== --- Release/manual-e.htm +++ Release/manual-e.htm @@ -0,0 +1,16 @@ + + + + Noah User's Manual + + + + + +<body><p> +<a href="html/eindex.htm">INDEX</a> +</p><p> +出来れば、フレーム対応のブラウザでご覧下さい。 +</p></body> + + ADDED Release/manual.htm Index: Release/manual.htm ================================================================== --- Release/manual.htm +++ Release/manual.htm @@ -0,0 +1,16 @@ + + + + Noah User's Manual + + + + + +<body><p> +<a href="html/index.htm">INDEX</a> +</p><p> +出来れば、フレーム対応のブラウザでご覧下さい。 +</p></body> + + ADDED Release/uninst.exe Index: Release/uninst.exe ================================================================== --- Release/uninst.exe +++ Release/uninst.exe cannot compute difference between binary files ADDED Resource.h Index: Resource.h ================================================================== --- Resource.h +++ Resource.h @@ -0,0 +1,94 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by Noah.rc +// +#define IDS_M_ERROR 1 +#define IDS_C_ERROR 2 +#define IDS_CHOOSEDIR 3 +#define ID_ALLYES 3 +#define IDS_FNAME 4 +#define ID_ALLNO 4 +#define IDS_SIZE 5 +#define IDS_DATETIME 6 +#define IDS_RATIO 7 +#define IDS_METHOD 8 +#define IDS_PATH 9 +#define IDS_EXECUTING 10 +#define IDS_NOLIST 11 +#define IDS_ARCVIEW_MSG 12 +#define IDI_MAIN 101 +#define IDI_B2E 102 +#define IDR_ACCEL 115 +#define IDD_ARCVIEW 116 +#define IDD_CMPCFG 117 +#define IDD_MLTCFG 118 +#define IDD_WINCFG 119 +#define IDD_INFCFG 120 +#define IDD_PROGRESS 121 +#define IDD_PASSWORD 122 +#define IDD_ANYASS 123 +#define IDR_DEFAULT1 124 +#define IDD_PATHCHECK 126 +#define IDC_FILELIST 1000 +#define IDC_MELTEACH 1001 +#define IDC_SHOW 1002 +#define IDC_SELECTINV 1003 +#define IDC_MODE1 1004 +#define IDC_MODE2 1005 +#define IDC_MODE3 1006 +#define IDC_MODE4 1007 +#define IDC_ODIR 1008 +#define IDC_DDIR 1009 +#define IDC_DDIR1 1010 +#define IDC_DDIR2 1011 +#define IDC_REF 1012 +#define IDC_CMPEXT 1013 +#define IDC_CMPMHD 1014 +#define IDC_MKDIR 1015 +#define IDC_MKDIR1 1016 +#define IDC_MKDIR2 1017 +#define IDC_MKDIR3 1018 +#define IDC_VERSION 1019 +#define IDC_LZH 1030 +#define IDC_ZIP 1031 +#define IDC_CAB 1032 +#define IDC_RAR 1033 +#define IDC_TAR 1034 +#define IDC_YZ1 1035 +#define IDC_GCA 1036 +#define IDC_ARJ 1037 +#define IDC_BGA 1038 +#define IDC_ACE 1039 +#define IDC_CPT 1040 +#define IDC_JAK 1041 +#define IDC_7Z 1042 +#define IDC_CMP 1043 +#define IDC_MLT 1044 +#define IDC_SND 1045 +#define IDC_DSK 1046 +#define IDC_BAR 1047 +#define IDC_FNAME 1048 +#define IDC_EDIT 1049 +#define IDC_MASK 1050 +#define IDC_ASS 1051 +#define IDC_NASSOC 1052 +#define IDC_ASSOC 1053 +#define IDC_ADD 1054 +#define IDC_DEL 1055 +#define IDC_MESSAGE 1057 +#define IDC_NOADMIN 1058 +#define IDC_STATUSBAR 1059 +#define IDC_PATHNAME 1060 +#define IDA_MYDIR 40001 +#define IDA_HELP 40002 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 127 +#define _APS_NEXT_COMMAND_VALUE 40003 +#define _APS_NEXT_CONTROL_VALUE 1062 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif ADDED SubDlg.cpp Index: SubDlg.cpp ================================================================== --- SubDlg.cpp +++ SubDlg.cpp @@ -0,0 +1,537 @@ + +#include "stdafx.h" +#include "NoahApp.h" +#include "SubDlg.h" + +int CArcViewDlg::st_nLife; + +BOOL CArcViewDlg::onInit() +{ + char cstr[100]; + kiStr str; + kiPath path; + SHFILEINFO sfi,lfi; + HIMAGELIST hImS,hImL; + kiListView ctrl( this, IDC_FILELIST ); + __int64 filesize_sum = 0; + + //-- ダイアログ一個生成の印 + hello(); + m_bSmallFirst[0] = m_bSmallFirst[1] = m_bSmallFirst[2] = + m_bSmallFirst[3] = m_bSmallFirst[4] = m_bSmallFirst[5] = true; + + //-- 真ん中に&前に + setCenter( hwnd(), app()->mainhwnd() ); + setFront( hwnd() ); + + //-- アイコン + path = m_fname.basedir, path += m_fname.sname; + hImS = (HIMAGELIST)::SHGetFileInfo( path, 0, &sfi, sizeof(sfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_SMALLICON ); + hImL = (HIMAGELIST)::SHGetFileInfo( path, 0, &lfi, sizeof(lfi), SHGFI_SYSICONINDEX | SHGFI_ICON | SHGFI_LARGEICON ); + sendMsg( WM_SETICON, ICON_BIG, (LPARAM)lfi.hIcon ); + sendMsg( WM_SETICON, ICON_SMALL, (LPARAM)sfi.hIcon ); + + //-- タイトル + sendMsg( WM_SETTEXT, 0, (LPARAM)kiPath(m_fname.lname).name() ); + + //-- 解凍先 + sendMsgToItem( IDC_DDIR, WM_SETTEXT, 0, (LPARAM)(const char*)m_ddir ); + + //-- リスト + if( !m_pArc->list( m_fname, m_files ) || m_files.len()==0 ) + { + m_bAble = false; + ctrl.insertColumn( 0, "", 510 ); + ctrl.insertItem( 0, str.loadRsrc(IDS_NOLIST) ); + } + else + { + m_bAble = ( 0 != (m_pArc->ability() & aMeltEach) ); + + ctrl.setImageList( hImL, hImS ); + ctrl.insertColumn( 0, str.loadRsrc(IDS_FNAME), 110 ); + ctrl.insertColumn( 1, str.loadRsrc(IDS_SIZE), 70, LVCFMT_RIGHT ); + ctrl.insertColumn( 2, str.loadRsrc(IDS_DATETIME),100, LVCFMT_RIGHT ); + ctrl.insertColumn( 3, str.loadRsrc(IDS_RATIO), 55, LVCFMT_RIGHT ); + ctrl.insertColumn( 4, str.loadRsrc(IDS_METHOD), 50, LVCFMT_RIGHT ); + ctrl.insertColumn( 5, str.loadRsrc(IDS_PATH), 130 ); + + FILETIME ftm; + SYSTEMTIME stm; + + //-- アイテム + for( unsigned int i=0,k=0; i!=m_files.len(); i++ ) + if( m_files[i].isfile ) + { +#define usiz (m_files[i].inf.dwOriginalSize) +#define csiz (m_files[i].inf.dwCompressedSize) +#define method (m_files[i].inf.szMode) +#define date (m_files[i].inf.wDate) +#define time (m_files[i].inf.wTime) + path = m_files[i].inf.szFileName; + + // ファイル名 + ctrl.insertItem( k, path.name(), + (LPARAM)(&m_files[i]), kiSUtil::getSysIcon(path.ext()) ); + + // サイズ + if( usiz == 0xffffffff ) + ctrl.setSubItem( k, 1, "????" ); + else + ctrl.setSubItem( k, 1, str.setInt( usiz,true ) ); + + // 時間 + if( ::DosDateTimeToFileTime( date, time, &ftm ) + && ::FileTimeToSystemTime( &ftm, &stm ) ) + { + *cstr=0; + ::GetDateFormat( LOCALE_USER_DEFAULT, 0, &stm, + "yy/MM/dd", cstr, sizeof(cstr) ); + str=cstr; + ::GetTimeFormat( LOCALE_USER_DEFAULT, 0, &stm, + " HH:mm", cstr, sizeof(cstr) ); + str+=cstr; + ctrl.setSubItem( k, 2, str ); + } + + // 圧縮率 + filesize_sum += usiz; + if( usiz==0 ) ctrl.setSubItem( k, 3, "100%" ); + else if( csiz==0 ) ctrl.setSubItem( k, 3, "????" ); + else ctrl.setSubItem( k, 3, str.setInt( (int)(((__int64)csiz)*100/usiz) )+='%' ); + + // メソッド + ctrl.setSubItem( k, 4, method ); + + // パス + path.beDirOnly(); + ctrl.setSubItem( k, 5, path ); + + k++; + +#undef usiz +#undef csiz +#undef method +#undef date +#undef time + } + + //-- ドラッグ&ドロップフォーマット登録 + FORMATETC fmt; + fmt.cfFormat = CF_HDROP; + fmt.ptd = NULL; + fmt.dwAspect = DVASPECT_CONTENT; + fmt.lindex = -1; + fmt.tymed = TYMED_HGLOBAL; + addFormat( fmt ); + } + + //-- 情報 -- + char tmp[255]; + kiStr full_filename = m_fname.basedir + m_fname.lname; + __int64 filesize_arc = kiFile::getSize64(full_filename); + if( filesize_sum==0 ) filesize_sum = 1; + wsprintf( tmp, kiStr().loadRsrc(IDS_ARCVIEW_MSG), + m_files.len(), + (int)(filesize_arc*100 / filesize_sum), + (const char*)m_pArc->arctype_name(full_filename) + ); + sendMsgToItem( IDC_STATUSBAR, WM_SETTEXT, 0, (long)tmp ); + + if( !m_bAble ) + { + static const UINT items[] = { IDC_SELECTINV,IDC_REF,IDC_MELTEACH,IDC_SHOW,IDC_DDIR }; + for( int i=0; i!=sizeof(items)/sizeof(UINT); i++ ) + ::EnableWindow( item(items[i]), FALSE ); + } + + return FALSE; +} + +bool CArcViewDlg::onOK() +{ + setdir(); + m_pArc->melt( m_fname, m_ddir ); + myapp().open_folder( m_ddir, 1 ); + kiSUtil::switchCurDirToExeDir(); // 念のため + return onCancel(); +} + +bool CArcViewDlg::onCancel() +{ + ::SetCurrentDirectory( m_fname.basedir ); + m_tdir.remove(); + if( kiSUtil::exist(m_tdir) ) + { + kiStr tmp(600); + if( IDNO==app()->msgBox( tmp.loadRsrc(IDS_EXECUTING), NULL, MB_YESNO|MB_DEFBUTTON2 ) ) + return false; + } + + kiListView(this,IDC_FILELIST).setImageList( NULL, NULL ); + byebye(); + return true; +} + +bool CArcViewDlg::giveData( const FORMATETC& fmt, STGMEDIUM* stg, bool firstcall ) +{ + if( firstcall ) + if( 0x8000<=m_pArc->melt( m_fname, m_tdir, &m_files ) ) + return false; + + unsigned int i; + BOOL fWide = (app()->osver().dwPlatformId==VER_PLATFORM_WIN32_NT); + kiArray lst; + kiPath tmp; + int flen = 0; + wchar_t wbuf[600]; + + for( i=0; i!=m_files.len(); i++ ) + if( m_files[i].selected ) + { + tmp = m_tdir; + tmp += m_files[i].inf.szFileName; + + lst.add( tmp ); + if( fWide ) + flen += (::MultiByteToWideChar( CP_ACP, 0, tmp, -1, wbuf, 600 )+1)*2; + else + flen += (tmp.len()+1); + } + + HDROP hDrop = (HDROP)::GlobalAlloc( GHND, sizeof(DROPFILES)+flen+1 ); + + DROPFILES* dr = (DROPFILES*)::GlobalLock( hDrop ); + dr->pFiles = sizeof(DROPFILES); + dr->pt.x = dr->pt.y = 0; + dr->fNC = FALSE; + dr->fWide = fWide; + + char* buf = (char*)(&dr[1]); + for( i=0; i!=lst.len(); i++ ) + { + if( fWide ) + { + flen = ::MultiByteToWideChar( CP_ACP, 0, lst[i], -1, wbuf, 600 ); + ki_memcpy( buf, wbuf, flen*2 ); + for( int k=0; k!=flen; k++ ) + if( ((wchar_t*)buf)[k] == '/' ) + ((wchar_t*)buf)[k] = '\\'; + buf += flen*2; + } + else + { + ki_strcpy( buf,lst[i] ); + for( int k=0; k!=lst[i].len(); k++ ) + if( buf[k] == '/' ) + buf[k] = '\\'; + buf += lst[i].len() + 1; + } + } + *buf=0; + if( fWide ) + buf[1]='\0'; + + ::GlobalUnlock( hDrop ); + + stg->hGlobal = hDrop; + stg->tymed = TYMED_HGLOBAL; + stg->pUnkForRelease = NULL; + return true; +} + +BOOL CALLBACK CArcViewDlg::proc( UINT msg, WPARAM wp, LPARAM lp ) +{ + switch( msg ) + { + //-- メインウインドウ指定 --------------------- + case WM_ACTIVATE: + if( LOWORD(wp)==WA_ACTIVE || LOWORD(wp)==WA_CLICKACTIVE ) + { + app()->setMainWnd( this ); + return TRUE; + } + break; + + //-- リサイズ関連の処理 --------------------- + case WM_GETMINMAXINFO: + { + RECT self,child; + ::GetWindowRect( hwnd(), &self ); + ::GetWindowRect( item(IDC_REF), &child ); + POINT& sz = ((MINMAXINFO*)lp)->ptMinTrackSize; + sz.x = child.right - self.left + 18; + sz.y = child.bottom - self.top + 100; + } + return TRUE; + case WM_SIZE: + if( wp!=SIZE_MAXHIDE && wp!=SIZE_MINIMIZED ) + { + RECT self,ref,child,sbar; + ::GetWindowRect( hwnd(), &self ); + ::GetWindowRect( item(IDC_REF), &ref ); + ::GetWindowRect( item(IDC_FILELIST), &child ); + ::GetClientRect( item(IDC_STATUSBAR), &sbar ); + + ::SetWindowPos( item(IDC_FILELIST), NULL, 0, 0, + LOWORD(lp), + (self.bottom-ref.bottom)-(child.top-ref.bottom) + -(sbar.bottom-sbar.top)-10, + SWP_NOMOVE|SWP_NOOWNERZORDER|SWP_NOZORDER ); + + ::GetClientRect( hwnd(), &self ); + ::SetWindowPos( item(IDC_STATUSBAR), NULL, sbar.left, + self.bottom - (sbar.bottom-sbar.top), + 0, 0, SWP_NOSIZE|SWP_NOOWNERZORDER|SWP_NOZORDER ); + } + break; + + case WM_NOTIFY: + if( wp==IDC_FILELIST && m_bAble ) + { + NMHDR* phdr=(NMHDR*)lp; + if( phdr->code==LVN_BEGINDRAG || phdr->code==LVN_BEGINRDRAG ) + { + if( setSelection() ) + kiDropSource::DnD( this, DROPEFFECT_COPY ); + return TRUE; + } + else if( phdr->code==LVN_COLUMNCLICK ) + DoSort( ((NMLISTVIEW*)lp)->iSubItem ); + else if( phdr->code==NM_DBLCLK ) + sendMsg( WM_COMMAND, IDC_SHOW ); + else if( phdr->code==NM_RCLICK ) + { + if( setSelection() ) + DoRMenu(); + } + } + break; + + case WM_COMMAND: + switch( LOWORD(wp) ) + { + case IDC_SELECTINV: // 選択反転 + { + LVITEM item; + item.mask = LVIF_STATE; + item.stateMask = LVIS_SELECTED; + int j,m=sendMsgToItem( IDC_FILELIST, LVM_GETITEMCOUNT ); + for( j=0; j!=m; j++ ) + { + item.state = ~sendMsgToItem( IDC_FILELIST, LVM_GETITEMSTATE, j, LVIS_SELECTED ); + sendMsgToItem( IDC_FILELIST, LVM_SETITEMSTATE, j, (LPARAM)&item ); + } + ::SetFocus( this->item(IDC_FILELIST) ); + } + return TRUE; + + case IDC_REF: // 解凍先設定 + kiSUtil::getFolderDlgOfEditBox( item(IDC_DDIR), hwnd(), kiStr().loadRsrc(IDS_CHOOSEDIR) ); + return TRUE; + + case IDC_MELTEACH: // 一部解凍 + if( setSelection() ) + { + setdir(); + int result = m_pArc->melt( m_fname, m_ddir, &m_files ); + if( result<0x8000 ) + myapp().open_folder( m_ddir, 1 ); + else if( result != 0x8020 ) + { + char str[255]; + wsprintf( str, "%s\nError No: [%x]", + (const char*)kiStr().loadRsrc( IDS_M_ERROR ), result ); + app()->msgBox( str ); + } + kiSUtil::switchCurDirToExeDir(); // 念のため + } + return TRUE; + + case IDC_SHOW: // 表示 + if( setSelection() ) + { + int assocCnt = hlp_cnt_check(); + if( 0x8000 > m_pArc->melt( m_fname, m_tdir, &m_files ) ) + { + if( assocCnt != -1 ) + m_files[assocCnt].selected = false; + for( unsigned i=0; i!=m_files.len(); i++ ) + if( m_files[i].selected ) + { + kiPath tmp(m_tdir); + char yen[MAX_PATH]; + ki_strcpy( yen, m_files[i].inf.szFileName ); + for( char* p=yen; *p; p=kiStr::next(p) ) + if( *p=='/' ) + *p = '\\'; + tmp += yen; + ::ShellExecute( hwnd(), NULL, tmp, NULL, m_tdir, SW_SHOWDEFAULT ); + } + } + kiSUtil::switchCurDirToExeDir(); // 念のため + } + return TRUE; + } + } + return FALSE; +} + +int CArcViewDlg::hlp_cnt_check() +{ + // 一個目の選択済みファイルが .hlp か否か + for( unsigned i=0; i!=m_files.len(); i++ ) + if( m_files[i].selected ) + break; + if( i==m_files.len() ) + return -1; + int x = kiPath::ext(m_files[i].inf.szFileName)-m_files[i].inf.szFileName; + if( 0!=ki_strcmpi( "hlp", m_files[i].inf.szFileName+x ) ) + return -1; + + // .cnt のファイル名 + char cntpath[FNAME_MAX32]; + ki_strcpy( cntpath, m_files[i].inf.szFileName ); + cntpath[x]='c', cntpath[x+1]='n', cntpath[x+2]='t'; + + // .cntも一時的に選択する + for( i=0; i!=m_files.len(); i++ ) + if( 0==ki_strcmpi( cntpath, m_files[i].inf.szFileName ) ) + { + if( m_files[i].selected ) + return -1; + m_files[i].selected = true; + return i; + } + return -1; +} + +int CALLBACK CArcViewDlg::lv_compare( LPARAM p1, LPARAM p2, LPARAM type ) +{ + bool rev = false; + if( type>=10000 ) + rev=true, type-=10000; + int ans = 0; + + INDIVIDUALINFO *a1=&((arcfile*)p1)->inf, *a2=&((arcfile*)p2)->inf; + switch( type ) + { + case 0: //NAME + ans = ::lstrcmp( kiPath::name(a1->szFileName), + kiPath::name(a2->szFileName) ); + break; + case 1: //SIZE + ans = (signed)a1->dwOriginalSize - (signed)a2->dwOriginalSize; + break; + case 2: //DATE,TIME + ans = (signed)a1->wDate - (signed)a2->wDate; + if( ans==0 ) + ans = (signed)a1->wTime - (signed)a2->wTime; + break; + case 3:{//RATIO + int cr1, cr2; + if( a1->dwOriginalSize==0 ) cr1=100; + else if( a1->dwCompressedSize==0 ) cr1=-1; + else cr1 = (a1->dwCompressedSize*100)/(a1->dwOriginalSize); + if( a2->dwOriginalSize==0 ) cr2=100; + else if( a2->dwCompressedSize==0 ) cr2=-1; + else cr2 = (int)((((__int64)a2->dwCompressedSize)*100)/(a2->dwOriginalSize)); + ans = cr1 - cr2; + }break; + case 4: //METHOD + ans = ::lstrcmp( a1->szMode, a2->szMode ); + break; + case 5:{//PATH + kiPath pt1(a1->szFileName), pt2(a2->szFileName); + pt1.beDirOnly(), pt2.beDirOnly(); + ans = ::lstrcmp( pt1, pt2 ); + }break; + } + + return rev ? -ans : ans; +} + +void CArcViewDlg::DoSort( int col ) +{ + WPARAM p = col + (m_bSmallFirst[col] ? 0 : 10000); + sendMsgToItem( IDC_FILELIST, LVM_SORTITEMS, p, (LPARAM)lv_compare ); + m_bSmallFirst[col] = !m_bSmallFirst[col]; +} + +void CArcViewDlg::GenerateDirMenu( HMENU m, int& id, StrArray* sx, const kiPath& pth ) +{ + // フォルダ内リストアップ + kiFindFile ff; + ff.begin( kiPath(pth)+="*" ); + for( WIN32_FIND_DATA fd; ff.next(&fd); ) + if( fd.cFileName[0]!='.' + && !(fd.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) ) + { + kiPath fullpath(pth); fullpath+=fd.cFileName; + const int pID=id; + MENUITEMINFO mi = { sizeof(MENUITEMINFO) }; + + if( fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) + { + // 再帰的に + mi.fMask = MIIM_SUBMENU | 0x00000040;// (MIIM_STRING) + mi.hSubMenu = ::CreatePopupMenu(); + GenerateDirMenu( mi.hSubMenu, id, sx, + kiPath(kiPath(fullpath)+="\\") ); + } + else + { + const char* ext = kiPath::ext(fd.cFileName); + if( ::lstrlen(ext) > 4 ) continue; + if( 0==::lstrcmpi(ext,"lnk") ) + *const_cast(ext-1) = '\0'; + mi.fMask = MIIM_ID | 0x00000040;// (MIIM_STRING) + mi.wID = id++; + sx->add( fullpath ); + } + + mi.dwTypeData = const_cast((const char*)fd.cFileName); + mi.cch = ::lstrlen(fd.cFileName); + ::InsertMenuItem( m, pID, FALSE, &mi ); + } +} + +void CArcViewDlg::DoRMenu() +{ + // メニュー作成 + HMENU m = ::CreatePopupMenu(); + POINT pt; ::GetCursorPos( &pt ); + const int IDSTART = 128; + + // フォルダの中身をリストアップしつつメニューに追加 + int id = IDSTART; + StrArray lst; + GenerateDirMenu( m, id, &lst, kiPath(CSIDL_SENDTO) ); + + // メニュー表示 + id = ::TrackPopupMenu( m, + TPM_LEFTALIGN|TPM_TOPALIGN|TPM_RETURNCMD|TPM_NONOTIFY, + pt.x, pt.y, 0, hwnd(), NULL ); + ::DestroyMenu( m ); + + // 結果処理 + if( id != 0 ) + { + kiStr cmd; + if( 0x8000>m_pArc->melt( m_fname, m_tdir, &m_files ) ) + { + for( UINT i=0; i!=m_files.len(); i++ ) + if( m_files[i].selected ) + { + cmd += "\""; + cmd += m_tdir; + const char* buf = m_files[i].inf.szFileName; + for( int k=0; buf[k]; ++k ) + cmd += ( buf[k]=='/' ? '\\' : buf[k] ); + cmd += "\" "; + } + ShellExecute(hwnd(),NULL,lst[id-IDSTART],cmd,NULL,SW_SHOW); + } + } +} + ADDED SubDlg.h Index: SubDlg.h ================================================================== --- SubDlg.h +++ SubDlg.h @@ -0,0 +1,201 @@ +#ifndef AFX_ARCVIEWDLG_H__91EDF9F6_142E_4E25_BCE3_448E937E29D9__INCLUDED_ +#define AFX_ARCVIEWDLG_H__91EDF9F6_142E_4E25_BCE3_448E937E29D9__INCLUDED_ + +#include "NoahApp.h" +#include "Archiver.h" +#include "resource.h" + +class CArcViewDlg : public kiDialog, kiDataObject +{ +public: + CArcViewDlg( CArchiver* ptr,arcname& fnm,const kiPath& ddir ) + : kiDialog( IDD_ARCVIEW ), m_pArc( ptr ), + m_fname( fnm ), m_ddir( ddir ) + { + AddRef(); + myapp().get_tempdir( m_tdir ); + } + +private: //-- ダイアログとしての処理 + + BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ); + BOOL onInit(); + bool onOK(); + bool onCancel(); + void setdir() + { + char str[MAX_PATH]; + sendMsgToItem( IDC_DDIR, WM_GETTEXT, MAX_PATH, (LPARAM)str ); + m_ddir = str; + m_ddir.beBackSlash( true ); + m_ddir.mkdir(); + m_ddir.beShortPath(); + } + bool setSelection() + { + bool x=false; + LVITEM it; + it.mask = (LVIF_PARAM | LVIF_STATE); + it.iSubItem = 0; + it.stateMask = LVIS_SELECTED; + for( it.iItem=0; sendMsgToItem( IDC_FILELIST, LVM_GETITEM, 0, (LPARAM)&it ); it.iItem++ ) + if( ((arcfile*)it.lParam)->selected = (0!=(LVIS_SELECTED&it.state)) ) + x = true; + return x; + } + int hlp_cnt_check(); + bool m_bAble; + +private: //-- ドラッグ&ドロップ処理 + + bool giveData( const FORMATETC& fmt, STGMEDIUM* stg, bool firstcall ); + +private: //-- ソート処理 + + void DoSort( int col ); + static int CALLBACK lv_compare( LPARAM p1, LPARAM p2, LPARAM type ); + bool m_bSmallFirst[6]; + +private: //-- 右クリック + + void DoRMenu(); + void GenerateDirMenu( HMENU m, int& id, StrArray* sx, const kiPath& pth ); + +private: //-- 解凍作業 + + CArchiver* m_pArc; + arcname m_fname; + kiPath m_ddir, m_tdir; + aflArray m_files; + +//-- 存在しているウインドウ数管理。 +public: static void clear() { st_nLife=0; } +private:static void hello() { st_nLife++; } + static void byebye() { if(--st_nLife==0) kiWindow::loopbreak(); } + static int st_nLife; +}; + + +class CArcPwdDlg : public kiDialog +{ + char *buf; + const char *nam; + int siz; +public: + CArcPwdDlg( HWND h, char* x, int s, const char* n ) : kiDialog( IDD_PASSWORD ), buf(x), siz(s), nam(n) + { + doModal( h ); + } + BOOL onInit() + { + sendMsgToItem( IDC_MASK, BM_SETCHECK, BST_CHECKED ); + sendMsgToItem( IDC_EDIT, EM_SETLIMITTEXT, siz ); + sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR, '*' ); + sendMsg( WM_SETTEXT, 0, (LPARAM)nam ); + ::SetFocus( item(IDC_EDIT) ); + return TRUE; + } + BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) + { + if( msg==WM_COMMAND && LOWORD(wp)==IDC_MASK ) + { + if( BST_CHECKED==sendMsgToItem( IDC_MASK, BM_GETCHECK ) ) + sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR, '*' ); + else + sendMsgToItem( IDC_EDIT, EM_SETPASSWORDCHAR ); + ::InvalidateRect( item(IDC_EDIT), NULL, TRUE ); + } + return FALSE; + } + bool onOK() + { + sendMsgToItem( IDC_EDIT, WM_GETTEXT, siz, (LPARAM)buf ); + return true; + } +}; + +class CArcProgressDlg : public kiDialog +{ + unsigned int bl; +public: + CArcProgressDlg( unsigned int barlimit, bool packing=false ) + : kiDialog( IDD_PROGRESS ), bl( barlimit ) + { + createModeless(); + if( bl<0x10000 ) + sendMsgToItem( IDC_BAR, PBM_SETRANGE, 0, MAKELPARAM(0,bl) ); + if( packing ) + sendMsg( WM_SETTEXT, 0, (LPARAM)"Compressing..." ); + kiWindow::setFront( hwnd() ); + msgloop(); + } + ~CArcProgressDlg() + { + if( isAlive() ) + end( IDCANCEL ); + } + bool msgloop() + { + kiWindow::msg(); + return isAlive(); + } + void change( const char* name=NULL, unsigned int pos=0xffffffff ) + { + if( name ) sendMsgToItem( IDC_FNAME, WM_SETTEXT, 0, (LPARAM)name ); + if( pos!=0xffffffff ) + if( bl<0x10000 )sendMsgToItem( IDC_BAR, PBM_SETPOS, pos ); + else sendMsgToItem( IDC_BAR, PBM_SETPOS, pos*100/bl ); + } +}; + + +class CArcPathCheckDlg +{ +private: + class TheDlg : public kiDialog + { + public: + TheDlg( const char* path, HWND h ) + : kiDialog(IDD_PATHCHECK), result(CANCEL), path(path) { doModal(h); } + enum { YES, ALL_YES, CANCEL } result; + private: + const char* path; + BOOL onInit() + { + sendMsgToItem( IDC_PATHNAME, WM_SETTEXT, 0, (LPARAM)path ); + return TRUE; + } + BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) + { + if( msg==WM_COMMAND ) + switch( LOWORD(wp) ) + { + case IDYES: result = YES; end(IDOK); return TRUE; + case ID_ALLYES: result = ALL_YES; end(IDOK); return TRUE; + case ID_ALLNO: result = CANCEL; end(IDCANCEL); return TRUE; + } + return FALSE; + } + }; + +private: + bool all_yes; + +public: + CArcPathCheckDlg() : all_yes(false) {} + + bool is_ok_to_extract( const char* path, kiWindow* wnd ) + { + if( all_yes ) + return true; + switch( TheDlg(path,wnd?wnd->hwnd():NULL).result ) + { + case TheDlg::ALL_YES: all_yes = true; + case TheDlg::YES: return true; + } + return false; + } +}; + + +#endif ADDED b2e.ico Index: b2e.ico ================================================================== --- b2e.ico +++ b2e.ico cannot compute difference between binary files ADDED kilib/kilib.h Index: kilib/kilib.h ================================================================== --- kilib/kilib.h +++ kilib/kilib.h @@ -0,0 +1,27 @@ +//--- K.I.LIB --- +// kilib.h : main-header of K.I.LIB + +#ifndef AFX_KILIB_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ +#define AFX_KILIB_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ + +#include "kl_str.h" +#include "kl_misc.h" +#include "kl_cmd.h" +#include "kl_wnd.h" +#include "kl_file.h" +#include "kl_app.h" +#include "kl_reg.h" +#include "kl_find.h" +#include "kl_wcmn.h" +#include "kl_dnd.h" + +extern kiApp* app(); +extern void kilib_create_new_app(); + +#ifdef KILIB_LOG +#define Log(_s_) app()->log((const char*)(_s_)) +#else +#define Log(_s_) +#endif + +#endif ADDED kilib/kilibext.h Index: kilib/kilibext.h ================================================================== --- kilib/kilibext.h +++ kilib/kilibext.h @@ -0,0 +1,11 @@ +//--- K.I.LIB --- +// kilibext.h : extra-classes of K.I.LIB + +#ifndef AFX_KILIBEXT_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ +#define AFX_KILIBEXT_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ + +#include "kilib.h" +#include "kl_carc.h" +#include "kl_rythp.h" + +#endif ADDED kilib/kl_app.cpp Index: kilib/kl_app.cpp ================================================================== --- kilib/kl_app.cpp +++ kilib/kl_app.cpp @@ -0,0 +1,77 @@ +//--- K.I.LIB --- +// kl_app.h : application class for K.I.LIB + +#include "stdafx.h" +#include "kilib.h" + +//------------ 唯一のアプリケーションオブジェクトの管理 ------------// + +kiApp* kiApp::st_pApp = NULL; + +kiApp* app() +{ + return kiApp::st_pApp; +} + +//-------------------- スタートアップコード ------------------------// + +void kilib_startUp() +{ + // 英語ロケールテスト用 + //::SetThreadUILanguage(0x0409); + + //-- K.I.LIB 初期化 + kiStr::init(); + kiWindow::init(); + + //-- キーボード状態クリア + ::GetAsyncKeyState( VK_SHIFT ); + + //-- アプリケーションインスタンスを作成 + kilib_create_new_app(); + if( app() ) + { + // コマンドライン分割 + kiCmdParser cmd( ::GetCommandLine(), true ); + + // 実行 + app()->run( cmd ); + } + + //-- K.I.LIB 終了 + kiWindow::finish(); + + delete app(); + ::ExitProcess( 0 ); +} + +//--------------- C-Runtime初期化コード削除周りの処理 ---------------// + +#if 0 + +int APIENTRY WinMain( HINSTANCE, HINSTANCE, char*, int ) +{ + kilib_startUp(); + return 0; +} + +#else + +void* operator new( size_t siz ) +{ + return (void*)::GlobalAlloc( GMEM_FIXED, siz ); +} + +void operator delete( void* ptr ) +{ + ::GlobalFree( (HGLOBAL)ptr ); +} + +void main() +{ + // main がないと何故か libc.lib がリンクエラーになるのでダミー +} + +#endif + +//--------------------------------------------------------------// ADDED kilib/kl_app.h Index: kilib/kl_app.h ================================================================== --- kilib/kl_app.h +++ kilib/kl_app.h @@ -0,0 +1,125 @@ +//--- K.I.LIB --- +// kl_app.h : application class for K.I.LIB + +#ifndef AFX_KIAPP_H__AC24C8AF_2187_4873_83E8_AB4F2325017B__INCLUDED_ +#define AFX_KIAPP_H__AC24C8AF_2187_4873_83E8_AB4F2325017B__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// 汎用アプリケーションクラス + +class kiApp +{ +friend kiApp* app(); +friend void kilib_startUp(); + +public: //-- 外向きインターフェイス -------------------------- + + // インスタンス + HINSTANCE inst() const + { + return m_hInst; + } + + // メインウインドウ + HWND mainhwnd() const + { + return m_pMainWnd ? m_pMainWnd->hwnd() : NULL; + } + kiWindow* mainwnd() const + { + return m_pMainWnd; + } + void setMainWnd( kiWindow* wnd ) + { + m_pMainWnd = wnd; + } + + // OSバージョン + const OSVERSIONINFO& osver() const + { + return m_OsVer; + } + + // メッセージボックス + int msgBox( const char* msg, const char* caption=NULL, UINT type=MB_OK ) + { + return ::MessageBox( mainhwnd(), msg, caption, type ); + } + + // シェルのアロケータでメモリ解放 + void shellFree( void* ptr ) const + { + m_pShellAlloc->Free( ptr ); + } + + // 仮想コード vKey のキーは押されているか? + static bool keyPushed( int vKey ) + { + return( 0!=(::GetAsyncKeyState( vKey )>>15) ); + } + + // CommonControl / OLE 初期化 + void shellInit() + { + if( !m_bShellInit ) + { + ::InitCommonControls(); + ::OleInitialize( NULL ); + m_bShellInit = true; + } + } + +#ifdef KILIB_LOG + void log( const char* str ) + { + if( !m_log.isOpened() ) + { + kiPath logtxt( kiPath::Exe ); logtxt += "log.txt"; + m_log.open( logtxt, false ); + } + m_log.write( str, ki_strlen(str) ); + m_log.write( "\r\n", 2 ); + } +#endif + +protected: //-- 派生クラス向け ----------------------------- + + // 起動時に呼ばれる関数。必須。 + virtual void run( kiCmdParser& cmd ) = 0; + +protected: //-- 内部処理 ----------------------------------- + + kiApp() + { + st_pApp = this; + m_hInst = ::GetModuleHandle( NULL ); + m_pMainWnd = NULL; + m_bShellInit = false; + m_OsVer.dwOSVersionInfoSize = sizeof( m_OsVer ); + ::GetVersionEx( &m_OsVer ); + ::SHGetMalloc( &m_pShellAlloc ); + } + +protected: + + virtual ~kiApp() + { + m_pShellAlloc->Release(); + if( m_bShellInit ) + ::OleUninitialize(); + } + +private: + + HINSTANCE m_hInst; + IMalloc* m_pShellAlloc; + bool m_bShellInit; + OSVERSIONINFO m_OsVer; + kiWindow* m_pMainWnd; + static kiApp* st_pApp; +#ifdef KILIB_LOG + kiFile m_log; +#endif +}; + +#endif ADDED kilib/kl_carc.cpp Index: kilib/kl_carc.cpp ================================================================== --- kilib/kl_carc.cpp +++ kilib/kl_carc.cpp @@ -0,0 +1,245 @@ +//--- K.I.LIB --- +// kl_carc.cpp : handling "common archivers' dll" + +#include "stdafx.h" +#include "kilibext.h" + + +//------------------------ load/unload 制御 ----------------------// + + +kiArcDLLRaw::kiArcDLLRaw( const char* dllname ) + : m_DllPath( dllname ), not_loaded_yet( true ) +{ + ki_memzero( m_Proc, ISARC_FUNCTION_END*sizeof(FARPROC) ); + f_VSb = NULL; +} + +kiArcDLLRaw::~kiArcDLLRaw() +{ + unload(); +} + +bool kiArcDLLRaw::load() +{ + not_loaded_yet = false; + + m_hDLL = kiSUtil::loadLibrary( m_DllPath ); + if( !m_hDLL ) + return false; + + // DLLの名前部分を切り出し + char str[MAX_PATH], *p; + const char *x, *y, *z; + for( x=y=m_DllPath; *x!='\0'; x=kiStr::next(x) ) + if( *x=='\\' || *x=='/' ) + y = x + 1; + for( p=str, z=y; (*z!='.' && *z!='3' && *z!='\0'); p++, z++ ) + *p = *z; + *p = '\0'; + + // コマンド送りAPIを取得。ccで始まるAPI名かも? + f_Cmd = ::GetProcAddress( m_hDLL, str ); + if( f_Cmd ) + m_DllNameBody = str; + else + { + f_Cmd = ::GetProcAddress( m_hDLL, "ccCommand" ); + if( f_Cmd ) + m_DllNameBody = "cc"; + else + { + if( str[0]=='7' && (f_Cmd=::GetProcAddress(m_hDLL,"SevenZip")) ) + m_DllNameBody = "SevenZip"; + else + return false; + } + } + + return true; +} + +void kiArcDLLRaw::unload() +{ + if( !not_loaded_yet && m_hDLL ) + { + ki_memzero( m_Proc, ISARC_FUNCTION_END*sizeof(FARPROC) ); + ::FreeLibrary( m_hDLL ); + not_loaded_yet = true; + } +} + +bool kiArcDLLRaw::isAlive() +{ + if( not_loaded_yet ) + load(); + + return (m_hDLL != NULL); +} + +FARPROC kiArcDLLRaw::getProc( const char* procname ) +{ + kiStr funcName = (const char*)m_DllNameBody; + funcName += procname; + return ::GetProcAddress( m_hDLL, funcName ); +} + +//----------------------------- APIのラッパ群 --------------------------// + + +int kiArcDLLRaw::command( const HWND wnd, LPCSTR cmd, LPSTR buf, const DWORD siz ) +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + // コマンド関数は必ずロードされている + + typedef int (WINAPI * CARC_CMD)(const HWND,const char*,char*,const DWORD); + return ((CARC_CMD)f_Cmd)( wnd, cmd, buf, siz ); +} + +WORD kiArcDLLRaw::getVer() +{ + if( not_loaded_yet ) + if( !load() ) + return 0; + + if( !f_Ver ) + f_Ver = getProc( "GetVersion" ); + + typedef WORD (WINAPI * CARC_VER)(void); + return f_Ver ? ((CARC_VER)f_Ver)() : 0; +} + +WORD kiArcDLLRaw::getVerSub() +{ + if( not_loaded_yet ) + if( !load() ) + return 0; + + if( !f_VSb ) + f_VSb = getProc( "GetSubVersion" ); + + typedef WORD (WINAPI * CARC_VER)(void); + return f_VSb ? ((CARC_VER)f_VSb)() : 0; +} + +BOOL kiArcDLLRaw::check( LPCSTR filename, const int mode ) +{ + if( not_loaded_yet ) + if( !load() ) + return FALSE; + + if( !f_Chk ) + f_Chk = getProc( "CheckArchive" ); + + typedef BOOL (WINAPI * CARC_CHK)(const char*,const int); + return f_Chk ? ((CARC_CHK)f_Chk)( filename, mode ) : FALSE; +} + +int kiArcDLLRaw::getArcType( LPCSTR filename ) +{ + if( not_loaded_yet ) + if( !load() ) + return FALSE; + + if( !f_Gat ) + f_Gat = getProc( "GetArchiveType" ); + + typedef BOOL (WINAPI * CARC_GAT)(const char*); + return f_Gat ? ((CARC_GAT)f_Gat)( filename ) : 0; +} + +HARC kiArcDLLRaw::openArc( const HWND wnd, LPCSTR arcname, const DWORD flag ) +{ + if( not_loaded_yet ) + if( !load() ) + return NULL; + + if( !f_Opn ) + f_Opn = getProc( "OpenArchive" ); + + typedef HARC (WINAPI * CARC_OPN)(const HWND,LPCSTR,const DWORD); + return f_Opn ? ((CARC_OPN)f_Opn)( wnd, arcname, flag ) : NULL; +} + +void kiArcDLLRaw::closeArc( HARC arc ) +{ + if( not_loaded_yet ) + if( !load() ) + return; + + if( !f_Cls ) + f_Cls = getProc( "CloseArchive" ); + + typedef int (WINAPI * CARC_CLS)(HARC); + if( f_Cls ) + ((CARC_CLS)f_Cls)( arc ); +} + +int kiArcDLLRaw::findfirst( HARC arc, LPCSTR wildname, INDIVIDUALINFO* inf ) +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + if( !f_Ffs ) + f_Ffs = getProc( "FindFirst" ); + + typedef int (WINAPI * CARC_FFS)(HARC,LPCSTR,INDIVIDUALINFO FAR *); + return f_Ffs ? ((CARC_FFS)f_Ffs)( arc, wildname, inf ) : ERROR_NOT_SUPPORT; +} + +int kiArcDLLRaw::findnext( HARC arc, INDIVIDUALINFO* inf ) +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + if( !f_Fnx ) + f_Fnx = getProc( "FindNext" ); + + typedef int (WINAPI * CARC_FNX)(HARC,INDIVIDUALINFO FAR *); + return f_Fnx ? ((CARC_FNX)f_Fnx)( arc, inf ) : ERROR_NOT_SUPPORT; +} + +int kiArcDLLRaw::getAttr( HARC arc ) +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + if( !f_GAr ) + f_GAr = getProc( "GetAttribute" ); + + typedef int (WINAPI * CARC_GAR)(HARC); + return f_GAr ? ((CARC_GAR)f_GAr)( arc ) : 0; +} + +BOOL kiArcDLLRaw::setOwner( HWND wnd ) +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + if( !f_SOw ) + f_SOw = getProc( "SetOwnerWindow" ); + + typedef BOOL (WINAPI * CARC_SOW)(HWND); + return f_SOw ? ((CARC_SOW)f_SOw)( wnd ) : FALSE; +} + +BOOL kiArcDLLRaw::clearOwner() +{ + if( not_loaded_yet ) + if( !load() ) + return ERROR_NOT_SUPPORT; + + if( !f_COw ) + f_COw = getProc( "ClearOwnerWindow" ); + + typedef BOOL (WINAPI * CARC_COW)(); + return f_COw ? ((CARC_COW)f_COw)() : FALSE; +} + ADDED kilib/kl_carc.h Index: kilib/kl_carc.h ================================================================== --- kilib/kl_carc.h +++ kilib/kl_carc.h @@ -0,0 +1,372 @@ +//--- K.I.LIB --- +// kl_carc.h : handling "common archivers' dll" + +#ifndef AFX_KIARCDLLRAW_H__C94DE2A0_4292_49CE_8471_2CAA1340D216__INCLUDED_ +#define AFX_KIARCDLLRAW_H__C94DE2A0_4292_49CE_8471_2CAA1340D216__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// 統合アーカイバDLL共通の定義 + +// FNAME_MAX +#if !defined(FNAME_MAX32) +#define FNAME_MAX32 512 +#define FNAME_MAX FNAME_MAX32 +#else +#if !defined(FNAME_MAX) +#define FNAME_MAX 128 +#endif +#endif + +// CHECKARCHIVE +#if !defined(CHECKARCHIVE_RAPID) +#define CHECKARCHIVE_RAPID 0 +#define CHECKARCHIVE_BASIC 1 +#define CHECKARCHIVE_FULLCRC 2 +#endif + +// ISARC +#if !defined(ISARC_FUNCTION_START) +#define ISARC_FUNCTION_START 0 +#define ISARC 0 +#define ISARC_GET_VERSION 1 +#define ISARC_GET_CURSOR_INTERVAL 2 +#define ISARC_SET_CURSOR_INTERVAL 3 +#define ISARC_GET_BACK_GROUND_MODE 4 +#define ISARC_SET_BACK_GROUND_MODE 5 +#define ISARC_GET_CURSOR_MODE 6 +#define ISARC_SET_CURSOR_MODE 7 +#define ISARC_GET_RUNNING 8 + +#define ISARC_CHECK_ARCHIVE 16 +#define ISARC_CONFIG_DIALOG 17 +#define ISARC_GET_FILE_COUNT 18 +#define ISARC_QUERY_FUNCTION_LIST 19 +#define ISARC_HOUT 20 +#define ISARC_STRUCTOUT 21 +#define ISARC_GET_ARC_FILE_INFO 22 + +#define ISARC_OPEN_ARCHIVE 23 +#define ISARC_CLOSE_ARCHIVE 24 +#define ISARC_FIND_FIRST 25 +#define ISARC_FIND_NEXT 26 +#define ISARC_EXTRACT 27 +#define ISARC_ADD 28 +#define ISARC_MOVE 29 +#define ISARC_DELETE 30 +#define ISARC_SETOWNERWINDOW 31 +#define ISARC_CLEAROWNERWINDOW 32 +#define ISARC_SETOWNERWINDOWEX 33 +#define ISARC_KILLOWNERWINDOWEX 34 + +#define ISARC_GET_ARC_FILE_NAME 40 +#define ISARC_GET_ARC_FILE_SIZE 41 +#define ISARC_GET_ARC_ORIGINAL_SIZE 42 +#define ISARC_GET_ARC_COMPRESSED_SIZE 43 +#define ISARC_GET_ARC_RATIO 44 +#define ISARC_GET_ARC_DATE 45 +#define ISARC_GET_ARC_TIME 46 +#define ISARC_GET_ARC_OS_TYPE 47 +#define ISARC_GET_ARC_IS_SFX_FILE 48 +#define ISARC_GET_ARC_WRITE_TIME_EX 49 +#define ISARC_GET_ARC_CREATE_TIME_EX 50 +#define ISARC_GET_ARC_ACCESS_TIME_EX 51 +#define ISARC_GET_ARC_CREATE_TIME_EX2 52 +#define ISARC_GET_ARC_WRITE_TIME_EX2 53 +#define ISARC_GET_FILE_NAME 57 +#define ISARC_GET_ORIGINAL_SIZE 58 +#define ISARC_GET_COMPRESSED_SIZE 59 +#define ISARC_GET_RATIO 60 +#define ISARC_GET_DATE 61 +#define ISARC_GET_TIME 62 +#define ISARC_GET_CRC 63 +#define ISARC_GET_ATTRIBUTE 64 +#define ISARC_GET_OS_TYPE 65 +#define ISARC_GET_METHOD 66 +#define ISARC_GET_WRITE_TIME 67 +#define ISARC_GET_CREATE_TIME 68 +#define ISARC_GET_ACCESS_TIME 69 +#define ISARC_GET_WRITE_TIME_EX 70 +#define ISARC_GET_CREATE_TIME_EX 71 +#define ISARC_GET_ACCESS_TIME_EX 72 +#define ISARC_SET_ENUM_MEMBERS_PROC 80 +#define ISARC_CLEAR_ENUM_MEMBERS_PROC 81 + +#define ISARC_FUNCTION_END 81 +#endif + +// ERROR +#if !defined(ERROR_START) +#define ERROR_START 0x8000 + // warning +#define ERROR_DISK_SPACE 0x8005 +#define ERROR_READ_ONLY 0x8006 +#define ERROR_USER_SKIP 0x8007 +#define ERROR_UNKNOWN_TYPE 0x8008 +#define ERROR_METHOD 0x8009 +#define ERROR_PASSWORD_FILE 0x800A +#define ERROR_VERSION 0x800B +#define ERROR_FILE_CRC 0x800C +#define ERROR_FILE_OPEN 0x800D +#define ERROR_MORE_FRESH 0x800E +#define ERROR_NOT_EXIST 0x800F +#define ERROR_ALREADY_EXIST 0x8010 + +#define ERROR_TOO_MANY_FILES 0x8011 + // error +#define ERROR_MAKEDIRECTORY 0x8012 +#define ERROR_CANNOT_WRITE 0x8013 +#define ERROR_HUFFMAN_CODE 0x8014 +#define ERROR_COMMENT_HEADER 0x8015 +#define ERROR_HEADER_CRC 0x8016 +#define ERROR_HEADER_BROKEN 0x8017 +#define ERROR_ARC_FILE_OPEN 0x8018 +#define ERROR_NOT_ARC_FILE 0x8019 +#define ERROR_CANNOT_READ 0x801A +#define ERROR_FILE_STYLE 0x801B +#define ERROR_COMMAND_NAME 0x801C +#define ERROR_MORE_HEAP_MEMORY 0x801D +#define ERROR_ENOUGH_MEMORY 0x801E +#if !defined(ERROR_ALREADY_RUNNING) +#define ERROR_ALREADY_RUNNING 0x801F +#endif +#define ERROR_USER_CANCEL 0x8020 +#define ERROR_HARC_ISNOT_OPENED 0x8021 +#define ERROR_NOT_SEARCH_MODE 0x8022 +#define ERROR_NOT_SUPPORT 0x8023 +#define ERROR_TIME_STAMP 0x8024 +#define ERROR_TMP_OPEN 0x8025 +#define ERROR_LONG_FILE_NAME 0x8026 +#define ERROR_ARC_READ_ONLY 0x8027 +#define ERROR_SAME_NAME_FILE 0x8028 +#define ERROR_NOT_FIND_ARC_FILE 0x8029 +#define ERROR_RESPONSE_READ 0x802A +#define ERROR_NOT_FILENAME 0x802B +#define ERROR_TMP_COPY 0x802C +#define ERROR_EOF 0x802D +#define ERROR_ADD_TO_LARC 0x802E +#define ERROR_TMP_BACK_SPACE 0x802F +#define ERROR_SHARING 0x8030 +#define ERROR_NOT_FIND_FILE 0x8031 +#define ERROR_LOG_FILE 0x8032 +#define ERROR_NO_DEVICE 0x8033 +#define ERROR_GET_ATTRIBUTES 0x8034 +#define ERROR_SET_ATTRIBUTES 0x8035 +#define ERROR_GET_INFORMATION 0x8036 +#define ERROR_GET_POINT 0x8037 +#define ERROR_SET_POINT 0x8038 +#define ERROR_CONVERT_TIME 0x8039 +#define ERROR_GET_TIME 0x803a +#define ERROR_SET_TIME 0x803b +#define ERROR_CLOSE_FILE 0x803c +#define ERROR_HEAP_MEMORY 0x803d +#define ERROR_HANDLE 0x803e +#define ERROR_TIME_STAMP_RANGE 0x803f +#define ERROR_MAKE_ARCHIVE 0x8040 + +#define ERROR_END ERROR_MAKE_ARCHIVE +#define ERROR_BUF_TOO_SMALL 0x8041 /**/ +#endif + +// CONFIG +#if !defined(UNPACK_CONFIG_MODE) +#define UNPACK_CONFIG_MODE 1 +#define PACK_CONFIG_MODE 2 +#endif + +// OPENARCHIVE +#if !defined(EXTRACT_FOUND_FILE) +#define M_INIT_FILE_USE 0x00000001L +#define M_REGARDLESS_INIT_FILE 0x00000002L +#define M_NO_BACKGROUND_MODE 0x00000004L +#define M_NOT_USE_TIME_STAMP 0x00000008L +#define M_EXTRACT_REPLACE_FILE 0x00000010L +#define M_EXTRACT_NEW_FILE 0x00000020L +#define M_EXTRACT_UPDATE_FILE 0x00000040L +#define M_CHECK_ALL_PATH 0x00000100L +#define M_CHECK_FILENAME_ONLY 0x00000200L +#define M_CHECK_DISK_SIZE 0x00000400L +#define M_REGARDLESS_DISK_SIZE 0x00000800L +#define M_USE_DRIVE_LETTER 0x00001000L +#define M_NOT_USE_DRIVE_LETTER 0x00002000L +#define M_INQUIRE_DIRECTORY 0x00004000L +#define M_NOT_INQUIRE_DIRECTORY 0x00008000L +#define M_INQUIRE_WRITE 0x00010000L +#define M_NOT_INQUIRE_WRITE 0x00020000L +#define M_CHECK_READONLY 0x00040000L +#define M_REGARDLESS_READONLY 0x00080000L +#define M_REGARD_E_COMMAND 0x00100000L +#define M_REGARD_X_COMMAND 0x00200000L +#define M_ERROR_MESSAGE_ON 0x00400000L +#define M_ERROR_MESSAGE_OFF 0x00800000L +#define M_BAR_WINDOW_ON 0x01000000L +#define M_BAR_WINDOW_OFF 0x02000000L +#define M_CHECK_PATH 0x04000000L +#define M_RECOVERY_ON 0x08000000L + +#define M_MAKE_INDEX_FILE 0x10000000L +#define M_NOT_MAKE_INDEX_FILE 0x20000000L +#define EXTRACT_FOUND_FILE 0x40000000L +#define EXTRACT_NAMED_FILE 0x80000000L +#endif + +// ATTRIBUTE +#ifndef FA_RDONLY +#define FA_RDONLY 0x01 +#define FA_HIDDEN 0x02 +#define FA_SYSTEM 0x04 +#define FA_LABEL 0x08 +#define FA_DIREC 0x10 +#define FA_ARCH 0x20 +#endif +#ifndef FA_ENCRYPTED +#define FA_ENCRYPTED 0x40 +#endif + +// STRUCTURES +#if defined(__BORLANDC__) +#pragma option -a- +#else +#pragma pack(1) +#endif + +typedef HGLOBAL HARCHIVE; + +#ifndef ARC_DECSTRACT +#define ARC_DECSTRACT +typedef HGLOBAL HARC; + +typedef struct { + DWORD dwOriginalSize; + DWORD dwCompressedSize; + DWORD dwCRC; + UINT uFlag; + UINT uOSType; + WORD wRatio; + WORD wDate; + WORD wTime; + char szFileName[FNAME_MAX32 + 1]; + char dummy1[3]; + char szAttribute[8]; + char szMode[8]; +} INDIVIDUALINFO, FAR *LPINDIVIDUALINFO; + +typedef struct { + DWORD dwFileSize; + DWORD dwWriteSize; + char szSourceFileName[FNAME_MAX32 + 1]; + char dummy1[3]; + char szDestFileName[FNAME_MAX32 + 1]; + char dummy[3]; +} EXTRACTINGINFO, FAR *LPEXTRACTINGINFO; + +typedef struct { + EXTRACTINGINFO exinfo; + DWORD dwCompressedSize; + DWORD dwCRC; + UINT uOSType; + WORD wRatio; + WORD wDate; + WORD wTime; + char szAttribute[8]; + char szMode[8]; +} EXTRACTINGINFOEX, *LPEXTRACTINGINFOEX; +#endif + +#if !defined(__BORLANDC__) +#pragma pack() +#else +#pragma option -a. +#endif + +#if !defined(__BORLANDC__) +#define _export +#endif + +// WindowsMessage +#ifndef WM_ARCEXTRACT +#define WM_ARCEXTRACT "wm_arcextract" +#define ARCEXTRACT_BEGIN 0 +#define ARCEXTRACT_INPROCESS 1 +#define ARCEXTRACT_END 2 +#define ARCEXTRACT_OPEN 3 +#define ARCEXTRACT_COPY 4 +typedef BOOL CALLBACK ARCHIVERPROC(HWND,UINT,UINT,LPEXTRACTINGINFOEX); +typedef ARCHIVERPROC *LPARCHIVERPROC; +#endif + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// 統合アーカイバDLLを非常に薄く覆うレイヤ + +class kiArcDLLRaw +{ +public: //-- 外向きインターフェイス -------------------------- + + // DLL名で初期化。 + kiArcDLLRaw( const char* dllname ); + kiPath& name() + { return m_DllPath; } + + // DLLが生きているかどうか。 + bool isAlive(); + + // API のラッパ [ DLLやAPIが無いときの返値 ] + + // バージョンx100 [ 0 ] + WORD getVer(); + // バージョンサブx100 [ 0 ] + WORD getVerSub(); + // コマンド送り [ ERROR_NOT_SUPPORT ] + int command( const HWND wnd, LPCSTR cmd, LPSTR buf, const DWORD siz ); + // 書庫チェック [ FALSE ] + BOOL check( LPCSTR filename, const int mode ); + // 書庫の種類 [ 0 ] + int getArcType( LPCSTR filename ); + + // 開く [ NULL ] + HARC openArc( const HWND wnd, LPCSTR arcname, const DWORD flag ); + // 閉じる + void closeArc( HARC arc ); + // 一つ目を検索 [ ERROR_NOT_SUPPORT ] + int findfirst( HARC arc, LPCSTR wildname, INDIVIDUALINFO* inf ); + // 二つ目以降を検索 [ ERROR_NOT_SUPPORT ] + int findnext( HARC arc, INDIVIDUALINFO* inf ); + // 属性取得 [ 0 ] + int getAttr( HARC arc ); + + // オーナー指定 [ FALSE ] + BOOL setOwner( HWND wnd ); + // オーナー解除 [ FALSE ] + BOOL clearOwner(); + + // ※load系は呼ばなくても内部で何とかするのでできれば使わないこと。 + bool load(); + void unload(); + +private: //-- 内部処理 ----------------------------------- + + HINSTANCE m_hDLL; + bool not_loaded_yet; + + kiPath m_DllPath; + kiStr m_DllNameBody; + FARPROC getProc( const char* procname ); + + FARPROC m_Proc[ ISARC_FUNCTION_END ]; + FARPROC f_VSb; +#define f_Cmd m_Proc[ ISARC ] +#define f_Chk m_Proc[ ISARC_GET_VERSION ] +#define f_Gat m_Proc[ 13 ] +#define f_Ver m_Proc[ ISARC_CHECK_ARCHIVE ] +#define f_Opn m_Proc[ ISARC_OPEN_ARCHIVE ] +#define f_Cls m_Proc[ ISARC_CLOSE_ARCHIVE ] +#define f_Ffs m_Proc[ ISARC_FIND_FIRST ] +#define f_Fnx m_Proc[ ISARC_FIND_NEXT ] +#define f_GAr m_Proc[ ISARC_GET_ATTRIBUTE ] +#define f_SOw m_Proc[ ISARC_SETOWNERWINDOW ] +#define f_COw m_Proc[ ISARC_CLEAROWNERWINDOW ] + +public: + virtual ~kiArcDLLRaw(); +}; + +#endif ADDED kilib/kl_cmd.cpp Index: kilib/kl_cmd.cpp ================================================================== --- kilib/kl_cmd.cpp +++ kilib/kl_cmd.cpp @@ -0,0 +1,79 @@ +//--- K.I.LIB --- +// kl_cmd.h : commandline parser + +#include "stdafx.h" +#include "kilib.h" + + +//------------------------ 文字列のメモリ処理など -----------------------// + + +kiCmdParser::kiCmdParser( char* cmd, bool ignoreFirst ) +{ + m_Buffer = NULL; + if( cmd ) + doit( cmd, ignoreFirst ); +} + +kiCmdParser::kiCmdParser( const char* cmd, bool ignoreFirst ) +{ + m_Buffer=NULL; + if( cmd ) + { + m_Buffer = new char[ ki_strlen(cmd)+1 ]; + ki_strcpy( m_Buffer, cmd ); + doit( m_Buffer, ignoreFirst ); + } +} + +kiCmdParser::~kiCmdParser() +{ + delete [] m_Buffer; +} + + +//---------------------------- 分割の処理 -----------------------------// + + +void kiCmdParser::doit( char* start, bool ignoreFirst ) +{ + char* p=start; + char endc; + bool first = true; + + while( *p!='\0' ) + { + // 余分な空白はスキップ + while( *p==' ' ) //|| *p=='\t' || *p=='\r' || *p=='\n' ) + p++; + + // " だったら、その旨記録してさらに一個進める + if( *p=='"' ) + endc='"', p++; + else + endc=' '; + + // end-of-text なら終了 + if( *p=='\0' ) + break; + + if( first && ignoreFirst ) + first = false; + else + { + // 引数を保存 + if( *p=='-' ) + m_Switch.add( p ); + else + m_Param.add( p ); + } + + // 引数の終わりへ… + while( *p!=endc && *p!='\0' ) + p++; + + // 終わりは'\0'にすることによって、引数を区切る + if( *p!='\0' ) + *(p++) = '\0'; + } +} ADDED kilib/kl_cmd.h Index: kilib/kl_cmd.h ================================================================== --- kilib/kl_cmd.h +++ kilib/kl_cmd.h @@ -0,0 +1,38 @@ +//--- K.I.LIB --- +// kl_cmd.h : commandline parser + +#ifndef AFX_KICMDPARSER_H__843A27E0_5DBF_48AF_A748_FA7F111F699A__INCLUDED_ +#define AFX_KICMDPARSER_H__843A27E0_5DBF_48AF_A748_FA7F111F699A__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiCmdParser : コマンド文字列をchar*の配列に分割 + +class kiCmdParser +{ +public: //-- 外向きインターフェイス -------------------------- + + // 文字列で初期化 + kiCmdParser( char* cmd, bool ignoreFirst=false ); + kiCmdParser( const char* cmd, bool ignoreFirst=false ); + + // スイッチ文字列の配列 + cCharArray& option() + { return m_Switch; } + + // スイッチ以外の文字列の配列 + cCharArray& param() + { return m_Param; } + +private: //-- 内部処理 ----------------------------------- + + void doit( char* start, bool ignoreFirst ); + cCharArray m_Param; + cCharArray m_Switch; + char* m_Buffer; + +public: + + virtual ~kiCmdParser(); +}; + +#endif ADDED kilib/kl_dnd.cpp Index: kilib/kl_dnd.cpp ================================================================== --- kilib/kl_dnd.cpp +++ kilib/kl_dnd.cpp @@ -0,0 +1,217 @@ +//--- K.I.LIB --- +// kl_dnd.h : drag and drop operation + +#include "stdafx.h" +#include "kilib.h" + +//--------------------------------------------------------------------// + +bool kiDropSource::DnD( kiDataObject* pObj, DWORD efct, DWORD* pefct ) +{ + kiDropSource* pDrpSrc = new kiDropSource; + pDrpSrc->AddRef(); + pObj->begin(); + + DWORD d, *p=(pefct==NULL ? &d : pefct); + HRESULT hr = ::DoDragDrop( pObj, pDrpSrc, efct, p ); + + pDrpSrc->Release(); + return (hr == DRAGDROP_S_DROP); +} + +//------------------------ IUnknown Implement -------------------------// + +kiDropSource::kiDropSource() : m_cRef( 0L ) +{ + app()->shellInit(); // OleInitialize() +} + +STDMETHODIMP_(ULONG) kiDropSource::AddRef() +{ + return ++m_cRef; +} + +STDMETHODIMP_(ULONG) kiDropSource::Release() +{ + if( --m_cRef ) + return m_cRef; + + delete this; + return 0L; +} + +STDMETHODIMP kiDropSource::QueryInterface( REFIID riid, void** ppObj ) +{ + if( ::IsEqualIID( riid, IID_IUnknown ) + || ::IsEqualIID( riid, IID_IDropSource ) ) + { + *ppObj = (void*)this; + AddRef(); + return S_OK; + } + + *ppObj = NULL; + return E_NOINTERFACE; +} + +//------------------------ IDropSource Implement -------------------------// + +STDMETHODIMP kiDropSource::GiveFeedback( DWORD dwEffect ) +{ + return DRAGDROP_S_USEDEFAULTCURSORS; +} + +STDMETHODIMP kiDropSource::QueryContinueDrag( BOOL keyESC, DWORD keyOther ) +{ + if( keyESC ) + return DRAGDROP_S_CANCEL; + if( !(keyOther&MK_LBUTTON) && !(keyOther&MK_RBUTTON) ) + return DRAGDROP_S_DROP; + return S_OK; +} + +//------------------------ IUnknown Implement -------------------------// + +kiDataObject::kiDataObject() : m_cRef( 0L ), m_FormatList( 2 ) +{ +} + +STDMETHODIMP_(ULONG) kiDataObject::AddRef() +{ + return ++m_cRef; +} + +STDMETHODIMP_(ULONG) kiDataObject::Release() +{ + if( --m_cRef ) + return m_cRef; + + delete this; + return 0L; +} + +STDMETHODIMP kiDataObject::QueryInterface( REFIID riid, void** ppObj ) +{ + if( ::IsEqualIID( riid, IID_IUnknown ) + || ::IsEqualIID( riid, IID_IDataObject ) ) + { + *ppObj = (void*)this; + AddRef(); + return S_OK; + } + + *ppObj = NULL; + return E_NOINTERFACE; +} + +//------------------------ IDataObject Implement -------------------------// + + +STDMETHODIMP kiDataObject::GetData( FORMATETC* fmtc, STGMEDIUM* stg ) +{ + HRESULT hr = QueryGetData( fmtc ); + if( FAILED(hr) ) + return hr; + bool res = giveData( *fmtc, stg, m_bFirst ); + m_bFirst = false; + return res ? S_OK : STG_E_MEDIUMFULL; +} + +STDMETHODIMP kiDataObject::QueryGetData( FORMATETC* fmtc ) +{ + for( unsigned int i=0; i!=m_FormatList.len(); i++ ) + if( m_FormatList[i].cfFormat == fmtc->cfFormat ) +// if(fmtc & TYMED_HGLOBAL) + return S_OK; + return DV_E_FORMATETC; +} + +//---------- Enumrator ---------// + +class kiDataObject_Enum : public IEnumFORMATETC +{ +public: + kiDataObject_Enum( kiDataObject* p ) + : m_cRef( 0L ), m_pObj( p ), m_nCur( 0L ) + { + m_pObj->AddRef(); + } + ~kiDataObject_Enum() + { + m_pObj->Release(); + } + STDMETHODIMP_(ULONG) AddRef() + { + return ++m_cRef; + } + STDMETHODIMP_(ULONG) Release() + { + if( --m_cRef ) + return m_cRef; + delete this; + return 0L; + } + STDMETHODIMP QueryInterface( REFIID riid, void** ppObj ) + { + if( ::IsEqualIID( riid, IID_IUnknown ) + || ::IsEqualIID( riid, IID_IEnumFORMATETC ) ) + { + *ppObj = (void*)this; + AddRef(); + return S_OK; + } + *ppObj = NULL; + return E_NOINTERFACE; + } + STDMETHODIMP Clone( IEnumFORMATETC** ppNew ) + { + *ppNew = new kiDataObject_Enum( m_pObj ); + ((kiDataObject_Enum*)(*ppNew))->m_nCur = m_nCur; + (*ppNew)->AddRef(); + return S_OK; + } + STDMETHODIMP Reset() + { + m_nCur = 0; + return S_OK; + } + STDMETHODIMP Skip( ULONG celt ) + { + m_nCur += celt; + if( m_pObj->m_FormatList.len() <= m_nCur ) + { + m_nCur = m_pObj->m_FormatList.len() - 1; + return S_FALSE; + } + return S_OK; + } + STDMETHODIMP Next( ULONG celt, FORMATETC* pFmt, ULONG* fetched ) + { + if( fetched ) + *fetched = 0L; + if( !pFmt ) + return E_POINTER; + ULONG i; + for( i=0; i < celt && m_nCur < m_pObj->m_FormatList.len(); i++,m_nCur++ ) + *pFmt++ = m_pObj->m_FormatList[m_nCur]; + if( fetched ) + *fetched = i; + return i==celt ? S_OK : S_FALSE; + } +private: + ULONG m_cRef; + ULONG m_nCur; + kiDataObject* m_pObj; +}; + +STDMETHODIMP kiDataObject::EnumFormatEtc( DWORD drctn, IEnumFORMATETC** ppEnm ) +{ + if( !ppEnm ) + return E_INVALIDARG; + *ppEnm = NULL; + if( drctn!=DATADIR_GET ) + return E_NOTIMPL; + + (*ppEnm = new kiDataObject_Enum( this ))->AddRef(); + return S_OK; +} ADDED kilib/kl_dnd.h Index: kilib/kl_dnd.h ================================================================== --- kilib/kl_dnd.h +++ kilib/kl_dnd.h @@ -0,0 +1,95 @@ +//--- K.I.LIB --- +// kl_dnd.h : drag and drop operation + +#ifndef AFX_KIDROPSOURCE_H__141BEF0D_0DA2_4156_93E4_313535916A23__INCLUDED_ +#define AFX_KIDROPSOURCE_H__141BEF0D_0DA2_4156_93E4_313535916A23__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiDataObject : ドロップデータとしての標準処理 + +class kiDataObject : public IDataObject +{ +protected: // 派生クラス向け処理 + + virtual bool giveData( const FORMATETC& fmt, STGMEDIUM* stg, bool firstcall ) = 0; + void addFormat( const FORMATETC& frm ) + { + m_FormatList.add( frm ); + } + +protected: //-- IUnknown ----------- + + kiDataObject(); + STDMETHODIMP QueryInterface( REFIID, void** ); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); +private: + ULONG m_cRef; + +private: //-- IDataObject ------------ + + STDMETHODIMP GetData( FORMATETC*, STGMEDIUM* ); + STDMETHODIMP QueryGetData( FORMATETC* ); + STDMETHODIMP EnumFormatEtc( DWORD, IEnumFORMATETC** ); + STDMETHODIMP GetDataHere( FORMATETC*, STGMEDIUM* ) + { + return E_NOTIMPL; + } + STDMETHODIMP GetCanonicalFormatEtc( FORMATETC*, FORMATETC* ) + { + return E_NOTIMPL; + } + STDMETHODIMP SetData( FORMATETC*, STGMEDIUM*, BOOL ) + { + return E_NOTIMPL; + } + STDMETHODIMP DAdvise( FORMATETC*, DWORD, IAdviseSink*, DWORD* ) + { + return OLE_E_ADVISENOTSUPPORTED; + } + STDMETHODIMP DUnadvise( DWORD ) + { + return OLE_E_NOCONNECTION; + } + STDMETHODIMP EnumDAdvise( IEnumSTATDATA** ) + { + return OLE_E_ADVISENOTSUPPORTED; + } + +private: //-- 内部処理 ----------------- + + kiArray m_FormatList; + bool m_bFirst; + friend class kiDataObject_Enum; + +public: + void begin() + { + m_bFirst = true; + } +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiDropSource : ドロップ元としての標準処理 + +class kiDropSource : public IDropSource +{ +public: //-- ドラッグ&ドロップ実行! + + static bool DnD( kiDataObject* pObj, DWORD efct, DWORD* pefct=NULL ); + +private: //-- IUnknown + + kiDropSource(); + STDMETHODIMP QueryInterface( REFIID, void** ); + STDMETHODIMP_(ULONG) AddRef(); + STDMETHODIMP_(ULONG) Release(); + ULONG m_cRef; + +private: //-- IDropSource + + STDMETHODIMP QueryContinueDrag( BOOL, DWORD ); + STDMETHODIMP GiveFeedback( DWORD ); +}; + +#endif ADDED kilib/kl_file.cpp Index: kilib/kl_file.cpp ================================================================== --- kilib/kl_file.cpp +++ kilib/kl_file.cpp @@ -0,0 +1,165 @@ +//--- K.I.LIB --- +// kl_file.cpp : file operations + +#include "stdafx.h" +#include "kilib.h" + +//--------------------------- static --------------------------// + +__int64 kiFile::getSize64( const char* fname ) +{ + HANDLE h = ::CreateFile( fname, + GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( h==INVALID_HANDLE_VALUE ) + return 0; + + DWORD low, hi; + low = ::GetFileSize( h, &hi ); + ::CloseHandle( h ); + + return (__int64(hi)<<32) | low; +} + +unsigned long kiFile::getSize( const char* fname, unsigned long err ) +{ + HANDLE h = ::CreateFile( fname, + GENERIC_READ, FILE_SHARE_WRITE|FILE_SHARE_READ, + NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( h==INVALID_HANDLE_VALUE ) + return err; + + unsigned long ans = ::GetFileSize( h, NULL ); + ::CloseHandle( h ); + + return ans==0xffffffff ? err : ans; +} + +//--------------------------- 結んで開いて --------------------------// + + +bool kiFile::open( const char* filename, bool read, bool create ) +{ + close(); + + if( m_bReadMode = read ) + m_hFile = ::CreateFile( filename, + GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + else + m_hFile = ::CreateFile( filename, + GENERIC_WRITE, FILE_SHARE_READ, NULL, + create ? CREATE_ALWAYS : OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL ); + if( m_hFile == INVALID_HANDLE_VALUE ) + return false; + + m_nBufPos = 0; + if( m_bReadMode ) + flush(); + + return true; +} + +void kiFile::close() +{ + if( m_hFile != INVALID_HANDLE_VALUE ) + { + if( !m_bReadMode ) + flush(); + + ::CloseHandle( m_hFile ); + m_hFile = INVALID_HANDLE_VALUE; + } +} + + +//-------------------------- 読み書き ----------------------------// + + +unsigned long kiFile::read( unsigned char* buf, unsigned long len ) +{ + unsigned long ans = 0; + if( m_nBufSize!=0 && m_hFile!=INVALID_HANDLE_VALUE && m_bReadMode ) + { + while( (m_nBufSize-m_nBufPos) <= len ) + { + ans += (m_nBufSize-m_nBufPos); + ki_memcpy( buf, m_pBuf+m_nBufPos, m_nBufSize-m_nBufPos ); + len -= (m_nBufSize-m_nBufPos); + buf += (m_nBufSize-m_nBufPos); + + flush(); + if( m_nBufSize == 0 ) + return ans; + } + ans += len; + ki_memcpy( buf, m_pBuf+m_nBufPos, len ); + m_nBufPos += len; + } + return ans; +} + +void kiFile::write( const void* buf, unsigned long len ) +{ + if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode ) + return; + const unsigned char* ubuf = (const unsigned char*)buf; + + while( (kifile_bufsize-m_nBufPos) <= len ) + { + ki_memcpy( m_pBuf+m_nBufPos, buf, (kifile_bufsize-m_nBufPos) ); + len -= (kifile_bufsize-m_nBufPos); + ubuf += (kifile_bufsize-m_nBufPos); + m_nBufPos = kifile_bufsize; + flush(); + } + ki_memcpy( m_pBuf+m_nBufPos, ubuf, len ); + m_nBufPos += len; +} + +#undef putc +void kiFile::putc( unsigned char c ) +{ + if( m_hFile==INVALID_HANDLE_VALUE || m_bReadMode ) + return; + if( (kifile_bufsize-m_nBufPos) <= 1 ) + flush(); + m_pBuf[ m_nBufPos++ ] = c; +} + +#undef getc +int kiFile::getc() +{ + if( m_nBufSize==0 || m_hFile==INVALID_HANDLE_VALUE || !m_bReadMode ) + return -1; + + if( 0==(m_nBufSize-m_nBufPos) ) + { + flush(); + if( m_nBufSize==0 ) + return -1; + } + if( 1==(m_nBufSize-m_nBufPos) ) + { + int ans = m_pBuf[ m_nBufPos++ ]; + flush(); + return ans; + } + + return m_pBuf[ m_nBufPos++ ]; +} + +void kiFile::flush() +{ + if( m_bReadMode ) + { + ::ReadFile( m_hFile, m_pBuf, kifile_bufsize, &m_nBufSize, NULL ); + m_nBufPos = 0; + } + else + { + ::WriteFile( m_hFile, m_pBuf, m_nBufPos, &m_nBufSize, NULL ); + m_nBufSize = m_nBufPos = 0; + } +} ADDED kilib/kl_file.h Index: kilib/kl_file.h ================================================================== --- kilib/kl_file.h +++ kilib/kl_file.h @@ -0,0 +1,94 @@ +//--- K.I.LIB --- +// kl_file.h : file operations + +#ifndef AFX_KIFILE_H__7D126C1E_3E5C_476E_9A4E_81CA8055621D__INCLUDED_ +#define AFX_KIFILE_H__7D126C1E_3E5C_476E_9A4E_81CA8055621D__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// バイナリファイル操作 + +class kiFile +{ +public: //-- static ---------------------------------------- + + // ファイルサイズ取得( 名前, エラー時に返したい値 ) + static unsigned long getSize( const char* fname, unsigned long err=0xffffffff ); + static __int64 getSize64( const char* fname ); + +public: //-- 外向きインターフェイス -------------------------- + + // 開いて閉じて + bool open( const char* filename, bool read=true, bool create=true ); + void close(); + + // 読んで書いて + unsigned long read( unsigned char* buf, unsigned long len ); + void write( const void* buf, unsigned long len ); + int getc(); + void putc( unsigned char c ); + + // シーク + void seekTo( unsigned long pos ) + { + if( !m_bReadMode ) flush(); + ::SetFilePointer( m_hFile, pos, NULL, FILE_BEGIN ); + if( m_bReadMode ) flush(); + } + void seek( long pos ) + { + if( !m_bReadMode ) flush(); + ::SetFilePointer( m_hFile, + pos-(signed)m_nBufSize+(signed)m_nBufPos, NULL, + FILE_CURRENT ); + if( m_bReadMode ) flush(); + } + unsigned long tell() + { + return ::SetFilePointer( m_hFile, 0, NULL, FILE_CURRENT ) + - m_nBufSize + m_nBufPos; + } + + // 情報取得 + bool isOpened() + { + return m_hFile != INVALID_HANDLE_VALUE; + } + unsigned long getSize( unsigned long* higher=NULL ) + { + return ::GetFileSize( m_hFile, higher ); + } + bool isEOF() + { + return (m_nBufPos==0 && m_nBufSize==0); + } + +public: //-- 内部処理 ----------------------------------- + + kiFile() : kifile_bufsize( 65536 ) + { + m_hFile= INVALID_HANDLE_VALUE; + m_pBuf = new unsigned char[kifile_bufsize]; + } + + virtual ~kiFile() + { + close(); + delete [] m_pBuf; + } + + HANDLE getHandle() const + { + return m_hFile; + } + +private: + const int kifile_bufsize; + void flush(); + + HANDLE m_hFile; + bool m_bReadMode; + unsigned char* m_pBuf; + unsigned long m_nBufSize, m_nBufPos; +}; + +#endif ADDED kilib/kl_find.cpp Index: kilib/kl_find.cpp ================================================================== --- kilib/kl_find.cpp +++ kilib/kl_find.cpp @@ -0,0 +1,67 @@ +//--- K.I.LIB --- +// kl_find.h : FindFirstFile wrapper + +#include "stdafx.h" +#include "kilib.h" + +#define isDots(p) (*p=='.' && (p[1]=='\0' || (p[1]=='.' && p[2]=='\0'))) + +bool kiFindFile::findfirst( const char* wild, WIN32_FIND_DATA* pfd ) +{ + HANDLE xh = ::FindFirstFile( wild, pfd ); + if( xh==INVALID_HANDLE_VALUE ) + return false; + while( isDots(pfd->cFileName) ) + if( !::FindNextFile( xh, pfd ) ) + { + ::FindClose( xh ); + return false; + } + ::FindClose( xh ); + return true; +} + +void kiFindFile::close() +{ + first=true; + if( h!=INVALID_HANDLE_VALUE ) + { + ::FindClose( h ), h=INVALID_HANDLE_VALUE; + } +} + +bool kiFindFile::begin( const char* wild ) +{ + close(); + + h = ::FindFirstFile( wild, &fd ); + if( h==INVALID_HANDLE_VALUE ) + return false; + while( isDots(fd.cFileName) ) + if( !::FindNextFile( h, &fd ) ) + { + close(); + return false; + } + return true; +} + +bool kiFindFile::next( WIN32_FIND_DATA* pfd ) +{ + if( h==INVALID_HANDLE_VALUE ) + return false; + if( first ) + { + first = false; + ki_memcpy( pfd, &fd, sizeof(fd) ); + return true; + } + if( !::FindNextFile( h, pfd ) ) + return false; + while( isDots(fd.cFileName) ) + if( !::FindNextFile( h, pfd ) ) + return false; + return true; +} + +#undef isDots ADDED kilib/kl_find.h Index: kilib/kl_find.h ================================================================== --- kilib/kl_find.h +++ kilib/kl_find.h @@ -0,0 +1,32 @@ +//--- K.I.LIB --- +// kl_find.h : FindFirstFile wrapper + +#ifndef AFX_KIFINDFILE_H__86462791_815C_4F44_9F16_802B54B411BA__INCLUDED_ +#define AFX_KIFINDFILE_H__86462791_815C_4F44_9F16_802B54B411BA__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// ファイル検索 + +class kiFindFile +{ +public: //-- 外向きインターフェイス -------------------------- + + static bool findfirst( const char* wild, WIN32_FIND_DATA* pfd ); + bool begin( const char* wild ); + bool next( WIN32_FIND_DATA* pfd ); + +public: //-- 内部処理 ----------------------------------- + + kiFindFile() + { h = INVALID_HANDLE_VALUE; } + virtual ~kiFindFile() + { close(); } + void close(); + +private: + HANDLE h; + bool first; + WIN32_FIND_DATA fd; +}; + +#endif ADDED kilib/kl_misc.h Index: kilib/kl_misc.h ================================================================== --- kilib/kl_misc.h +++ kilib/kl_misc.h @@ -0,0 +1,124 @@ +//--- K.I.LIB --- +// kl_misc.h : common-classes for K.I.LIB + +#ifndef AFX_KILIBBASE_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ +#define AFX_KILIBBASE_H__89998F34_A9FE_4A27_A159_671F85AA9383__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// 使用する外部関数を何となくマクロ化しておく +// 追記:何でこんなことやったんだ…? > 昔の自分(^^; + +#define ki_strlen(p) ::lstrlen(p) +#define ki_strcpy(p,s) ::lstrcpy(p,s) +#define ki_strcat(p,s) ::lstrcat(p,s) +#define ki_strcmp(p,s) ::lstrcmp(p,s) +#define ki_strcmpi(p,s) ::lstrcmpi(p,s) +#define ki_memzero(p,l) ::ZeroMemory(p,l) +#define ki_memcpy(p,s,l) ::CopyMemory(p,s,l) +#define ki_memmov(p,s,l) ::MoveMemory(p,s,l) +#define ki_memset(p,c,l) ::FillMemory(p,l,c) +inline bool ki_memcmp( const char* x, const char* y, int l ) +{ + while( *x++==*y++ && --l ); + return l==0; +} + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiArray : 配列のようなキューのような代物 + +template class kiArray +{ +public: //-- 外向きインターフェイス -------------------------- + + // 初期サイズ( 10〜255 )で初期化 + kiArray( unsigned char start_size=10 ) + { + m_pArray = new T[ m_ALen=start_size ]; + m_Len = 0; + } + + // 配列を空にする + void empty() + { + m_Len = 0; + } + + // 要素数を取得 + unsigned long len() const + { + return m_Len; + } + + // 末尾に一個追加 + void add( const T& obj ) + { + if( m_Len>=m_ALen ) + { + T* p = new T[ m_ALen<<=1 ]; + for( unsigned long i=0; i!=m_Len; i++ ) + p[i] = m_pArray[i]; + delete [] m_pArray; + m_pArray = p; + } + m_pArray[ m_Len++ ] = obj; + } + + // 要素にアクセス + T& operator []( unsigned long i ) + { + return m_pArray[i]; + } + const T& operator []( unsigned long i ) const + { + return m_pArray[i]; + } + + // 配列コピー + kiArray& operator = ( const kiArray& o ) + { + if( &o != this ) + { + empty(); + for( unsigned int i=0; i!=o.len(); i++ ) + add( o[i] ); + } + return *this; + } + + //-- ちょっと危険なメソッド群 + void alloc( unsigned long x ) + { + if( x > m_ALen ) + { + T* p = new T[ m_ALen=(m_ALen<<1)>x?(m_ALen<<1):x ]; + for( unsigned long i=0; i!=m_Len; i++ ) + p[i] = m_pArray[i]; + delete [] m_pArray; + m_pArray = p; + } + } + void forcelen( unsigned long x ) + { + alloc( x ); + m_Len = x; + } + +private: //-- 内部処理 ----------------------------------- + + T* m_pArray; + unsigned long m_Len, m_ALen; + +public: + + virtual ~kiArray() + { + delete [] m_pArray; + } +}; + +#define BoolArray kiArray +#define CharArray kiArray +#define cCharArray kiArray +#define StrArray kiArray + +#endif ADDED kilib/kl_reg.cpp Index: kilib/kl_reg.cpp ================================================================== --- kilib/kl_reg.cpp +++ kilib/kl_reg.cpp @@ -0,0 +1,169 @@ +//--- K.I.LIB --- +// kl_reg.h : registry and ini-file operation + +#include "stdafx.h" +#include "kilib.h" + + +//---------------------------- open系 ----------------------------// + + +bool kiRegKey::open( HKEY parent, LPCTSTR keyname, REGSAM access ) +{ + return (ERROR_SUCCESS == RegOpenKeyEx( parent, + keyname, 0, access, &m_hKey )); +} + +bool kiRegKey::create( HKEY parent, LPCTSTR keyname, REGSAM access ) +{ + DWORD x; + return (ERROR_SUCCESS == RegCreateKeyEx( parent, + keyname, 0, REG_NONE, REG_OPTION_NON_VOLATILE, access, NULL, &m_hKey, &x )); +} + + +//------------------------- query/set系 ----------------------------// + + +bool kiRegKey::get( LPCTSTR valname, DWORD* val ) +{ + DWORD x=4; + return (ERROR_SUCCESS == RegQueryValueEx( m_hKey, + valname, NULL, NULL, (BYTE*)val, &x )); +} + +bool kiRegKey::get( LPCTSTR valname, BYTE* val, DWORD siz ) +{ + return (ERROR_SUCCESS == RegQueryValueEx( m_hKey, + valname, NULL, NULL, val, &siz )); +} + +bool kiRegKey::get( LPCTSTR valname, kiStr* val ) +{ + static char dat[2048]; + DWORD x = 2048; + if( ERROR_SUCCESS == RegQueryValueEx( m_hKey, + valname, NULL, NULL, (BYTE*)dat, &x )) + { + *val = dat; + return true; + } + return false; +} + +bool kiRegKey::set( LPCTSTR valname, DWORD val ) +{ + return (ERROR_SUCCESS == RegSetValueEx( m_hKey, + valname, 0, REG_DWORD, (BYTE*)&val, 4 )); +} + +bool kiRegKey::set( LPCTSTR valname, BYTE* val, DWORD siz ) +{ + return (ERROR_SUCCESS == RegSetValueEx( m_hKey, + valname, 0, REG_BINARY, (BYTE*)val, siz )); +} + +bool kiRegKey::set( LPCTSTR valname, LPCTSTR val ) +{ + return (ERROR_SUCCESS == RegSetValueEx( m_hKey, + valname, 0, REG_SZ, (BYTE*)val, ki_strlen(val)+1 )); +} + + +//--------------------------- delete系 ----------------------------// + + +bool kiRegKey::del( LPCTSTR valname ) +{ + return (ERROR_SUCCESS == RegDeleteValue( m_hKey, valname )); +} + +bool kiRegKey::delSubKey( LPCTSTR keyname ) +{ + if( app()->osver().dwPlatformId == VER_PLATFORM_WIN32_NT ) + return delSubKeyRecursive( m_hKey, keyname ); + else + return (ERROR_SUCCESS == RegDeleteKey( m_hKey, keyname )); +} + +bool kiRegKey::delSubKeyRecursive( HKEY k, LPCTSTR n ) +{ + HKEY k2; + if( ERROR_SUCCESS!=RegOpenKeyEx( k,n,0,KEY_READ,&k2 ) ) + return false; + + bool ans = true; + static char buf[2048]; + DWORD bs = sizeof(buf); + + for( int i=0; + ERROR_SUCCESS==RegEnumKeyEx( k2,i,buf,&bs,NULL,NULL,NULL,NULL ); + i++ ) + { + if( !delSubKeyRecursive( k2,buf ) ) + ans = false; + bs = sizeof(buf); + } + + RegCloseKey( k2 ); + RegDeleteKey( k,n ); + return ans; +} + +//--------------------------- ini:初期化 ----------------------------// + + +void kiIniFile::setFileName( const char* ini, bool exepath ) +{ + if( !exepath ) + m_FileName = ""; + else + { + m_FileName.beSpecialPath( kiPath::Exe ); + m_FileName.beBackSlash( true ); + } + m_FileName += ini; +} + + +//--------------------------- ini:read系 ----------------------------// + + +int kiIniFile::getInt( const char* key, int defval ) +{ + return ::GetPrivateProfileInt( m_CurSec, key, defval, m_FileName ); +} + +bool kiIniFile::getBool( const char* key, bool defval ) +{ + return (0 != ::GetPrivateProfileInt( m_CurSec, + key, defval?1:0, m_FileName ) ); +} + +const char* kiIniFile::getStr( const char* key, const char* defval ) +{ + ::GetPrivateProfileString( m_CurSec, key, defval, + m_StrBuf, sizeof(m_StrBuf), m_FileName ); + return m_StrBuf; +} + + +//--------------------------- ini:write系 ----------------------------// + + +bool kiIniFile::putStr( const char* key, const char* val ) +{ + return (FALSE != ::WritePrivateProfileString( + m_CurSec, key, val, m_FileName ) ); +} + +bool kiIniFile::putInt( const char* key, int val ) +{ + ::wsprintf( m_StrBuf, "%d", val ); + return putStr( key, m_StrBuf ); +} + +bool kiIniFile::putBool( const char* key, bool val ) +{ + return putStr( key, val ? "1" : "0" ); +} ADDED kilib/kl_reg.h Index: kilib/kl_reg.h ================================================================== --- kilib/kl_reg.h +++ kilib/kl_reg.h @@ -0,0 +1,100 @@ +//--- K.I.LIB --- +// kl_reg.h : registry and ini-file operation + +#ifndef AFX_KIREGKEY_H__4FD5E1B3_B8FE_45B3_B19E_3D30407C94BA__INCLUDED_ +#define AFX_KIREGKEY_H__4FD5E1B3_B8FE_45B3_B19E_3D30407C94BA__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// レジストリ操作&ini操作 + +class kiRegKey +{ +public: //-- 外向きインターフェイス -------------------------- + + // 開く&閉じる + bool open( HKEY parent, LPCTSTR keyname, REGSAM access = KEY_ALL_ACCESS ); + bool create( HKEY parent, LPCTSTR keyname, REGSAM access = KEY_ALL_ACCESS ); + void close() + { + if( m_hKey ) + RegCloseKey( m_hKey ); + } + + // サブキーが存在するや否や + bool exist( LPCTSTR keyname ) + { + HKEY k; + if( ERROR_SUCCESS==RegOpenKeyEx( m_hKey,keyname,0,KEY_READ,&k ) ) + { + RegCloseKey( k ); + return true; + } + return false; + } + // HKEYへキャスト + operator HKEY() const + { + return m_hKey; + } + + // 値を得る + bool get( LPCTSTR valname, DWORD* val ); + bool get( LPCTSTR valname, BYTE* val, DWORD siz ); + bool get( LPCTSTR valname, kiStr* val ); + + // 値を設定 + bool set( LPCTSTR valname, DWORD val ); + bool set( LPCTSTR valname, BYTE* val, DWORD siz ); + bool set( LPCTSTR valname, LPCTSTR val ); + + // 削除 + bool del( LPCTSTR valname ); + bool delSubKey( LPCTSTR keyname ); + +public: //-- 内部処理 ----------------------------------- + + kiRegKey() + { + m_hKey = NULL; + } + + virtual ~kiRegKey() + { + close(); + } + +private: + + HKEY m_hKey; + static bool delSubKeyRecursive( HKEY k, LPCTSTR n ); +}; + +class kiIniFile +{ +public: //-- 外向きインターフェイス -------------------------- + + // iniファイル名を設定 + void setFileName( const char* ini, bool exepath=true ); + void setSection( const char* section ) + { m_CurSec = section; } + + // 読み込み + // ※ 注意!getStrの返値は内部バッファな為、 + // ※    呼び出し直後以外は内容を保証しない。 + int getInt( const char* key, int defval ); + bool getBool( const char* key, bool defval ); + const char* getStr( const char* key, const char* defval ); + + // 書き込み + bool putStr( const char* key, const char* val ); + bool putInt( const char* key, int val ); + bool putBool( const char* key, bool val ); + +private: //-- 内部処理 ----------------------------------- + + kiPath m_FileName; + kiStr m_CurSec; + char m_StrBuf[256]; +}; + +#endif ADDED kilib/kl_rythp.cpp Index: kilib/kl_rythp.cpp ================================================================== --- kilib/kl_rythp.cpp +++ kilib/kl_rythp.cpp @@ -0,0 +1,399 @@ +//--- K.I.LIB --- +// kl_rythp.cpp : interpretor for simple script langauage 'Rythp' + +#include "stdafx.h" +#include "kilibext.h" + +//-------------------- Variant 型変数 --------------------------// + +int kiVar::getInt() +{ + int n=0; + bool minus = (*m_pBuf=='-'); + for( char* p = minus ? m_pBuf+1 : m_pBuf; *p; p=next(p) ) + { + if( '0'>*p || *p>'9' ) + return 0; + n = (10*n) + (*p-'0'); + } + return minus ? -n : n; +} + +kiVar& kiVar::quote() +{ + if( m_pBuf[0]=='\"' ) + return *this; + for( const char* p=m_pBuf; *p; p=next(p) ) + if( *p==' ' ) + break; + if( !(*p) ) + return *this; + + int ln=len()+1; + if( m_ALen=0 ) + { + if( *p=='(' && !(dqc&1) ) + kkc++; + else if( *p==')' && !(dqc&1) ) + kkc--; + else if( *p=='\"' ) + dqc++; + else if( *p=='%' ) + p++; + else if( (*p=='\t' || *p==' ' || *p=='\r' || *p=='\n') && kkc==0 && !(dqc&1) ) + return p; + p++; + } + return (kkc==0 && !(dqc&1)) ? p : NULL; +} + +bool kiRythpVM::split( char* buf, kiArray& argv, kiArray& argb, int& argc ) +{ + argv.empty(), argb.empty(), argc=0; + + for( char* p=buf; p=split_tonext(p); p++,argc++ ) + { + argv.add( p ); + argb.add( *p=='(' ); + + if( !(p=split_toend(p)) ) + return false; + + if( argv[argc][0]=='(' || argv[argc][0]=='"' ) + argv[argc]++, *(p-1)='\0'; + if( *p=='\0' ) + { + argc++; + break; + } + *p='\0'; + } + return true; +} + +//------------------------- 実行 -------------------------// + +void kiRythpVM::eval( char* str, kiVar* ans ) +{ + // 返値をクリアしておく + kiVar tmp,*aaa=&tmp; + if(ans) + *ans="",aaa=ans; + + // "function param1 param2 ..." 形式の文字列をパラメータに分割 + kiArray av; + kiArray ab; + int ac; + if( split( str,av,ab,ac ) && ac ) + { + // function名取得 + kiVar name; + getarg( av[0],ab[0],&name ); + + // function実行! + exec_function( name, av, ab, ac, aaa ); + } +} + +void kiRythpVM::getarg( char* a, bool b, kiVar* arg ) +{ + kiVar t; + const char* p; + + // (...) なら eval する。 + if( b ) + { + eval( a, &t ), *arg = t; + } + else + { + p = a; + + // 変数置き換え + *arg=""; + for( ; *p; *p && p++ ) + if( *p!='%' ) + { + *arg += *p; + } + else + { + p++, *arg+=ele[(*p)&0xff]; + } + } +} + +//------------------------- Minimum-Rythp環境 -------------------------// + +namespace { + static bool isIntStr( const char* str ) { + for(;*str;++str) + if( !('0'<=*str && *str<='9' || *str==',' || *str=='-') ) + return false; + return true; + } +} + +bool kiRythpVM::exec_function( const kiVar& name, + const kiArray& a, const kiArray& b,int c, kiVar* r ) +{ +// Minimum-Rythp で利用できる function は以下の通り。 +// exec, while, if, let, +, -, *, /, =, !, between, mod, <, > + + kiVar t; + int i,A,B,C; + +//----- ---- --- -- - - - +//-- (exec 実行文 実行文 ...) returns last-result +//----- ---- --- -- - - - + if( name=="exec" ) + { + for( i=1; i=3 ) + { + // (特殊処理)複数回呼ぶコードなのでコピらなきゃ駄目。 + int L1=ki_strlen(a[1]), L2=ki_strlen(a[2]); + char* tmp = new char[ 1 + (L1>L2 ? L1 : L2) ]; + while( getarg( ki_strcpy(tmp,a[1]), b[1], &t ), t.getInt()!=0 ) + getarg( ki_strcpy(tmp,a[2]), b[2], r ); + delete [] tmp; + } + } +//----- ---- --- -- - - - +//-- (if 条件 真なら [偽なら]) returns executed-result +//----- ---- --- -- - - - + else if( name=="if" ) + { + if( c>=3 ) + { + if( getarg( a[1],b[1],&t ), t.getInt()!=0 ) + getarg( a[2],b[2],r ); + else if( c>=4 ) + getarg( a[3],b[3],r ); + } + } +//----- ---- --- -- - - - +//-- (let 変数名 値 値 ...) returns new-value +//----- ---- --- -- - - - + else if( name=="let" ) + { + if( c>=2 ) + { + *r = ""; + for( i=2; i=3 ) + { + kiVar t2; + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t2), B=t2.getInt(); + if( isIntStr(t) && isIntStr(t2) ) + *r = A==B ? "1" : "0"; + else + *r = t==t2 ? "1" : "0"; + } + } +//----- ---- --- -- - - - +//-- (between 値A 値B 値C) returns A <= B <= C ? +//----- ---- --- -- - - - + else if( name=="between" ) + { + if( c>=4 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t), B=t.getInt(); + getarg(a[3],b[3],&t), C=t.getInt(); + *r = (A<=B && B<=C) ? "1" : "0"; + } + } +//----- ---- --- -- - - - +//-- (< 値A 値B) returns A < B ? +//----- ---- --- -- - - - + else if( name=="<" ) + { + if( c>=3 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t), B=t.getInt(); + *r = (A 値A 値B) returns A > B ? +//----- ---- --- -- - - - + else if( name==">" ) + { + if( c>=3 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t), B=t.getInt(); + *r = (A>B) ? "1" : "0"; + } + } +//----- ---- --- -- - - - +//-- (! 値A [値B]) returns A!=B ? or !A +//----- ---- --- -- - - - + else if( name=="!" ) + { + if( c>=2 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + if( c==2 ) + *r = A==0 ? "1" : "0"; + else + { + kiVar t2; + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t2), B=t2.getInt(); + if( isIntStr(t) && isIntStr(t2) ) + *r = A!=B ? "1" : "0"; + else + *r = t!=t2 ? "1" : "0"; + } + } + } +//----- ---- --- -- - - - +//-- (+ 値A 値B) returns A+B +//----- ---- --- -- - - - + else if( name=="+" ) + { + int A = 0; + for( i=1; isetInt(A); + } +//----- ---- --- -- - - - +//-- (- 値A 値B) returns A-B +//----- ---- --- -- - - - + else if( name=="-" ) + { + if( c >= 2 ) + { + getarg(a[1],b[1],&t); + int A = t.getInt(); + if( c==2 ) + A = -A; + else + for( i=2; isetInt(A); + } + else + r->setInt(0); + } +//----- ---- --- -- - - - +//-- (* 値A 値B) returns A*B +//----- ---- --- -- - - - + else if( name=="*" ) + { + int A = 1; + for( i=1; isetInt(A); + } +//----- ---- --- -- - - - +//-- (/ 値A 値B) returns A/B +//----- ---- --- -- - - - + else if( name=="/" ) + { + if( c>=3 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t), B=t.getInt(); + r->setInt( B ? A/B : A ); + } + } +//----- ---- --- -- - - - +//-- (mod 値A 値B) returns A%B +//----- ---- --- -- - - - + else if( name=="mod" ) + { + if( c>=3 ) + { + getarg(a[1],b[1],&t), A=t.getInt(); + getarg(a[2],b[2],&t), B=t.getInt(); + r->setInt( B ? A%B : 0 ); + } + } +//----- ---- --- -- - - - +//-- (slash 値A) returns A.replaceAll("\\", "/") +//----- ---- --- -- - - - + else if( name=="slash" ) + { + if( c>=2 ) + { + getarg(a[1],b[1],&t); + *r = (const char*)t; + r->replaceToSlash(); + } + } + else + return false; + return true; +} + ADDED kilib/kl_rythp.h Index: kilib/kl_rythp.h ================================================================== --- kilib/kl_rythp.h +++ kilib/kl_rythp.h @@ -0,0 +1,55 @@ +//--- K.I.LIB --- +// kl_rythp.h : interpretor for simple script langauage 'Rythp' + +#ifndef AFX_KIRYTHPVM_H__4F3C28A9_7EFE_4605_A149_2C0B9A9236E5__INCLUDED_ +#define AFX_KIRYTHPVM_H__4F3C28A9_7EFE_4605_A149_2C0B9A9236E5__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiVar : Rythp用のVariant変数型。ほとんどただのkiStr。 + +class kiVar : public kiStr +{ +public: + kiVar() : kiStr(20) {} + explicit kiVar( const char* s ) : kiStr( s, 20 ){} + explicit kiVar( const kiStr& s ) : kiStr( s, 20 ){} + explicit kiVar( const kiVar& s ) : kiStr( s, 20 ){} + void operator = ( const char* s ){ kiStr::operator =(s); } + + int getInt(); + kiVar& quote(); + kiVar& unquote(); +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiRythpVM : 最小限Rythp。実用には、派生して独自の exec_function を実装すべし + +class kiRythpVM +{ +public: + kiRythpVM(); + virtual ~kiRythpVM() {} + +public: + // eval + void eval( char* str, kiVar* ans=NULL ); + +protected: + // 引数を適当にevalや変数置き換えをした形で取得 + void getarg( char* a, bool b, kiVar* arg ); + + // function実行。[ bool=処理したか?、 name=function名、 a,b,c=引数、 r=返値 ] + virtual bool exec_function( const kiVar& name, + const CharArray& a, const BoolArray& b,int c, kiVar* r ); + +private: + // 変数 + kiVar ele[256]; + + // パラメータ分割 + static char* split_tonext( char* p ); + static char* split_toend( char* p ); + static bool split( char* buf, CharArray& argv, BoolArray& argb, int& argc ); +}; + +#endif ADDED kilib/kl_str.cpp Index: kilib/kl_str.cpp ================================================================== --- kilib/kl_str.cpp +++ kilib/kl_str.cpp @@ -0,0 +1,378 @@ +//--- K.I.LIB --- +// kl_str.cpp : string classes for K.I.LIB + +#include "stdafx.h" +#include "kilib.h" + + +//------------------------ 2byte文字処理用 ----------------------// + + +char kiStr::st_lb[256]; + +void kiStr::init() +{ + st_lb[0] = 0; + for( int c=1; c!=256; c++ ) + st_lb[c] = (::IsDBCSLeadByte(c) ? 2 : 1); +} + + +//-------------------------- コピー系色々 ------------------------// + + +kiStr::kiStr( int start_size ) +{ + (m_pBuf = new char[ m_ALen = start_size ])[0] = '\0'; +} + +kiStr::kiStr( const char* s, int min_size ) +{ + int slen = ki_strlen(s) + 1; + m_ALen = ( slen < min_size ) ? min_size : slen; + ki_memcpy( m_pBuf=new char[m_ALen], s, slen ); +} + +kiStr::kiStr( const kiStr& s ) +{ + ki_memcpy( m_pBuf=new char[m_ALen=s.m_ALen], s.m_pBuf, m_ALen=s.m_ALen ); +} + +kiStr& kiStr::operator = ( const kiStr& s ) +{ + if( this != &s ) + *this = (const char*)s; + return *this; +} + +kiStr& kiStr::operator = ( const char* s ) +{ + int slen = ki_strlen( s ) + 1; + int len = this->len(); + + if( m_ALen < slen || s <= m_pBuf+len || m_pBuf <= s+slen ) + { + char* tmp = new char[ m_ALen = ( m_ALen>slen ? m_ALen : slen) ]; + ki_memcpy( tmp, s, slen ); + delete [] m_pBuf; + m_pBuf = tmp; + } + else + ki_memcpy( m_pBuf, s, slen ); + return *this; +} + +kiStr& kiStr::operator += ( const char* s ) +{ + int slen = ki_strlen( s ) + 1; + int len = this->len(); + + if( m_ALen < len+slen+1 + || ( s <= m_pBuf && m_pBuf <= s+len ) + || ( m_pBuf <= s && s <= m_pBuf+slen ) ) + { + char* tmp = new char[ m_ALen = ( m_ALen>slen+len+1 ? m_ALen : slen+len+1) ]; + ki_memcpy( tmp, m_pBuf, len ); + delete [] m_pBuf; + m_pBuf = tmp; + } + + ki_memcpy( m_pBuf+len, s, slen ); + return *this; +} + +kiStr& kiStr::operator += ( char c ) +{ + int len = this->len(); + + if( m_ALen < len+2 ) + { + char* tmp = new char[ m_ALen=len+20 ]; + ki_memcpy( tmp, m_pBuf, len ); + delete [] m_pBuf; + m_pBuf = tmp; + } + + m_pBuf[len]=c, m_pBuf[len+1]='\0'; + return *this; +} + +kiStr& kiStr::setInt( int n, bool cm ) +{ + if( n==0 ) + m_pBuf[0] = '0', m_pBuf[1] = '\0'; + else + { + bool minus = (n<0); + if( minus ) + n= -n; + + char tmp[30]; + tmp[29]='\0'; + int i; + + for( i=28; i>=0; i-- ) + { + if( cm && (29-i)%4==0 ) + tmp[i--] = ','; + tmp[i] = '0' + n%10; + n /= 10; + if( n==0 ) + break; + } + + if( minus ) + tmp[--i] = '-'; + + (*this) = tmp+i; + } + return (*this); +} + +//-------------------------- 文字列処理全般 ------------------------// + + +kiStr::~kiStr() +{ + delete [] m_pBuf; +} + +kiStr::operator const char*() const +{ + return m_pBuf; +} + +bool kiStr::operator == ( const char* s ) const +{ + return 0==ki_strcmp( m_pBuf, s ); +} + +bool kiStr::isSame( const char* s ) const +{ + return 0==ki_strcmpi( m_pBuf, s ); +} + +int kiStr::len() const +{ + return ki_strlen( m_pBuf ); +} + + +//-------------------------- ユーティリティー ------------------------// + + +kiStr& kiStr::removeTrailWS() +{ + char* m=m_pBuf-1; + for( char *p=m_pBuf; *p!='\0'; p=next(p) ) + if( *p!=' ' && *p!='\t' && *p!='\n' ) + m = p; + *next(m) = '\0'; + return *this; +} + +kiStr& kiStr::loadRsrc( UINT id ) +{ + ::LoadString( GetModuleHandle(NULL), id, m_pBuf, m_ALen ); + return *this; +} + +void kiPath::beSpecialPath( int nPATH ) +{ + switch( nPATH ) + { + case Win: ::GetWindowsDirectory( m_pBuf, m_ALen ); break; + case Sys: ::GetSystemDirectory( m_pBuf, m_ALen ); break; + case Tmp: ::GetTempPath( m_ALen, m_pBuf ); break; + case Cur: ::GetCurrentDirectory( m_ALen, m_pBuf ); break; + case Exe_name: + ::GetModuleFileName( NULL, m_pBuf, m_ALen );break; + case Exe: + { + ::GetModuleFileName( NULL, m_pBuf, m_ALen ); + + char* m=NULL; + for( char *p=m_pBuf; *p!='\0'; p=next(p) ) + if( *p=='\\' ) + m = p; + if( m ) + *m='\0'; + break; + } + default: + { + *m_pBuf = '\0'; + + LPITEMIDLIST il; + if( NOERROR!=::SHGetSpecialFolderLocation( NULL, nPATH, &il ) ) + return; + ::SHGetPathFromIDList( il, m_pBuf ); + app()->shellFree( il ); + } + } +} + +void kiPath::beBackSlash( bool add ) +{ + char* last = m_pBuf; + for( char* p=m_pBuf; *p!='\0'; p=next(p) ) + last=p; + if( *last=='\\' || *last=='/' ) + { + if( !add ) + *last = '\0'; + } + else if( add && last!=m_pBuf ) + *this += '\\'; +} + +bool kiPath::beDirOnly() +{ + char* lastslash = m_pBuf-1; + for( char* p=m_pBuf; *p; p=next(p) ) + if( *p=='\\' || *p=='/' ) + lastslash = p; + + *(lastslash+1) = '\0'; + + return (lastslash+1 != m_pBuf); +} + +bool kiPath::isInSameDir(const char* q) const +{ + bool diff=false; + for( const char *p=m_pBuf; *p && *q; p=next(p), q=next(q) ) + if( *p != *q ) + diff = true; + else if( diff && (*p=='\\' || *p=='/' || *q=='\\' || *q=='/') ) + return false; + + const char* r = (*p ? p : q); + if( *r ) + for( ; *r; r=next(r) ) + if( *r=='\\' || *r=='/' ) + return false; + return true; +} + +void kiPath::beShortPath() +{ + ::GetShortPathName( m_pBuf, m_pBuf, m_ALen ); +} + +void kiPath::mkdir() +{ + for( char *p=m_pBuf; *p; p=kiStr::next(p) ) + { + if( (*p!='\\' && *p!='/') || (p-m_pBuf<=4) ) + continue; + *p = '\0'; + if( !kiSUtil::exist(m_pBuf) ) + if( ::CreateDirectory( m_pBuf, NULL ) ) + ::SHChangeNotify( SHCNE_MKDIR,SHCNF_PATH,(const void*)m_pBuf,NULL ); + *p = '\\'; + } +} + +void kiPath::remove() +{ + if( !kiSUtil::exist(*this) ) + return; + if( !kiSUtil::isdir(*this) ) + { + ::DeleteFile(*this); + return; + } + + // buf == filename with no last '\\' + kiPath buf(*this); + buf.beBackSlash(false); + + kiPath tmp(buf); + WIN32_FIND_DATA fd; + kiFindFile find; + find.begin( tmp += "\\*" ); + while( find.next( &fd ) ) + { + tmp = buf; + tmp += '\\'; + tmp += fd.cFileName; + tmp.remove(); + } + find.close(); + + ::RemoveDirectory( buf ); +} + +void kiPath::getBody( kiStr& str ) const +{ + char *p=const_cast(name()),*x,c; + for( x=(*p=='.'?p+1:p); *x; x=next(x) ) // 先頭の.は拡張子と見なさない + if( *x=='.' ) + break; + c=*x, *x='\0'; + str=p; + *x=c; +} + +void kiPath::getBody_all( kiStr& str ) const +{ +// 最後の拡張子だけ削る版 + char *p=const_cast(name()),*x=NULL, *n, c; + for( n=(*p=='.'?p+1:p); *n; n=next(n) ) // 先頭の.は拡張子と見なさない + if( *n=='.' ) + x = n; + if( !x )x = n; + + c =*x; + *x ='\0'; + str=p; + *x =c; +} + +const char* kiPath::ext( const char* str ) +{ + const char *ans = NULL, *p = name(str); + if( *p == '.' ) ++p; // 先頭の.は拡張子と見なさない + for( ; *p; p=next(p) ) + if( *p=='.' ) + ans = p; + return ans ? (ans+1) : p; +} + +const char* kiPath::ext_all( const char* str ) +{ + const char* p = name(str); + if( *p == '.' ) ++p; // 先頭の.は拡張子と見なさない + for( ; *p; p=next(p) ) + if( *p=='.' ) + return (p+1); + return p; +} + +const char* kiPath::name( const char* str ) +{ + const char* ans = str - 1; + for( const char* p=str; *p; p=next(p) ) + if( *p=='\\' || *p=='/' ) + ans = p; + return (ans+1); +} + +UINT kiPath::getDriveType() const +{ + char* p; + for( p=m_pBuf; *p=='\\'; p=next(p) ); + for( p=m_pBuf; *p && *p!='\\'; p=next(p) ); + char c=*(++p);*p='\0'; + UINT ans=::GetDriveType( m_pBuf ); + *p=c; return ans; +} + +bool kiPath::endwithyen( const char* str ) +{ + for( const char *p=str,*last=str; *p; p=next(p) ) + last=p; + return ( *last=='\\' || *last=='/' ); +} + ADDED kilib/kl_str.h Index: kilib/kl_str.h ================================================================== --- kilib/kl_str.h +++ kilib/kl_str.h @@ -0,0 +1,147 @@ +//--- K.I.LIB --- +// kl_str.h : string classes for K.I.LIB + +#ifndef AFX_KISTR_H__1932CA2C_ACA6_4606_B57A_ACD0B7D1D35B__INCLUDED_ +#define AFX_KISTR_H__1932CA2C_ACA6_4606_B57A_ACD0B7D1D35B__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiStr : 単純文字列 + +class kiStr +{ +friend void kilib_startUp(); + +private: //-- グローバルな初期化処理など --------------------- + + static void init(); + +public: //-- 外向きインターフェイス -------------------------- + + // 2byte文字の処理を高速化(したような気分) + static char* next( char* p ) + { return p+st_lb[(*p)&0xff]; } + static const char* next( const char* p ) + { return p+st_lb[(*p)&0xff]; } + static bool isLeadByte( char c ) + { return st_lb[c&0xff]==2; } + + // 初期化 + kiStr( int start_size = 100 ); + kiStr( const char* s, int min_size = 100 ); + explicit kiStr( const kiStr& s ); + + // 演算子 + kiStr& operator = ( const kiStr& ); + kiStr& operator = ( const char* s ); + kiStr& operator += ( const char* s ); + kiStr& operator += ( char c ); + bool operator == ( const char* s ) const; + bool isSame( const char* s ) const; + operator const char*() const; + int len() const; + void lower() + { ::CharLower(m_pBuf); } + void upper() + { ::CharUpper(m_pBuf); } + kiStr& setInt( int n, bool cm=false ); + void replaceToSlash() { + for(char* p=m_pBuf; *p; p=next(p)) + if(*p=='\\') + *p='/'; + } + + // リソースからロード + kiStr& loadRsrc( UINT id ); + + kiStr& removeTrailWS(); + +protected: //-- 派生クラス向け ----------------------------- + + char* m_pBuf; + int m_ALen; + +private: //-- 内部処理 ------------------------------------- + + static char st_lb[256]; + +public: + + virtual ~kiStr(); +}; + +inline const kiStr operator+(const kiStr& x, const kiStr& y) + { return kiStr(x) += y; } +inline const kiStr operator+(const char* x, const kiStr& y) + { return kiStr(x) += y; } +inline const kiStr operator+(const kiStr& x, const char* y) + { return kiStr(x) += y; } + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiPath : パス特有の処理用関数付き文字列 + +class kiPath : public kiStr +{ +public: //-- 外向きインターフェイス -------------------------- + + // 初期化 + kiPath() : kiStr( MAX_PATH ){} + explicit kiPath( const char* s ) : kiStr( s, MAX_PATH ){} + explicit kiPath( const kiStr& s ) : kiStr( s, MAX_PATH ){} + explicit kiPath( const kiPath& s ) : kiStr( s, MAX_PATH ){} + kiPath( int nPATH, bool bs = true ) : kiStr( MAX_PATH ) + { + beSpecialPath( nPATH ); + if( nPATH != Exe_name ) + beBackSlash( bs ); + } + + // operator + void operator = ( const char* s ){ kiStr::operator =(s); } + + // 特殊パス取得 + void beSpecialPath( int nPATH ); + enum { Win=0x1787, Sys, Tmp, Prg, Exe, Cur, Exe_name, + Snd=CSIDL_SENDTO, Dsk=CSIDL_DESKTOP, Doc=CSIDL_PERSONAL }; + + // 短いパス + void beShortPath(); + + // 最後のバックスラッシュ制御 + void beBackSlash( bool add ); + + // ディレクトリ名のみ + bool beDirOnly(); + // ファイル名except拡張子全部 + void getBody( kiStr& str ) const; + // ファイル名except拡張子一つ + void getBody_all( kiStr& str ) const; + + // 複数階層mkdir + void mkdir(); + // 複数階層rmdir + void remove(); + + // ドライブタイプ + UINT getDriveType() const; + // 同じディレクトリにあるかどうか + bool isInSameDir(const char* r) const; + + // [static] ディレクトリ情報を含まない、ファイル名のみ抽出 + static const char* name( const char* str ); + // [static] 最後の拡張子。無ければNULL + static const char* ext( const char* str ); + // [static] 拡張子全部。無ければNULL + static const char* ext_all( const char* str ); + // [static] \ / で終わるか否か + static bool endwithyen( const char* str ); + + // non-static-ver + const char* name() const + { return name(m_pBuf); } + const char* ext() const + { return ext(m_pBuf); } + const char* ext_all() const + { return ext_all(m_pBuf); } +}; + +#endif ADDED kilib/kl_wcmn.cpp Index: kilib/kl_wcmn.cpp ================================================================== --- kilib/kl_wcmn.cpp +++ kilib/kl_wcmn.cpp @@ -0,0 +1,121 @@ +//--- K.I.LIB --- +// kl_wcmn.h : windows-common-interface operatin + +#include "stdafx.h" +#include "kilib.h" + +void kiSUtil::switchCurDirToExeDir() +{ + char exepath[MAX_PATH+50]; + GetModuleFileName( NULL, exepath, MAX_PATH ); + char* lastslash = 0; + for( char* p=exepath; *p; p=CharNext(p) ) + if( *p=='\\' || *p=='/' ) + lastslash = p; + if(lastslash) + *lastslash = '\0'; + SetCurrentDirectory(exepath); +} + +static int CALLBACK __ki__ofp( HWND w, UINT m, LPARAM l, LPARAM d ) +{ + if( m==BFFM_INITIALIZED && d ) + ::SendMessage( w, BFFM_SETSELECTION, TRUE, d ); + return 0; +} + +bool kiSUtil::getFolderDlg( char* buf, HWND par, const char* title, const char* def ) +{ + // 情報セット + BROWSEINFO bi; + ki_memzero( &bi, sizeof(bi) ); + bi.hwndOwner = par; + bi.pszDisplayName = buf; + bi.lpszTitle = title; + bi.ulFlags = BIF_RETURNONLYFSDIRS | BIF_DONTGOBELOWDOMAIN; + bi.lpfn = __ki__ofp; + bi.lParam = (long)def; + + // ダイアログ表示 + ITEMIDLIST* id = ::SHBrowseForFolder( &bi ); + if( id==NULL ) + return false; + ::SHGetPathFromIDList( id, buf ); + app()->shellFree( id ); + + // 終了 + return true; +} + +void kiSUtil::getFolderDlgOfEditBox( HWND wnd, HWND par, const char* title ) +{ + char str[MAX_PATH]; + ::SendMessage( wnd, WM_GETTEXT, MAX_PATH, (LPARAM)str ); + for( char* x=str,*l=str; *x; x=kiStr::next(x) ) + l=x; + if( *l=='\\' || *l=='/' ) + *l='\0'; + if( getFolderDlg( str, par, title, str ) ) + ::SendMessage( wnd, WM_SETTEXT, 0, (LPARAM)str ); +} + +int kiSUtil::getSysIcon( const char* ext ) +{ + kiPath tmp( kiPath::Tmp ); + tmp += "noahicontest."; + tmp += ext; + + SHFILEINFO fi; + ::SHGetFileInfo( tmp, 0, &fi, sizeof(fi), + SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX ); + return fi.iIcon; +} + +void kiSUtil::msgLastError( const char* msg ) +{ + char* pMsg; + ::FormatMessage( + FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS, + NULL,::GetLastError(),MAKELANGID(LANG_NEUTRAL,SUBLANG_DEFAULT),(LPTSTR)&pMsg,0,NULL ); + if( msg ) + app()->msgBox( kiStr(msg) + "\r\n\r\n" + pMsg ); + else + app()->msgBox( pMsg ); + ::LocalFree( pMsg ); +} + +void kiSUtil::createShortCut( const kiPath& at, const char* name ) +{ + ::CoInitialize(NULL); + + IShellLink* psl; + if( SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl)) ) + { + psl->SetPath( kiPath(kiPath::Exe_name) ); + psl->SetWorkingDirectory( kiPath(kiPath::Exe,false) ); + + IPersistFile* ppf; + if( SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf)) ) + { + wchar_t wsz[MAX_PATH]; + kiPath lnkfile( at ); + lnkfile += name, lnkfile += ".lnk"; + ::MultiByteToWideChar(CP_ACP,0,lnkfile,-1,wsz,MAX_PATH); + ppf->Save(wsz,TRUE); + ppf->Release(); + } + psl->Release(); + } + ::CoUninitialize(); +} + +bool kiSUtil::exist( const char* fname ) +{ + return 0xffffffff != ::GetFileAttributes( fname ); +} + +bool kiSUtil::isdir( const char* fname ) +{ + DWORD attr = ::GetFileAttributes( fname ); + return attr!=0xffffffff && (attr&FILE_ATTRIBUTE_DIRECTORY); +} ADDED kilib/kl_wcmn.h Index: kilib/kl_wcmn.h ================================================================== --- kilib/kl_wcmn.h +++ kilib/kl_wcmn.h @@ -0,0 +1,46 @@ +//--- K.I.LIB --- +// kl_wcmn.h : windows-common-interface operatin + +#ifndef AFX_KIWINCOMMON_H__0686721C_CAFB_4C2C_9FE5_0F482EA6A60B__INCLUDED_ +#define AFX_KIWINCOMMON_H__0686721C_CAFB_4C2C_9FE5_0F482EA6A60B__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// シェルユーティリティークラス + +class kiSUtil +{ +public: + // カレントディレクトリ退避 + static void switchCurDirToExeDir(); + + // 「フォルダの選択」ダイアログ + static bool getFolderDlg( char* buf, HWND par, const char* title, const char* def ); + static void getFolderDlgOfEditBox( HWND wnd, HWND par, const char* title ); + + // 対応する拡張子用アイコンの、システムイメージリストのインデックスを返す。 + static int getSysIcon( const char* ext ); + + // 最後のエラーを表示 + static void msgLastError( const char* msg = NULL ); + + // 自分へのショートカット作成 + static void createShortCut( const kiPath& at, const char* name ); + + // ファイルが存在する? + static bool exist( const char* fname ); + static bool isdir( const char* fname ); + + // カレントディレクトリを安全なところに移してLoadLibrary + static HMODULE loadLibrary(LPCTSTR lpFileName) + { + char original_cur[MAX_PATH], sys[MAX_PATH]; + ::GetCurrentDirectory(MAX_PATH, original_cur); + ::GetSystemDirectory(sys, MAX_PATH); + ::SetCurrentDirectory(sys); + HMODULE han = ::LoadLibrary(lpFileName); + ::SetCurrentDirectory(original_cur); + return han; + } +}; + +#endif ADDED kilib/kl_wnd.cpp Index: kilib/kl_wnd.cpp ================================================================== --- kilib/kl_wnd.cpp +++ kilib/kl_wnd.cpp @@ -0,0 +1,450 @@ +//--- K.I.LIB --- +// kl_wnd.cpp : window information manager + +#include "stdafx.h" +#include "kilib.h" + + +//-------- Windowを作成時に HWND に kiWindow* をセットするための処理 -------// + + +kiWindow* kiWindow::st_pCurInit = NULL; + HHOOK kiWindow::st_hHook = NULL; + +void kiWindow::init() +{ + // CreateWindow 用フック設置 + st_hHook = ::SetWindowsHookEx( WH_CBT, &CBTProc, NULL, ::GetCurrentThreadId() ); +} + +void kiWindow::finish() +{ + // CreateWindow 用フック解除 + ::UnhookWindowsHookEx( st_hHook ); +} + +LRESULT CALLBACK kiWindow::CBTProc( int code, WPARAM wp, LPARAM lp ) +{ + if( code == HCBT_CREATEWND ) + { + if( st_pCurInit ) + { + // k.i.lib のウインドウが CreateWindow された場合 + st_pCurInit->setHwnd( (HWND)wp ); + ::SetWindowLong( (HWND)wp, GWL_USERDATA, (LONG)st_pCurInit ); + st_pCurInit = NULL; + } + else + ::SetWindowLong( (HWND)wp, GWL_USERDATA, 0 ); + } + + return ::CallNextHookEx( st_hHook, code, wp, lp ); +} + +void kiWindow::detachHwnd() +{ + ::SetWindowLong( hwnd(), GWL_USERDATA, 0 ); + if( this == app()->mainwnd() ) + app()->setMainWnd( NULL ); + setHwnd( NULL ); +} + + +//------------ Window にまつわるエトセトラな処理 (static) ---------------// + + +bool kiWindow::loopbreaker = false; + +void kiWindow::msg() +{ + for( MSG msg; ::PeekMessage( &msg,NULL,0,0,PM_REMOVE ); ) + ::TranslateMessage( &msg ), ::DispatchMessage( &msg ); +} + +void kiWindow::msgLoop( msglooptype type ) +{ + kiWindow* wnd; + MSG msg; + while( !loopbreaker && + type==GET ? ::GetMessage( &msg,NULL,0,0 ) + : ::PeekMessage( &msg,NULL,0,0,PM_REMOVE ) ) + { + if( wnd = app()->mainwnd() ) + { + if( wnd->m_hAccel ) + if( ::TranslateAccelerator( wnd->hwnd(), wnd->m_hAccel, &msg ) ) + continue; + if( msg.message!=WM_CHAR && wnd->isDlgMsg( &msg ) ) + continue; + } + ::TranslateMessage( &msg ), ::DispatchMessage( &msg ); + } + loopbreaker = false; +} + +void kiWindow::setFront( HWND wnd ) +{ + const OSVERSIONINFO& v = app()->osver(); + + // Win2000 以上 or Win98 以上 + if( ( v.dwPlatformId==VER_PLATFORM_WIN32_NT && v.dwMajorVersion>=5 ) + || ( v.dwPlatformId==VER_PLATFORM_WIN32_WINDOWS && + v.dwMajorVersion*100+v.dwMinorVersion>=410 ) ) + { + DWORD pid; + DWORD th1 = ::GetWindowThreadProcessId( ::GetForegroundWindow(), &pid ); + DWORD th2 = ::GetCurrentThreadId(); + ::AttachThreadInput( th2, th1, TRUE ); + ::SetForegroundWindow( wnd ); + ::AttachThreadInput( th2, th1, FALSE ); + ::BringWindowToTop( wnd ); + } + else // 古いWin + ::SetForegroundWindow( wnd ); + + // Special Thanks To kazubon !! ( the author of TClock ) +} + +void kiWindow::setCenter( HWND wnd, HWND rel ) +{ + RECT rc,pr; + ::GetWindowRect( wnd, &rc ); + + if( rel ) + ::GetWindowRect( rel, &pr ); + else + ::SystemParametersInfo( SPI_GETWORKAREA, 0, &pr, 0 ); + + ::SetWindowPos( wnd, 0, + pr.left + ( (pr.right-pr.left)-(rc.right-rc.left) )/2, + pr.top + ( (pr.bottom-pr.top)-(rc.bottom-rc.top) )/2, + 0, 0, SWP_NOSIZE|SWP_NOZORDER ); +} + + +//------------------ Windowベースクラスとしての処理 ----------------------// + + +kiWindow::kiWindow() +{ + m_hWnd = NULL; + m_hAccel = NULL; + app()->shellInit(); +} + +kiWindow::~kiWindow() +{ + if( m_hWnd && ::IsWindow( m_hWnd ) ) + { + ::SetWindowLong( m_hWnd, GWL_USERDATA, 0 ); + ::DestroyWindow( m_hWnd ); + } +} + +void kiWindow::loadAccel( UINT id ) +{ + m_hAccel = ::LoadAccelerators( app()->inst(), MAKEINTRESOURCE(id) ); +} + + +//---------------- スタンドアロンのWindowの処理 ---------------------// + +// …未完成… + +//---------------------------- Dialog -----------------------------// + + +kiDialog::kiDialog( UINT id ) +{ + m_Rsrc = id; +} + +void kiDialog::doModal( HWND parent ) +{ + setState( true ); + preCreate( this ); + + ::DialogBoxParam( app()->inst(), MAKEINTRESOURCE(m_Rsrc), + parent, commonDlg, (LPARAM)this ); +} + +void kiDialog::createModeless( HWND parent ) +{ + setState( false ); + preCreate( this ); + + ::CreateDialogParam( app()->inst(), MAKEINTRESOURCE(m_Rsrc), + parent, commonDlg, (LPARAM)this ); + + ::ShowWindow( hwnd(), SW_SHOW ); + ::UpdateWindow( hwnd() ); +} + +void kiDialog::end( UINT endcode ) +{ + setEndCode( endcode ); + + if( isModal() ) + ::EndDialog( hwnd(), getEndCode() ); + else + ::DestroyWindow( hwnd() ); +} + +BOOL kiDialog::commonDlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ) +{ + // kiDialog インターフェイスへのポインタを取得 + kiDialog* ptr = (kiDialog*)::GetWindowLong( dlg, GWL_USERDATA ); + if( !ptr ) return FALSE; + + // WM_INITDIALOG なら onInit を呼ぶ + if( msg == WM_INITDIALOG ) + return ptr->onInit(); + + // OK / Cancel 処理 + else if( msg == WM_COMMAND ) + { + switch( LOWORD(wp) ) + { + case IDOK: + if( ptr->onOK() ) + ptr->end( IDOK ); + return TRUE; + case IDCANCEL: + if( ptr->onCancel() ) + ptr->end( IDCANCEL ); + return TRUE; + } + } + + // 普通のメッセージ + BOOL ans = ptr->proc( msg, wp, lp ); + + // WM_DESTORY ならウインドウハンドル切り離し + if( msg == WM_DESTROY ) + ptr->detachHwnd(); + + return ans; +} + + +//------------------------ PropertySheet -------------------------// + + +kiPropSheet* kiPropSheet::st_CurInitPS = NULL; + +kiPropSheet::kiPropSheet() : kiDialog( 0 ) +{ + ki_memzero( &m_Header, sizeof(m_Header) ); + m_Header.dwSize = sizeof(m_Header); + m_Header.dwFlags |=PSH_USECALLBACK | PSH_PROPSHEETPAGE; + m_Header.pfnCallback = main_initProc; + m_Header.hInstance = app()->inst(); + m_Header.nStartPage = 0; +} + +void kiPropSheet::begin() +{ + int l = m_Pages.len(); + PROPSHEETPAGE* ppsp = new PROPSHEETPAGE[ l ]; + ki_memzero( ppsp, sizeof(PROPSHEETPAGE)*l ); + + for( int i=0; iinst(); + ppsp[i].pfnCallback = page_initProc; + ppsp[i].pfnDlgProc = page_cmmnProc; + ppsp[i].dwFlags = PSP_USECALLBACK | PSP_HASHELP; + m_Pages[i]->setInfo( ppsp+i ); + } + + m_Header.ppsp = ppsp; + m_Header.nPages = l; + + st_CurInitPS = this; + PropertySheet( &m_Header ); + delete [] ppsp; +} + +void kiPropSheet::doModal( HWND parent ) +{ + m_Header.dwFlags &= (~PSH_MODELESS); + setState( true ); + begin(); +} + +void kiPropSheet::createModeless( HWND parent ) +{ + m_Header.dwFlags |= PSH_MODELESS; + setState( false ); + begin(); +} + +void kiPropSheet::end( UINT endcode ) +{ + // 終了コードセット + setEndCode( endcode ); + + // サブクラス化解除 + ::SetWindowLong( hwnd(), GWL_WNDPROC, (LONG)m_DefProc ); + + // 終了 + if( isModal() ) // サブクラス化解除してるので、再度 end が呼ばれることはないはず。 + ::PostMessage( hwnd(), WM_COMMAND, IDCANCEL, 0 ); + else + ::DestroyWindow( hwnd() ); + + // WM_DESTROY時相当の動作 + detachHwnd(); +} + +LRESULT CALLBACK kiPropSheet::main_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ) +{ + kiPropSheet* ptr = (kiPropSheet*)::GetWindowLong( dlg, GWL_USERDATA ); + if( !ptr ) + return 0; + + // まずデフォルトの処理 + LRESULT result = ::CallWindowProc( ptr->m_DefProc, dlg, msg, wp, lp ); + + // ×ボタンはキャンセル扱い + if( msg==WM_SYSCOMMAND && wp==SC_CLOSE ) + ::PostMessage( dlg, WM_COMMAND, IDCANCEL, 0 ); + + // コマンド処理 + else if( msg==WM_COMMAND ) + { + switch( LOWORD(wp) ) + { + case IDOK: + if( ptr->onOK() ) + ptr->end( IDOK ); + return TRUE; + case IDCANCEL: + if( ptr->onCancel() ) + ptr->end( IDCANCEL ); + return TRUE; + case IDAPPLY: + ptr->onApply(); + break; + case ID_KIPS_HELP: + ptr->onHelp(); + break; + default: + ptr->onCommand( LOWORD(wp) ); + break; + } + } + + // ドラッグ&ドロップ + else if( msg==WM_DROPFILES ) + ptr->onDrop( (HDROP)wp ); + + return result; +} + +struct DLGTEMPLATEEX +{ + WORD dlgVer; + WORD signature; + DWORD helpID; + DWORD exStyle; + DWORD style; + WORD cDlgItems; + short x; + short y; + short cx; + short cy; +}; + +int CALLBACK kiPropSheet::main_initProc( HWND dlg, UINT msg, LPARAM lp ) +{ + if( msg == PSCB_PRECREATE ) + { + // スタイルを指すDWORDのアドレスを取得 + DWORD* pst = ( 0xffff==((DLGTEMPLATEEX*)lp)->signature ) ? + &(((DLGTEMPLATEEX*)lp)->style) : &(((DLGTEMPLATE*)lp)->style); + // ヘルプボタンを消して最小化ボタンを付ける + (*pst) &= ~DS_CONTEXTHELP; + (*pst) |= WS_MINIMIZEBOX; + + preCreate( st_CurInitPS ); + } + else if( msg == PSCB_INITIALIZED ) + { + // 何故か出来てしまう余計なメニューを削除 + HMENU sysm = ::GetSystemMenu( dlg, FALSE ); + ::DeleteMenu( sysm, SC_SIZE, MF_BYCOMMAND ); + ::DeleteMenu( sysm, SC_MAXIMIZE, MF_BYCOMMAND ); + + // 起動時はウインドウを必ず前面へ + setFront( dlg ); + + //サブクラス化する + st_CurInitPS->m_DefProc = (WNDPROC)::SetWindowLong( dlg, GWL_WNDPROC, (LONG)main_cmmnProc ); + st_CurInitPS->onInit(); + } + return 0; +} + +BOOL kiPropSheet::page_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ) +{ + kiPropSheetPage* ptr = (kiPropSheetPage*)::GetWindowLong( dlg, GWL_USERDATA ); + if( !ptr ) + return FALSE; + + // ここで、共通処理 + switch( msg ) + { + case WM_INITDIALOG: + return ptr->onInit(); + + case WM_NOTIFY: + switch( ((NMHDR*)lp)->code ) + { + case PSN_APPLY: + ptr->onOK(); + return TRUE; + } + break; + + case WM_COMMAND: + if( lp ) + switch( HIWORD(wp) ) + { + case BN_CLICKED: + if((HWND)lp==::GetFocus()) + case EN_CHANGE: + case CBN_SELCHANGE: + PropSheet_Changed( ptr->parent()->hwnd(), dlg ); + } + break; + + case WM_DESTROY: + BOOL ans=ptr->proc( msg, wp, lp ); + ptr->detachHwnd(); + return ans; + } + + return ptr->proc( msg, wp, lp ); +} + +UINT CALLBACK kiPropSheet::page_initProc( HWND dlg, UINT msg, LPPROPSHEETPAGE ppsp ) +{ + if( msg == PSPCB_CREATE ) + preCreate( (kiWindow*)(ppsp->lParam) ); + return TRUE; +} + +void kiPropSheetPage::setInfo( PROPSHEETPAGE* p ) +{ + p->pszTemplate = MAKEINTRESOURCE( getRsrcID() ); + p->lParam = (LPARAM)this; + + if( m_hIcon ) + { + p->dwFlags|= PSP_USEHICON; + p->hIcon = m_hIcon; + } +} + ADDED kilib/kl_wnd.h Index: kilib/kl_wnd.h ================================================================== --- kilib/kl_wnd.h +++ kilib/kl_wnd.h @@ -0,0 +1,348 @@ +//--- K.I.LIB --- +// kl_wnd.h : window information manager + +#ifndef AFX_KIWINDOW_H__26105B94_1E36_42FA_8916_C2F7FB9EF994__INCLUDED_ +#define AFX_KIWINDOW_H__26105B94_1E36_42FA_8916_C2F7FB9EF994__INCLUDED_ + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiWindow : Windowの簡単な管理 + +class kiWindow +{ +friend void kilib_startUp(); + +private: //-- グローバルな初期化処理など --------------------- + + static void init(); + static void finish(); + +public: //-- 外向きインターフェイス -------------------------- + + // 関連付けられているHWND + HWND hwnd() + { + return m_hWnd; + } + + // そのWindow用にアクセラレータをロード + void loadAccel( UINT id ); + + // ウインドウがまだ残っているかどうかチェック + bool isAlive() + { + if( !m_hWnd ) + return false; + if( ::IsWindow(m_hWnd) ) + return true; + m_hWnd = NULL; + return false; + } + + // 親 + kiWindow* parent() + { + return kiwnd( ::GetParent( hwnd() ) ); + } + + // メッセージ送信 + int sendMsg( UINT msg, WPARAM wp=0, LPARAM lp=0 ) + { + return ::SendMessage( hwnd(), msg, wp, lp ); + } + + // [static] キューにあるメッセージを全て処理 + static void msg(); + + // [static] メッセージループをまわす。 + enum msglooptype {PEEK, GET}; + static void msgLoop( msglooptype type = GET ); + + // [static] Windowを強制的に front へ + static void setFront( HWND wnd ); + + // [static] Windowを中央へ + static void setCenter( HWND wnd, HWND rel=NULL ); + + // [static] HWND -> kiWindow ( もしあれば ) + static kiWindow* kiwnd( HWND wnd ) + { + kiWindow* ptr = (kiWindow*)::GetWindowLong( wnd, GWL_USERDATA ); + if( !ptr ) return NULL; + if( ::IsBadCodePtr((FARPROC)&ptr) ) return NULL; + return ptr; + } + +protected: //-- 派生クラス向け ----------------------------- + + // 派生クラスは、作成直前にコレを呼ぶこと。 + static void preCreate( kiWindow* wnd ) + { st_pCurInit = wnd; } + // 破棄直前にコレを呼ぶこと。 + void detachHwnd(); + // いったんGET/POSTメッセージループを停止 + static void loopbreak() + { + loopbreaker = true; + } + +private: //-- 内部処理 ------------------------------------- + + // ウインドウハンドル設定 + static LRESULT CALLBACK CBTProc( int code, WPARAM wp, LPARAM lp ); + static HHOOK st_hHook; + static kiWindow* st_pCurInit; + void setHwnd( HWND wnd ) + { + m_hWnd = wnd; + } + + // ウインドウ情報保持用変数 + HWND m_hWnd; + HACCEL m_hAccel; + // ダイアログメッセージ + virtual bool isDlgMsg( MSG* msg ) + { return false; } + // GETループ一時抜けだし + static bool loopbreaker; + +protected: + kiWindow(); +public: + virtual ~kiWindow(); +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiDialog : DialogをkiWindowとして管理する + +class kiDialog : public kiWindow +{ +public: //-- 外向きインターフェイス -------------------------- + + // モーダルダイアログとして実行 + virtual void doModal( HWND parent=NULL ); + + // モードレスダイアログとして作成 + virtual void createModeless( HWND parent=NULL ); + + // 終了コード取得 + UINT getEndCode() + { + return m_EndCode; + } + + // モーダルか否か + bool isModal() + { + return m_bStateModal; + } + + // ダイアログアイテム + int sendMsgToItem( UINT id, UINT msg, WPARAM wp=0, LPARAM lp=0 ) + { + return ::SendDlgItemMessage( hwnd(), id, msg, wp, lp ); + } + HWND item( UINT id ) + { + return ::GetDlgItem( hwnd(), id ); + } + +protected: //-- 派生クラス向け ----------------------------- + + // リソースIDで初期化 + kiDialog( UINT id ); + + // リソースID取得 + UINT getRsrcID() + { + return m_Rsrc; + } + + // 終了コードをセット + void setEndCode( UINT endcode ) + { + m_EndCode = endcode; + } + + // モーダルか否かのフラグ"のみ"を切替 + void setState( bool modal ) + { + m_bStateModal = modal; + } + + // 終了コードをセットして、終了する( IDOK を渡しても onOK() は呼ばれないことに注意! ) + virtual void end( UINT endcode ); + + // コマンド・メッセージ発生時に呼ばれる + + // OK -> onOK -> if true end(IDOK) + virtual bool onOK() {return true;} + // 取消 -> onCancel -> if true end(IDCANCEL) + virtual bool onCancel() {return true;} + // WM_INITDIALOG -> onInit + virtual BOOL onInit() {return FALSE;} + // WM_???? -> proc + virtual BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) {return FALSE;} + +private: //-- 内部処理 ------------------------------------- + + UINT m_EndCode; + UINT m_Rsrc; + bool m_bStateModal; + bool isDlgMsg( MSG* msg ) + { + return (!!::IsDialogMessage( hwnd(), msg )); + } + static BOOL CALLBACK commonDlg( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ); +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiPropSheet : PropertySheetをkiWindowとして管理する。 + +#define IDAPPLY (0x3021) +#define ID_KIPS_HELP (0x0009) + +class kiPropSheetPage : public kiDialog +{ +friend class kiPropSheet; + +protected: //-- 派生クラス向け ---------------------------- + + // ダイアログやアイコンのIDで初期化 + kiPropSheetPage( UINT dlgid ) + : kiDialog( dlgid ), m_hIcon( NULL ) {} + void setIcon( HICON h ) + { m_hIcon = h; } + + // OK/適用 -> page::onOK -> sheet::onOK -> (if ok 終了) + // virtual bool onOK() + // WM_INITDIALOG + // virtual BOOL onInit() + // その他 + // virtual BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) + +private: //-- 内部処理 ------------------------------------- + + void end( UINT endcode ) {} + void setInfo( PROPSHEETPAGE* p ); + HICON m_hIcon; +}; + +class kiPropSheet : public kiDialog +{ +friend class kiPropSheetPage; + +public: //-- 外向きインターフェイス -------------------------- + + // モーダルダイアログとして実行 + void doModal( HWND parent ); + + // モードレスダイアログとして作成 + void createModeless( HWND parent ); + +protected: //-- 派生クラス向け ---------------------------- + + // コンストラクタ辺りで↓これをいじるべし + PROPSHEETHEADER m_Header; + kiArray m_Pages; + + // 終了 + void end( UINT endcode ); + // + void sendOK2All() + { + for( unsigned int i=0;i!=m_Pages.len(); i++ ) + if( m_Pages[i]->isAlive() ) + m_Pages[i]->onOK(); + } + + // OK/適用 -> page::onOK -> sheet::onOK -> (if ok 終了) + // virtual void onOK() + // キャンセル -> sheet::onCancel -> 終了 + // virtual void onCancel() + // PSCB_INITIALIZED + // virtual BOOL onInit() + // 適用 + virtual void onApply() {} + // ヘルプ + virtual void onHelp() {} + // その他コマンド + virtual void onCommand( UINT id ) {} + // ファイルドロップ + virtual void onDrop( HDROP hdrop ) {} + +private: //-- 内部処理 --------------------------------------- + + void begin(); + bool m_bStateModal; + + static kiPropSheet* st_CurInitPS; + WNDPROC m_DefProc; + bool isDlgMsg( MSG* msg ) + { return !!PropSheet_IsDialogMessage( hwnd(),msg ); } + static int CALLBACK main_initProc( HWND dlg, UINT msg, LPARAM lp ); + static LRESULT CALLBACK main_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ); + static BOOL CALLBACK page_cmmnProc( HWND dlg, UINT msg, WPARAM wp, LPARAM lp ); + static UINT CALLBACK page_initProc( HWND dlg, UINT msg, LPPROPSHEETPAGE ppsp ); + +protected: + kiPropSheet(); +public: + ~kiPropSheet() + { for( unsigned int i=0; i!=m_Pages.len(); i++ ) delete m_Pages[i]; } +}; + +/*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*=*/ +// kiListView : ListViewコントロールの簡単なラッパ + +class kiListView +{ +public: + kiListView( kiDialog* dlg, UINT id ) + { + m_hWnd = ::GetDlgItem( dlg->hwnd(), id ); + } + + void insertColumn( int y, const char* title, + int width=100, int fmt=LVCFMT_LEFT ) + { + LVCOLUMN col; + col.mask = LVCF_TEXT | LVCF_FMT | LVCF_WIDTH; + col.pszText = const_cast(title); + col.cx = width; + col.fmt = fmt; + ::SendMessage( m_hWnd, LVM_INSERTCOLUMN, y, (LPARAM)&col ); + } + + void insertItem( int x, const char* str, LPARAM param=0, int iImage=-1 ) + { + LVITEM item; + item.mask = LVIF_TEXT | LVIF_PARAM | (iImage!=-1 ? LVIF_IMAGE : 0); + item.pszText = const_cast(str); + item.iItem = x; + item.iSubItem = 0; + item.iImage = iImage; + item.lParam = param; + ::SendMessage( m_hWnd, LVM_INSERTITEM, 0, (LPARAM)&item ); + } + + void setSubItem( int x, int y, const char* str ) + { + LVITEM item; + item.mask = LVIF_TEXT; + item.pszText = const_cast(str); + item.iItem = x; + item.iSubItem = y; + ::SendMessage( m_hWnd, LVM_SETITEM, 0, (LPARAM)&item ); + } + + void setImageList( HIMAGELIST Large, HIMAGELIST Small ) + { + ::SendMessage( m_hWnd, LVM_SETIMAGELIST, LVSIL_NORMAL, (LPARAM)Large ); + ::SendMessage( m_hWnd, LVM_SETIMAGELIST, LVSIL_SMALL, (LPARAM)Small ); + } + +private: + HWND m_hWnd; +}; + +#endif ADDED manifest.xml Index: manifest.xml ================================================================== --- manifest.xml +++ manifest.xml @@ -0,0 +1,8 @@ + + + + DnD Melter/Freezer + + + + ADDED stdafx.cpp Index: stdafx.cpp ================================================================== --- stdafx.cpp +++ stdafx.cpp @@ -0,0 +1,3 @@ +// stdafx.cpp : to make Pre-Compiled-Header(pch) file + +#include "stdafx.h" ADDED stdafx.h Index: stdafx.h ================================================================== --- stdafx.h +++ stdafx.h @@ -0,0 +1,20 @@ +// stdafx.h : frequently used headers + +#ifndef AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +// windows general header +#undef WINVER +#define WINVER 0x0400 +#undef _WIN32_IE +#define _WIN32_IE 0x0200 +#include +#include + +// shell header +#include + +// k.i.lib +#include "kilib/kilibext.h" + +#endif ADDED unacedef.h Index: unacedef.h ================================================================== --- unacedef.h +++ unacedef.h @@ -0,0 +1,2222 @@ +#ifndef __UNACEDEF_H_BY_K_INABA__ +#define __UNACEDEF_H_BY_K_INABA__ +#ifdef __cplusplus + extern "C" { +#endif + +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ=====--- Part 1: different structures ---====ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //--------------------------------------------------------------------------- + // + // Here in different structures used at callback functions and + // ACE.DLL functions are declared. + // + //--------------------------------------------------------------------------- + // + // Contents: + // Part 1.1: structures used in callback structures + // Part 1.2: structures used in function structures + // + //--------------------------------------------------------------------------- + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //========--- Part 1.1: structures used in callback structures ---========= + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //トトトトトトトトトトトトトトトトトトトトトトト comment buffer structure トトトトトトトトトトトトトトトトトトトトトト + // Used in tACEGlobalDataStruc. Application has to specify where the + // comment is or should be stored. + //------------------------------------------------------------------------- + + typedef struct sACECommentStruc + { + LPSTR Buf; // area where the comments are stored + // by the application or by the Dll + // comments must be zero-terminated + ULONG BufSize; // size of this area + ULONG State; // state of comment - see ACE_COMMENT + // constants below + } tACECommentStruc, + *pACECommentStruc; + + + //----------------------------------------------------------------------- + // Defines for the tACECommentStruc.State field, which tells about + // the result of the last comment extraction. + //----------------------------------------------------------------------- + + #define ACE_COMMENT_OK 0 // comment extraction went fine + + #define ACE_COMMENT_SMALLBUF 1 // comment buffer too small to + // store the whole comment in + + #define ACE_COMMENT_NONE 255 // No comment present + + + //トトトトトトトトトトトトトトトトトトトトトトト global data structure トトトトトトトトトトトトトトトトトトトトトトトトト + // This structure contains information for the Dll being interesting for + // nearly all functions. The Dll has to be initialized with this + // structure passed to tACEInitDll(). This structure is also passed + // by the callback functions. + //------------------------------------------------------------------------- + + //--------------------------------------------------------------- + // Forward declarations of callback function parameters + // used in this structure. + //--------------------------------------------------------------- + + typedef union sACEInfoCallbackProcStruc + *pACEInfoCallbackProcStruc; + + typedef union sACEErrorCallbackProcStruc + *pACEErrorCallbackProcStruc; + + typedef union sACERequestCallbackProcStruc + *pACERequestCallbackProcStruc; + + typedef union sACEStateCallbackProcStruc + *pACEStateCallbackProcStruc; + + + typedef struct sACEGlobalDataStruc + { + //------------------------ fields for ACE and UnACE ------------------- + + void *Obj; // ---- reserved for application! ---- + // thought to be used as a pointer to + // an object; when a callback-function is + // called, the object pointer can be used to + // handle the callback in a specific way; + // the pointer has to be initialized by + // ACEInitDll() + + ULONG MaxArchiveTestBytes; + + // how many bytes of a file should be + // looked upon at archive header search? + + ULONG MaxFileBufSize; + + // maximum buffer size for buffered + // I/O operations + + tACECommentStruc // used to exchange comment data + Comment; // between application and Dll + // using callback functions + + LPSTR DecryptPassword; + + // the DecryptPassword specified at + // ACEInitDll() is overwritten by the + // DecryptPassword field of tACEAddStruc and + // other function-specific structures; + // but this field can be used to change the + // password at callback function calls + + BOOL UseVBStructures; // passes structures to callback functions + // much better suited for Visual Basic + + CHAR Reserved1[60]; // has to be filled with zeros + + //--------------------------- fields for ACE only --------------------- + + LPSTR EncryptPassword; + + // things stated at the description of the + // DecryptPassword field apply here as well + + + LPSTR TempDir; // directory to save temporary archive + + //-------- registration (ACE DLLs only, but not used at ACL) ---------- + + LPSTR KeyPath; // necessary for reading and writing key file + + LPSTR UserAV; // Dll returns the AV string (if registered) + // in this field + + LPSTR IsGeneralKey; // DLL returns the key, if it is a general key + + HWND OwnerWindow; // specifies the applications window to be + // parent of the registration reminder dialog + + //--------------------------- fields for ACE only --------------------- + + ULONG CompressionLevel; + // contains the currently used compression + // level - may be changed during compression + // operation + + CHAR Reserved2[56]; // has to be filled with zeros + + + //---------------------- callback functions (ACE and UnACE) ---------- + + INT (__stdcall *InfoCallbackProc) + (pACEInfoCallbackProcStruc Info); + + // Informs application about details like the + // creation of a temporary archive. + // See ACE_CALLBACK_INFO definitions for + // more information. + + INT (__stdcall *ErrorCallbackProc) + (pACEErrorCallbackProcStruc Error); + + // Called to let the application know about + // errors. The Code field of Error will + // contain an ACE_CALLBACK_ERROR value. + + INT (__stdcall *RequestCallbackProc) + (pACERequestCallbackProcStruc Request); + + // Called to let the application know about + // requests for data. Code will contain an + // ACE_CALLBACK_REQUEST value. + + INT (__stdcall *StateCallbackProc) + (pACEStateCallbackProcStruc State); + + // Called to let the application know about + // the progress of operations. + + + //-------------------------- different new fields --------------------- + CHAR Reserved3[64]; // has to be filled with zeros + } tACEGlobalDataStruc, + *pACEGlobalDataStruc; + + + //トトトトトトトトトトトトトトトトトトトトトトト archive data structure トトトトトトトトトトトトトトトトトトトトトトトト + // Informs the callback functions about the current archive, its volume + // number, the archive-flags (see ACE_FLAG constants), the creation host + // system (see ACE_HOST constants) and the AV if present in archive. + // Also used at ACEReadArchiveData(). + //------------------------------------------------------------------------- + + typedef struct sACEArchiveDataStruc + { + LPSTR ArchiveName; + ULONG VolumeNumber, + Flags, // see ACE_ARCFLAG defines below + HostCreated, // see ACE_HOST defines below + TimeCreated, // in MS-DOS format + VersionCreated, + VersionExtract; // version needed to extract files + LPSTR AV; // not used in ACL + CHAR Reserved[64]; // filled with zeros + } tACEArchiveDataStruc, + *pACEArchiveDataStruc; + + + //----------------------------------------------------------------------- + // Flag constants for tACEArchiveDataStruc.Flags field. + //----------------------------------------------------------------------- + + #define ACE_ARCFLAG_MAINCOMMENT 2 + #define ACE_ARCFLAG_SFX 512 + #define ACE_ARCFLAG_LIMITSFXJR 1024 // is an SFX archive + // that supports 256k + // dictionary only + #define ACE_ARCFLAG_MULTIVOLUME 2048 + #define ACE_ARCFLAG_AV 4096 // not used in ACL + #define ACE_ARCFLAG_RECOVERYREC 8192 + #define ACE_ARCFLAG_LOCK 16384 + #define ACE_ARCFLAG_SOLID 32768 + + + //----------------------------------------------------------------------- + // Host system used to create an archive. Used at + // tACEArchiveDataStruc.HostCreated field. + //----------------------------------------------------------------------- + + #define ACE_HOST_MSDOS 0 // archive created by + // MSDOS ACE archiver + #define ACE_HOST_OS2 1 // created by OS2 ACE + #define ACE_HOST_WIN32 2 // created by Win32 ACE + + + //トトトトトトトトトトトトトトトトトトトトトトトト file data structure トトトトトトトトトトトトトトトトトトトトトトトトトト + // Contains information about an archived file. + //------------------------------------------------------------------------- + + typedef struct sACEFileDataStruc + { + LPSTR SourceFileName; // relative file name + LPSTR DestinationFileName; // absolute file name; + // valid for add and extract only! + ULONG Flags, // see ACE_FILEFLAG defines below + CRC32, + Method, // 0=stored, 1=LZ77, 2=V20Compression + Dictionary; // DictionarySize = 2^Dictionary + DWORDLONG + CompressedSize, + Size; + ULONG Time, + Attributes; + CHAR Reserved[64]; // filled with zeros + } tACEFileDataStruc, + *pACEFileDataStruc; + + + //----------------------------------------------------------------------- + // Flag constants for the tACEFileData.Flags field. + //----------------------------------------------------------------------- + + #define ACE_FILEFLAG_FILECOMMENT 2 // file has comment + #define ACE_FILEFLAG_SPLITBEFORE 4096 // continued from + // previous volume + #define ACE_FILEFLAG_SPLITAFTER 8192 // continued on + // next volume + #define ACE_FILEFLAG_PASSWORD 16384 // is encrypted + #define ACE_FILEFLAG_SOLID 32768 // uses data of previous + // files (solid mode) + + + //トトトトトトトトトトトトトトトトトトトトトトトト copy info structure トトトトトトトトトトトトトトトトトトトトトトトトトト + // Is passed to ACEInfoCallbackProc with ACE_CALLBACK_INFO_COPY as code. + // Informs application about the progress of copying either an archive to + // a temporary archive, or a temporary archive back to a normal archive. + //------------------------------------------------------------------------- + + typedef struct sACECopyInfoStruc + { + LPSTR SourceFileName, // source file + DestinationFileName; // the file copying the source to + DWORDLONG + CopiedBytes, // bytes already copied + FileSize; // source file size + CHAR Reserved[64]; // filled with zeros + } tACECopyInfoStruc, + *pACECopyInfoStruc; + + + //トトトトトトトトトトトトトトトトトトトト operation progress structure トトトトトトトトトトトトトトトトトトトトト + // Used to state the progress of the current operation. + //------------------------------------------------------------------------- + + typedef struct sACEProgressDataStruc + { + LPSTR Addr; // address of uncompressed data block + ULONG Size; // size of uncompressed data block + DWORDLONG TotalProcessedSize; // counted by Dll: + // total uncompressed bytes processed + DWORDLONG TotalCompressedSize;// total compressed bytes processed + DWORDLONG TotalSize; // total uncompressed bytes to process + // (sum of all original file sizes) + DWORDLONG FileProcessedSize; // uncompr. bytes of file processed + DWORDLONG FileCompressedSize; // compr. bytes of file processed + DWORDLONG FileSize; // uncompressed file size + } tACEProgressDataStruc, + *pACEProgressDataStruc; + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //========--- Part 1.2: structures used in function structures ---========= + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //トトトトトトトトトトトトトトトトトトトトトトトトト file list structure トトトトトトトトトトトトトトトトトトトトトトトトト + // This structure is used in the function specific structures. + // The application has to use this structure to indicate which files + // have to be processed by the DLL. + //------------------------------------------------------------------------- + + typedef struct sACEFilesStruc + { + LPSTR SourceDir; // maybe a real or an archive directory + LPSTR FileList; // pointer to list of files to process; + // zero-terminated; files have to be + // separated by carriage-return (0xd); + // FileList may/will be modified by the + // Dll; if nothing is specified, "*" + // will be used + // (attention at ACEDelete!!) + LPSTR ExcludeList; // list of files to exclude from process + BOOL FullMatch; // specifications must fully match + // (no files with the same name in + // subdirs are processed) + BOOL RecurseSubDirs; // recurse subdirectories + // (valid for add operations only) + CHAR Reserved[60] ; // has to be filled with zeros + // for future: possibly in-/excluding + // file attributes and date/time range + } tACEFilesStruc, + *pACEFilesStruc; + + + //トトトトトトトトトトトトトトトトトトトトト V2.0 compression structure トトトトトトトトトトトトトトトトトトトトトトト + // Specifies whether to use v2.0 compression or not. If you use v2.0 + // compression you can also specify which v2.0 compression techniques + // you want to use. (ACE only) + //------------------------------------------------------------------------- + + typedef struct sACEV20CompressionStruc + { + BOOL DoUse, // if DoUse=1 and all other fields are + DoUseDelta, // zero, then all v2.0 compression + DoUseExe, // techniques will be used + DoUsePic, + DoUseSound; + CHAR Reserved[64]; // has to be filled with zeros + } tACEV20CompressionStruc, + *pACEV20CompressionStruc; + + + //トトトトトトトトトトトトトトトトトトト compression parameter structure トトトトトトトトトトトトトトトトトトト + // Used in tACEAddStruc and tACEDeleteStruc. (ACE only) + //------------------------------------------------------------------------- + + typedef struct sACECompressParamsStruc + { + ULONG Level, // see ACE_LEVEL constants below + Dictionary; // 15(32k)..22(4Mb) + + tACEV20CompressionStruc // indicates if (or which) v2.0 + V20Compression; // compression techniques shall be used + + BOOL TestAfter; // make a test for CRC check errors + // after compression + CHAR Reserved[64]; // has to be filled with zeros + } tACECompressParamsStruc, + *pACECompressParamsStruc; + + + //----------------------------------------------------------------------- + // Tells the Dll which compression level to use. (ACE only) + //----------------------------------------------------------------------- + + #define ACE_LEVEL_STORE 0 // save file only; do not compress + #define ACE_LEVEL_FASTEST 1 // compress very fast + #define ACE_LEVEL_FAST 2 // compress fast + #define ACE_LEVEL_NORMAL 3 // good compromise between speed and + // compression rate + #define ACE_LEVEL_GOOD 4 // achieves good compression + #define ACE_LEVEL_BEST 5 // best compression; bit slow + + +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘヘヘヘ=====--- Part 2: ACE.DLL callback declarations ---====ヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //--------------------------------------------------------------------------- + // + // ACE.DLL makes use of four callback functions to exchange data + // with the application: + // + // 1) InfoCallbackProc (pACEInfoCallbackProcStruc Info) + // 2) ErrorCallbackProc (pACEErrorCallbackProcStruc Error) + // 3) RequestCallbackProc(pACERequestCallbackProcStruc Request) + // 4) StateCallbackProc (pACEStateCallbackProcStruc State) + // + // Meaning of different callback types: + // Info - lets the application know about actions that take some + // time but are not essential + // (Code is one of ACE_CALLBACK_INFO constants) + // Error - an error occured; if the reason for this error can + // be solved by the application then the Dll can continue + // the current operation, otherwise the operation has to + // be canceled + // (Code is one of ACE_CALLBACK_ERROR constants) + // Request - the Dll needs some user input + // for ex.: "Overwrite file? (yes/no/cancel)" + // (Code is one of ACE_CALLBACK_REQUEST constants) + // State - Dll informs application about the progress of an operation + // (Code is one of ACE_CALLBACK_STATE constants) + // + // The pointers to the callback functions has to be set by the application + // when calling ACEInitDll(). If the application does not install + // a callback function, is has set the corresponding pointer to NULL. + // If the ACE.DLL has to call the Error or Request callback function + // and they are not installed, the ACE.DLL will cancel the operation. + // + // The application has the possibility to cancel the current operation + // at each callback function call. So if the user clicks on a Cancel-button, + // the application should return ACE_CALLBACK_RETURN_CANCEL at the next + // callback function call. + // + // All callback function parameters are declared as unions. + // The StructureType field contains he type of the structure which is used. + // When the application knows which type of structure it has to use, + // it will have to interpret the Code field to get to know the reason + // for the callback function call. + // + //--------------------------------------------------------------------------- + // + // Contents: + // Part 2.1: operation types + // Part 2.2: callback function return codes + // Part 2.3: callback structure types + // Part 2.4: callback structures + // Part 2.5: info callback function + // Part 2.6: error callback function + // Part 2.7: request callback function + // Part 2.8: state callback function + // + //--------------------------------------------------------------------------- + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=====================--- Part 2.1: operation codes ---=================== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // Passed to callback functions indicating the current operation. + //------------------------------------------------------------------------- + + #define ACE_CALLBACK_OPERATION_LIST 0 + #define ACE_CALLBACK_OPERATION_TEST 1 + #define ACE_CALLBACK_OPERATION_ANALYZE 2 + #define ACE_CALLBACK_OPERATION_EXTRACT 3 + #define ACE_CALLBACK_OPERATION_ADD 4 + #define ACE_CALLBACK_OPERATION_REPACK 5 + #define ACE_CALLBACK_OPERATION_DELETE 6 + #define ACE_CALLBACK_OPERATION_REPAIR 7 // repair without + // recovery record + #define ACE_CALLBACK_OPERATION_SETCMT 8 + #define ACE_CALLBACK_OPERATION_ENCRYPT 9 + #define ACE_CALLBACK_OPERATION_KEEP 10 // file is to be + // taken along + // without recompress + #define ACE_CALLBACK_OPERATION_RECOVER 11 // begin of + // recovering archive + // by recovery record + #define ACE_CALLBACK_OPERATION_HEADSEARCH 12 // begin of searching + // for file headers + #define ACE_CALLBACK_OPERATION_RECRECSEARCH 13 // begin of searching + // for recovery record + #define ACE_CALLBACK_OPERATION_ADDSFX 14 + #define ACE_CALLBACK_OPERATION_LOCK 15 + #define ACE_CALLBACK_OPERATION_ADDAV 16 // not used in ACL + #define ACE_CALLBACK_OPERATION_ADDRECOVREC 17 + #define ACE_CALLBACK_OPERATION_REGISTER 18 // not used in ACL + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=============--- Part 2.2: callback function return codes ---============ + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // One of these result codes has to be returned by the application-based + // callback functions. + //--------------------------------------------------------------------------- + + #define ACE_CALLBACK_RETURN_OK 0 // also "yes" at + // requests + #define ACE_CALLBACK_RETURN_NO 1 // no, do not/ + // do not retry + #define ACE_CALLBACK_RETURN_CANCEL 2 // abort operation + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //================--- Part 2.3: callback structure types ---=============== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // States of which type the passed structure is when a callback function + // is called. The type is written to the StructureType field. + //--------------------------------------------------------------------------- + + #define ACE_CALLBACK_TYPE_GLOBAL 0x0 + + // type of structure is + // tACECallbackGlobalStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // InfoCallbackProc | ACE_CALLBACK_INFO_GENERALKEY // not used in ACL + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // ErrorCallbackProc | ACE_CALLBACK_ERROR_MEMORY // f〉 ManyFilesError und ExtractMem andere Codes verwenden!? + // | ACE_CALLBACK_ERROR_REGISTER // not used in ACL + // | ACE_CALLBACK_ERROR_READKEY // not used in ACL + // | ACE_CALLBACK_ERROR_WRITEKEY // not used in ACL + // | ACE_CALLBACK_ERROR_NOWINACEKEY // not used in ACL + // | ACE_CALLBACK_ERROR_NOACTIVEACEKEY // not used in ACL + // | ACE_CALLBACK_ERROR_UNCSPACE // wird noch nicht verwendet! + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // RequestCallbackProc | ACE_CALLBACK_REQUEST_REGISTER // not used in ACL + // + + + #define ACE_CALLBACK_TYPE_ARCHIVE 0x1 + + // type of structure is + // tACECallbackArchiveStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // InfoCallbackProc | ACE_CALLBACK_INFO_TMPARCCREATE + // | ACE_CALLBACK_INFO_TMPARCCREATEEND + // | ACE_CALLBACK_INFO_ADDRECREC + // | ACE_CALLBACK_INFO_ADDRECRECEND + // | ACE_CALLBACK_INFO_RECREC + // | ACE_CALLBACK_INFO_NORECREC + // | ACE_CALLBACK_INFO_RECOVERED + // | ACE_CALLBACK_INFO_NODAMAGE + // | ACE_CALLBACK_INFO_FNDMAINHEAD + // | ACE_CALLBACK_INFO_FILELISTCREATE + // | ACE_CALLBACK_INFO_FILELISTCREATEEND + // | ACE_CALLBACK_INFO_FILESORT + // | ACE_CALLBACK_INFO_FILESORTEND + // | ACE_CALLBACK_INFO_COPYEND + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // ErrorCallbackProc | ACE_CALLBACK_ERROR_MODIFYVOLUME + // | ACE_CALLBACK_ERROR_MODIFYLOCKEDARCHIVE + // | ACE_CALLBACK_ERROR_AV // not used in ACL + // | ACE_CALLBACK_ERROR_TOODAMAGED + // | ACE_CALLBACK_ERROR_ARCHIVEEXISTS + // | ACE_CALLBACK_ERROR_OPENREPAIRARCHIVE + // | ACE_CALLBACK_ERROR_OPENARCHIVEREAD + // | ACE_CALLBACK_ERROR_OPENARCHIVEWRITE + // | ACE_CALLBACK_ERROR_READARCHIVE + // | ACE_CALLBACK_ERROR_WRITEARCHIVE + // | ACE_CALLBACK_ERROR_ALREADYSFX + // | ACE_CALLBACK_ERROR_ADDSFXTOVOLUME + // | ACE_CALLBACK_ERROR_ARCHIVEBROKEN + // | ACE_CALLBACK_ERROR_ARCHIVESAVE + // | ACE_CALLBACK_ERROR_NOFILES + // | ACE_CALLBACK_ERROR_ISNOTANARCHIVE + // | ACE_CALLBACK_ERROR_TEMPDIRCREATE + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // RequestCallbackProc | ACE_CALLBACK_REQUEST_MARKASSOLID + // | ACE_CALLBACK_REQUEST_CHANGEVOLUME + // | ACE_CALLBACK_REQUEST_ARCHIVEEXISTS + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // StateCallbackProc | ACE_CALLBACK_STATE_STARTARCHIVE + // + + + #define ACE_CALLBACK_TYPE_ARCHIVEDFILE 0x2 + + // type of structure is + // tACECallbackArchivedFileStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // InfoCallbackProc | ACE_CALLBACK_INFO_TMPARCCREATE + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // ErrorCallbackProc | ACE_CALLBACK_ERROR_CREATIONNAMEINUSE + // | ACE_CALLBACK_ERROR_HIGHERVERSION + // | ACE_CALLBACK_ERROR_ENCRYPTIONCRC + // | ACE_CALLBACK_ERROR_WRITE + // | ACE_CALLBACK_ERROR_READ + // | ACE_CALLBACK_ERROR_OPENREAD + // | ACE_CALLBACK_ERROR_OPENWRITE //wird noch gar nich benutzt?? sollte aber - bei extract! + // | ACE_CALLBACK_ERROR_FILENAMETOOLONG + // | ACE_CALLBACK_ERROR_REPACKCRC + // | ACE_CALLBACK_ERROR_EXCLUDEPATH + // | ACE_CALLBACK_ERROR_METHOD + // | ACE_CALLBACK_ERROR_EXTRACTSPACE + // | ACE_CALLBACK_ERROR_CREATION + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // RequestCallbackProc | ACE_CALLBACK_REQUEST_OVERWRITE + // | ACE_CALLBACK_REQUEST_DELETEARCHIVEDSYSFILE + // | ACE_CALLBACK_REQUEST_ADDBROKENFILE + // | ACE_CALLBACK_REQUEST_PASSWORD + // | ACE_CALLBACK_REQUEST_OVERWRITESYSFILE + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // StateCallbackProc | ACE_CALLBACK_STATE_STARTFILE + // | ACE_CALLBACK_STATE_ENDNOCRCCHECK + // + + + #define ACE_CALLBACK_TYPE_REALFILE 0x3 + + // type of structure is + // tACECallbackRealFileStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // InfoCallbackProc | ACE_CALLBACK_INFO_FILELISTADD + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // ErrorCallbackProc | ACE_CALLBACK_ERROR_MOVEDELETE + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // RequestCallbackProc | ACE_CALLBACK_REQUEST_MOVEDELETEREALSYSFILE + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // StateCallbackProc | ACE_CALLBACK_STATE_STARTFILE + // + + + #define ACE_CALLBACK_TYPE_SPACE 0x4 + + // type of structure is + // tACECallbackSpaceStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // ErrorCallbackProc | ACE_CALLBACK_ERROR_TEMPDIRSPACE + // | ACE_CALLBACK_ERROR_ARCHIVESPACE + // + + + #define ACE_CALLBACK_TYPE_SFXFILE 0x5 + + // type of structure is + // tACECallbackSFXFileStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // ErrorCallbackProc | ACE_CALLBACK_ERROR_READINGSFXFILE + // + + + #define ACE_CALLBACK_TYPE_COPY 0x6 + + // type of structure is + // tACECallbackCopyStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // InfoCallbackProc | ACE_CALLBACK_INFO_COPY + // + + + #define ACE_CALLBACK_TYPE_PROGRESS 0x7 + + // type of structure is + // tACECallbackProgressStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // StateCallbackProc | ACE_CALLBACK_STATE_PROGRESS + // + + + #define ACE_CALLBACK_TYPE_CRCCHECK 0x8 + + // type of structure is + // tACECallbackCRCCheckStruc + //------------------------------------------------------------- + // callback function | codes using this structure + // --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- + // StateCallbackProc | ACE_CALLBACK_STATE_ENDCRCCHECK + // + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //==============--- Part 2.4: different callback structures ---============ + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // These are the declarations of the different structures used in the + // unions passed by the callback functions. + //--------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // Only the Dll GlobalData is passed to the application. + //----------------------------------------------------------------------- + + typedef struct sACECallbackGlobalStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_GLOBAL + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_GLOBAL + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + } tACECallbackGlobalStruc, + *pACECallbackGlobalStruc; + + + //----------------------------------------------------------------------- + // The Dll GlobalData and the ArchiveData are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackArchiveStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_ARCHIVE + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_ARCHIVE + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + } tACECallbackArchiveStruc, + *pACECallbackArchiveStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData and FileData are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackArchivedFileStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_ARCHIVEDFILE + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + pACEFileDataStruc FileData; // see tACEFileDataStruc + } tACECallbackArchivedFileStruc, + *pACECallbackArchivedFileStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData and a FileName are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackRealFileStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_REALFILE + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_REALFILE + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + LPSTR FileName; // name of file + } tACECallbackRealFileStruc, + *pACECallbackRealFileStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData, the path of temp directory and the + // bytes required in temp directory (archive size) are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackSpaceStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_SPACE + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_SPACE + ULONG Operation; + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + LPSTR Directory; // path of directory + DWORDLONG ArchiveSize; // bytes required in temp dir + } tACECallbackSpaceStruc, + *pACECallbackSpaceStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData and SFXFileName are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackSFXFileStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_SFXFILE + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_SFXFILE + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + LPSTR SFXFileName; // name of SFX + } tACECallbackSFXFileStruc, + *pACECallbackSFXFileStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData and CopyData are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackCopyStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_COPY + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_COPY + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + pACECopyInfoStruc CopyData; // see tACECopyInfoStruc + } tACECallbackCopyStruc, + *pACECallbackCopyStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData, FileData and ProgressData are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackProgressStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_PROGRESS + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_PROGRESS + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + pACEFileDataStruc FileData; // see tACEFileDataStruc + pACEProgressDataStruc ProgressData; // see tACEProgressDataStruc + } tACECallbackProgressStruc, + *pACECallbackProgressStruc; + + + //----------------------------------------------------------------------- + // GlobalData, ArchiveData, FileData and CRC-check result are passed. + //----------------------------------------------------------------------- + + typedef struct sACECallbackCRCCheckStruc + { + ULONG StructureType; // is ACE_CALLBACK_TYPE_CRCCHECK + ULONG Code; // see definition of + // ACE_CALLBACK_TYPE_CRCCHECK + ULONG Operation; // ACE_CALLBACK_OPERATION constant + + pACEGlobalDataStruc GlobalData; // see tACEGlobalDataStruc + pACEArchiveDataStruc ArchiveData; // see tACEArchiveDataStruc + pACEFileDataStruc FileData; // see tACEFileDataStruc + BOOL CRCOk; // CRC-check result + } tACECallbackCRCCheckStruc, + *pACECallbackCRCCheckStruc; + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=================--- Part 2.5: info callback function ---================ + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // Declaration of ACEInfoCallbackProc() parameter and explanation of + // callback info codes. + //--------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // Union parameter used at ACEInfoCallbackProc(). + //----------------------------------------------------------------------- + + typedef union sACEInfoCallbackProcStruc + { + ULONG StructureType; // indicates which of the fol- + // lowing structures is used + tACECallbackGlobalStruc Global; + tACECallbackArchiveStruc Archive; + tACECallbackRealFileStruc RealFile; + tACECallbackCopyStruc Copy; + } tACEInfoCallbackProcStruc; + + + //----------------------------------------------------------------------- + // These values are passed to the ACEInfoCallbackProc callback function + // to inform the application about actions (smaller parts of operations) + // which may take some time or other things that might be of interest. + //----------------------------------------------------------------------- + + #define ACE_CALLBACK_INFO_GENERALKEY 0x100 + + // key is a general one (no own AV; own key + // is obtainable for a special price!?) + // not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + #define ACE_CALLBACK_INFO_TMPARCCREATE 0x110 + + // creating temporary archive for changes + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACERepair + + + #define ACE_CALLBACK_INFO_TMPARCCREATEEND 0x111 + + // finished creating temporary archive + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACERepair + + + #define ACE_CALLBACK_INFO_ADDRECREC 0x112 + + // adding recovery record + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_INFO_ADDRECRECEND 0x113 + + // finished adding recovery record + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_INFO_RECREC 0x114 + + // trying to recover files by recovery + // record; end indicated by + // ACE_CALLBACK_INFO_RECOVERED or + // ACE_CALLBACK_INFO_NODAMAGE + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_INFO_NORECREC 0x115 + + // found no recovery record + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_INFO_RECOVERED 0x116 + + // archive has been fully recovered + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_INFO_NODAMAGE 0x117 + + // ACERepair detected by recovery record that + // the archive is not damaged + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_INFO_FNDMAINHEAD 0x118 + + // found archive header + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_INFO_FILELISTCREATE 0x119 + + // creating a file list of specified files + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_INFO_FILELISTCREATEEND 0x11a + + // sent when creating the list of files + // is finished + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_INFO_FILESORT 0x11b + + // sorting files (for solid compression) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_INFO_FILESORTEND 0x11c + + // sorting files (for solid compression) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_INFO_COPYEND 0x11d + + // copying a file finished + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACERepair + + + #define ACE_CALLBACK_INFO_FILELISTADD 0x140 + + // called at creation of file list; the name + // of the file just added to file list is + // passed in tACECallbackRealFileStruc + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_REALFILE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_INFO_COPY 0x150 + + // copying a file; file name, file size and + // copied bytes are passed via + // tACECallbackCopyStruc + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_COPY + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACERepair + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=================--- Part 2.6: error callback function ---=============== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // Declaration of ACEErrorCallbackProc() parameter and explanation of + // callback error codes. + //--------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // Union parameter used at ACEErrorCallbackProc(). + //----------------------------------------------------------------------- + + typedef union sACEErrorCallbackProcStruc + { + ULONG StructureType; // indicates which of the fol- + // lowing structures is used + tACECallbackGlobalStruc Global; + tACECallbackArchiveStruc Archive; + tACECallbackArchivedFileStruc ArchivedFile; + tACECallbackRealFileStruc RealFile; + tACECallbackSpaceStruc Space; + tACECallbackSFXFileStruc SFXFile; + } tACEErrorCallbackProcStruc; + + + //----------------------------------------------------------------------- + // This structure is used by the ACEErrorCallback function to inform + // the application about errors. The Code field of the used structure + // contains an ACE_CALLBACK_ERROR value. At most problems modifications + // to the passed structure can be made to fix it. Other problems can not + // be solved and cause an operation abort immediately. + // ErrorCallbackProc() has to return either ACE_CALLBACK_RETURN_OK or + // ACE_CALLBACK_RETURN_CANCEL. + //----------------------------------------------------------------------- + + #define ACE_CALLBACK_ERROR_MEMORY 0x200 + + // not enough memory to perform operation + // (dictionary too large?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // all + + + #define ACE_CALLBACK_ERROR_REGISTER 0x201 + + // registration key is invalid (or wrong + // format?); not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + + #define ACE_CALLBACK_ERROR_READKEY 0x202 + + // key could not be read (does not exist or + // is invalid); not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACEInitDll + + + #define ACE_CALLBACK_ERROR_WRITEKEY 0x203 + + // could not write key; not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + + #define ACE_CALLBACK_ERROR_NOWINACEKEY 0x204 + + // key not valid for WinACE; not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + + #define ACE_CALLBACK_ERROR_NOACTIVEACEKEY 0x205 + + // key not valid for ActiveACE; not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + + #define ACE_CALLBACK_ERROR_UNCSPACE 0x206 + + // Win95_OSR1-bug: it is impossible to + // get available space of network drives by + // an UNC name; ACE will not stop but + // assumes there are 4Gb free + // --> the operation might fail if free + // disk space is low + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // all + + + #define ACE_CALLBACK_ERROR_MODIFYVOLUME 0x220 + + // modification of volumes not possible + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_MODIFYLOCKEDARCHIVE 0x221 + + // modification of locked archive not possible + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_AV 0x222 + + // AV of archive is NOT ok or does not match + // to the users AV (not used in ACL) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEReadArchiveData + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + // ACELock + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_TOODAMAGED 0x223 + + // can not repair by recovery record but + // can continue with normal repair + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_ERROR_ARCHIVEEXISTS 0x224 + + // destination file name already used; + // may occur if at + // ACE_CALLBACK_ERROR_ARCHIVESPACE a + // direcory is specified where a file + // with the same name as the current archive + // already exists + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_ERROR_OPENREPAIRARCHIVE 0x225 + + // could not create archive for repairing + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_ERROR_OPENARCHIVEREAD 0x226 + + // could not open archive/volume for reading + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEReadArchiveData + // ACEList + // ACETest + // ACEExtract + // ACERepair + + + #define ACE_CALLBACK_ERROR_OPENARCHIVEWRITE 0x227 + + // could not open archive/volume for writing + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEDelete + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_ERROR_READARCHIVE 0x228 + + // error reading from archive + // (source disk removed?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEReadArchiveData + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + // ACELock + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_WRITEARCHIVE 0x229 + + // error writing to archive + // (destination disk removed?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEDelete + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_ERROR_ALREADYSFX 0x22a + + // ca not make to SFX: is already SFX + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAddSFX + + + #define ACE_CALLBACK_ERROR_ADDSFXTOVOLUME 0x22b + + // adding SFX to volumes not possible + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAddSFX + + + #define ACE_CALLBACK_ERROR_ARCHIVEBROKEN 0x22c + + // archive is broken (damaged) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEReadArchiveData + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + // ACELock + // ACEAddRecoveryRecord + + #define ACE_CALLBACK_ERROR_ARCHIVESAVE 0x22d + + // not enough space to save archive; + // but normally + // ACE_CALLBACK_ERROR_ARCHIVESPACE + // should allow to change destination + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_ERROR_NOFILES 0x22e + + // no files specified/could not find files + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_ERROR_ISNOTANARCHIVE 0x22f + + // specified archive file is not an + // ACE archive + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEReadArchiveData + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + // ACELock + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_TEMPDIRCREATE 0x230 + + // could not create file in temp directory + // (write protected or directory does + // not exist) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_ERROR_HIGHERVERSION 0x231 + + // this Dll version is not able to handle + // the archive + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_ERROR_CREATIONNAMEINUSE 0x240 + + // name used by directory + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_ENCRYPTIONCRC 0x242 + + // encryption failed because of CRC-Error at + // decompression + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEEncryptFiles + + + #define ACE_CALLBACK_ERROR_READ 0x243 + + // error reading file to be added + // (source disk removed?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_ERROR_WRITE 0x244 + + // error at extraction + // (destination disk removed?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_OPENREAD 0x245 + + // error opening file for reading + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_ERROR_OPENWRITE 0x246 + + // error opening file for writing + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_FILENAMETOOLONG 0x247 + + // resulting file name too long + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_ERROR_REPACKCRC 0x248 + + // CRC-check error at recompression + // (archive broken or wrong password) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEDelete + // ACEAdd + + + #define ACE_CALLBACK_ERROR_EXCLUDEPATH 0x249 + + // could not exclude path of file names; two + // or more files would have the same name + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + + + #define ACE_CALLBACK_ERROR_METHOD 0x24a + + // compression method not known to this + // Dll version + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACEEncryptFiles + + + #define ACE_CALLBACK_ERROR_EXTRACTSPACE 0x24b + + // not enough space to extract file + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_CREATION 0x24c + + // creation failed (write-protection?) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_OVERWRITEDELETE 0x24d + + // could not overwrite because deletion of + // file failed + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEExtract + + + #define ACE_CALLBACK_ERROR_MOVEDELETE 0x260 + + // deletion of file or directory failed + // (move operation) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_REALFILE + // operations: + // ACEAdd + + #define ACE_CALLBACK_ERROR_TEMPDIRSPACE 0x270 + + // not enough space at current temp directory + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_SPACE + // operations: + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + + + #define ACE_CALLBACK_ERROR_ARCHIVESPACE 0x271 + + // not enough space to save archive + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_SPACE + // operations: + // ACEDelete + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACELock + // ACEAddAV + // ACEAddRecoveryRecord + // ACERepair + + + #define ACE_CALLBACK_ERROR_READINGSFXFILE 0x280 + + // error reading SFX file: + // is no SFX file, + // file does not exist or could not be opened + // for reading + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_SFXFILE + // operations: + // ACEAdd + // ACEAddSFX + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //================--- Part 2.7: request callback function ---============== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // Declaration of ACERequestCallbackProc() parameter and explanation of + // callback request codes. + //--------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // Union parameter used at ACERequestCallbackProc(). + //----------------------------------------------------------------------- + + typedef union sACERequestCallbackProcStruc + { + ULONG StructureType; // indicates which of the fol- + // lowing structures is used + tACECallbackGlobalStruc Global; + tACECallbackArchiveStruc Archive; + tACECallbackArchivedFileStruc ArchivedFile; + tACECallbackRealFileStruc RealFile; + } tACERequestCallbackProcStruc; + + + //----------------------------------------------------------------------- + // Question constants are passed to the RequestCallbackProc callback + // function to request further data. + // RequestCallbackProc may return ACE_CALLBACK_RETURN_OK, + // ACE_CALLBACK_RETURN_NO or ACE_CALLBACK_RETURN_CANCEL. + //----------------------------------------------------------------------- + + #define ACE_CALLBACK_REQUEST_REGISTER 0x300 + + // Global.UserAV has to be set + // to continue registration process; + // not used in ACL + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_GLOBAL + // operations: + // ACERegister + + + #define ACE_CALLBACK_REQUEST_MARKASSOLID 0x320 + + // ArchiveHeader damaged, + // set solid flag for the new archive? + // (in case of doubt return yes!) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACERepair + + + #define ACE_CALLBACK_REQUEST_CHANGEVOLUME 0x321 + // Asks for permission to process next volume. + // If operation is ACE_CALLBACK_OPERATION_ADD + // then a new volume will be created. + // The application may change the name + // of the archive by modifying + // ArchiveData->ArchiveName + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEDelete + // ACEAdd + // ACESetComments + // ACEEncryptFiles + // ACEList + // ACETest + // ACEExtract + + + #define ACE_CALLBACK_REQUEST_ARCHIVEEXISTS 0x322 + // Asks whether to overwrite a file with + // the same name as the archive. + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEDelete + // ACEAdd + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_REQUEST_OVERWRITE 0x340 + + // Overwrite existing file? + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + // ACEExtract + + + #define ACE_CALLBACK_REQUEST_DELARCHIVEDSYSFILE 0x341 + + // Delete rdonly/hidden/system file + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEDelete + + + #define ACE_CALLBACK_REQUEST_ADDBROKENFILE 0x342 + + // repair function found file with + // broken header, add file? + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACERepair + + + #define ACE_CALLBACK_REQUEST_PASSWORD 0x343 + + // password required; attention: may be + // decryption _and_ encryption; but passwords + // can be different --> better changing + // passwords at StateCallbackProc + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACEEncryptFiles + + + #define ACE_CALLBACK_REQUEST_OVERWRITESYSFILE 0x344 + + // Overwrite rdonly/hidden/system file + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEAdd + // ACEExtract + + + #define ACE_CALLBACK_REQUEST_MOVEDELREALSYSFILE 0x360 + + // Delete rdonly/hidden/system file + // (move to archive operation) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_REALFILE + // operations: + // ACEAdd + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=================--- Part 2.8: state callback function ---=============== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + // Declaration of ACEStateCallbackProc() parameter and explanation of + // callback state codes. + //--------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // Union parameter used at ACEStateCallbackProc(). + //----------------------------------------------------------------------- + + typedef union sACEStateCallbackProcStruc + { + ULONG StructureType; // indicates which of the fol- + // lowing structures is used + tACECallbackArchiveStruc Archive; + tACECallbackArchivedFileStruc ArchivedFile; + tACECallbackArchivedFileStruc RealFile; + tACECallbackProgressStruc Progress; + tACECallbackCRCCheckStruc CRCCheck; + } tACEStateCallbackProcStruc; + + + //----------------------------------------------------------------------- + // Calls to (*StateCallbackProc)() with ACE_CALLBACK_STATE values in the + // Code field are made to enable the application to show the progress of + // an operation. + //----------------------------------------------------------------------- + + #define ACE_CALLBACK_STATE_STARTARCHIVE 0x400 + + // procession of archive is about to begin + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + // ACEAddSFX + // ACEAddAV + // ACELock + // ACEAddRecoveryRecord + + + #define ACE_CALLBACK_STATE_STARTFILE 0x410 + + // procession of file is about to begin + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEList + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_STATE_ENDNOCRCCHECK 0x411 + + // end of file procession + // (no CRC chceck for this operation) + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_ARCHIVEDFILE + // operations: + // ACEList + // ACEDelete + // ACEAdd + // ACERepair + // ACESetComments + // ACEEncryptFiles + + + #define ACE_CALLBACK_STATE_PROGRESS 0x420 + + // informs about the progress of a file + // operation + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_PROGRESS + // operations: + // ACEDelete + // ACETest + // ACEExtract + // ACEAdd + // ACERepair + // ACEEncryptFiles + + + #define ACE_CALLBACK_STATE_ENDCRCCHECK 0x430 + + // end of file procession, CRC-check + // result is passed + //--------------------------------------------- + // structure type: + // ACE_CALLBACK_TYPE_CRCCHECK + // operations: + // ACETest + // ACEExtract + // ACEDelete + // ACEAdd + + + + +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘ=====--- Part 3: Functions supported by UNAceV2.Dll ---====ヘヘヘヘヘヘヘヘヘヘヘヘ +//ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //--------------------------------------------------------------------------- + // + // UnAceV2.Dll supports the following functions: + // + // ACEInitDll + // ACEReadArchiveData + // ACEList + // ACETest + // ACEExtract + // + // First of all - before any other function is called - the Dll has to be + // initialized by ACEInitDll(). Using this function the application has + // to set temporary directory, key file path, comment buffer and + // callback function pointers. + // (callback function pointers can be set to NULL for first-try-runs) + // + // See description of each function for details about their task, input and + // output. Return codes of those functions are listed in part 3.1. + // + //--------------------------------------------------------------------------- + // + // Contents: + // Part 3.1: ACE.DLL function return codes + // Part 3.2: functions and parameter structures + // + //--------------------------------------------------------------------------- + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //=============--- Part 3.1: ACE.DLL function return codes ---============= + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //----------------------------------------------------------------------- + // These error codes are returned by the ACE.DLL-functions. The meanings + // of the codes are the same, as they are for the exit codes of ACE.EXE. + //----------------------------------------------------------------------- + + #define ACE_ERROR_NOERROR 0 // no error; operation succesful + #define ACE_ERROR_MEM 1 // insufficient memory + #define ACE_ERROR_FILES 2 // no files specified + #define ACE_ERROR_FOUND 3 // specified archive not found + #define ACE_ERROR_FULL 4 // disk full + #define ACE_ERROR_OPEN 5 // could not open file + #define ACE_ERROR_READ 6 // read error + #define ACE_ERROR_WRITE 7 // write error + #define ACE_ERROR_CLINE 8 // invalid command line + #define ACE_ERROR_CRC 9 // CRC error + #define ACE_ERROR_OTHER 10 // other error + #define ACE_ERROR_EXISTS 11 // file already exists + #define ACE_ERROR_USER 255 // user break (application + // returned cancel code at + // callback function) + + + //----------------------------------------------------------------------- + // These error codes are returned by the ACE.DLL-functions. They are not + // used by ACE.EXE yet. + //----------------------------------------------------------------------- + + #define ACE_ERROR_PARAM 128 // might be used later + + + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + //============--- Part 3.2: functions and parameter structures ---========== + //ヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘヘ + + //トトトトトトトトトトトトトトトトトトトトトトトトトトト ACEInitDll トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト + // Initializes ACE dynamic link library. Has to be called before any + // other function call. May be called more than one time. + //------------------------------------------------------------------------- + // Input : + // Output: + //------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // ACEInitDll() parameter structure. + //----------------------------------------------------------------------- + + typedef struct sACEInitDllStruc + { + tACEGlobalDataStruc + GlobalData; + CHAR Reserved[64]; // has to be filled with zeroes + } tACEInitDllStruc, + *pACEInitDllStruc; + + + //----------------------------------------------------------------------- + // ACEInitDll() function declaration. + //----------------------------------------------------------------------- + + INT __stdcall ACEInitDll(pACEInitDllStruc DllData); + + + //トトトトトトトトトトトトトトトトトトトトトトト ACEReadArchiveData トトトトトトトトトトトトトトトトトトトトトトトトトトトト + // Tests a file whether it is an archive or not and reads out the archive + // data. + //------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // ACEReadArchiveData() parameter structure. + //----------------------------------------------------------------------- + + typedef struct sACEReadArchiveDataStruc + { + pACEArchiveDataStruc // if this pointer is NULL, the + ArchiveData; // file passed to ACEReadArchiveData + // is no archive; otherwise it points + // to a tACEArchiveDataStruc structure + // that contains information about the + // archive + CHAR Reserved[64]; // has to be filled with zeroes + } tACEReadArchiveDataStruc, + *pACEReadArchiveDataStruc; + + + //----------------------------------------------------------------------- + // ACEReadArchiveData() function declaration. + //----------------------------------------------------------------------- + + INT __stdcall ACEReadArchiveData(LPSTR ArchiveName, + pACEReadArchiveDataStruc ArchiveData); + + + //トトトトトトトトトトトトトトトトトトトトトトトトトトトト ACEList トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト + // Passes the specified files in the archive to StateCallbackProc(). + //------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // ACEList() parameter structure. + //----------------------------------------------------------------------- + + typedef struct sACEListStruc + { + tACEFilesStruc // specifies files to be listed; + Files; // see tACEFilesStruc structure + CHAR Reserved[64]; // has to be filled with zeroes + } tACEListStruc, + *pACEListStruc; + + + //----------------------------------------------------------------------- + // ACEList() function declaration. + //----------------------------------------------------------------------- + + INT __stdcall ACEList(LPSTR ArchiveName, pACEListStruc List); + + + //トトトトトトトトトトトトトトトトトトトトトトトトトトトト ACETest トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト + // Tests specified files in archive. + //------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // ACETest() parameter structure. + //----------------------------------------------------------------------- + + typedef struct sACETestStruc + { + tACEFilesStruc // specifies files to test; + Files; // see tACEFilesStruc structure + LPSTR DecryptPassword; // zero-terminated string, + // case-sensitive (maxlen=56) + CHAR Reserved[64]; // has to be filled with zeroes + } tACETestStruc, + *pACETestStruc; + + + //----------------------------------------------------------------------- + // ACETest() function declaration. + //----------------------------------------------------------------------- + + INT __stdcall ACETest(LPSTR ArchiveName, pACETestStruc Test); + + + //トトトトトトトトトトトトトトトトトトトトトトトトトトト ACEExtract トトトトトトトトトトトトトトトトトトトトトトトトトトトトトトトト + // Extracts specified files. + //------------------------------------------------------------------------- + + //----------------------------------------------------------------------- + // ACEExtract() parameter structure. + //----------------------------------------------------------------------- + + typedef struct sACEExtractStruc + { + tACEFilesStruc // specifies files to extract; + Files; // see tACEFilesStruc structure + LPSTR DestinationDir; // directory to extract files to + BOOL ExcludePath; // extract files without path + LPSTR DecryptPassword; // password for decryption (if files + // are encrypted); + // zero-terminated string, + // case-sensitive (maxlen=56) + CHAR Reserved[64]; // has to be filled with zeroes + } tACEExtractStruc, + *pACEExtractStruc; + + + //----------------------------------------------------------------------- + // ACEExtract() function declaration. + //----------------------------------------------------------------------- + + INT __stdcall ACEExtract(LPSTR ArchiveName, + pACEExtractStruc Extract); + + +#ifdef __cplusplus + } +#endif +#endif + ADDED uninst/StdAfx.cpp Index: uninst/StdAfx.cpp ================================================================== --- uninst/StdAfx.cpp +++ uninst/StdAfx.cpp @@ -0,0 +1,8 @@ +// stdafx.cpp : 標準インクルードファイルを含むソース ファイル +// kinst.pch 生成されるプリコンパイル済ヘッダー +// stdafx.obj 生成されるプリコンパイル済タイプ情報 + +#include "stdafx.h" + +// TODO: STDAFX.H に含まれていて、このファイルに記述されていない +// ヘッダーファイルを追加してください。 ADDED uninst/StdAfx.h Index: uninst/StdAfx.h ================================================================== --- uninst/StdAfx.h +++ uninst/StdAfx.h @@ -0,0 +1,16 @@ +// stdafx.h : frequently used headers + +#ifndef AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ +#define AFX_STDAFX_H__A9DB83DB_A9FD_11D0_BFD1_444553540000__INCLUDED_ + +// windows general header +#undef WINVER +#define WINVER 0x0400 +#include + +// shell header +#undef _WIN32_IE +#define _WIN32_IE 0x0200 +#include + +#endif ADDED uninst/del.ico Index: uninst/del.ico ================================================================== --- uninst/del.ico +++ uninst/del.ico cannot compute difference between binary files ADDED uninst/kinst.cpp Index: uninst/kinst.cpp ================================================================== --- uninst/kinst.cpp +++ uninst/kinst.cpp @@ -0,0 +1,541 @@ + +#include "stdafx.h" +#include "../kilib/kilib.h" +#include "resource.h" + + +//-- 雑用Functions ---------------------------------------------------------- + +void getProgramFiles( kiPath* path ) +{ + // 1.レジストリから + kiRegKey key; + if( key.open( HKEY_CLASSES_ROOT, "Software\\Microsoft\\Windows\\CurrentVersion", KEY_QUERY_VALUE ) ) + if( key.get( "ProgramFilesDir", path ) + || key.get( "ProgramFilesPath", path ) ) + return; + + // 2.Windowsディレクトリからの類推 + char buf[MAX_PATH]; + if( ::GetWindowsDirectory( buf, MAX_PATH ) ) + { + for( char* p=buf; *p!='\\' && *p; p++ ); + *p='\0'; + + *path= buf, *path += '\\', *path += "Program Files"; + if( ::GetFileAttributes( *path ) != 0xffffffff ) + return; + } + + // 3.しゃーないので起動ディレクトリ + path->beSpecialPath( kiPath::Exe ); +} + +void createShortCut( const kiPath& original, const kiPath& at, const char* name ) +{ + IShellLink* psl; + if( SUCCEEDED(::CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER,IID_IShellLink,(void**)&psl)) ) + { + psl->SetPath( original ); + + IPersistFile* ppf; + if( SUCCEEDED(psl->QueryInterface(IID_IPersistFile,(void**)&ppf)) ) + { + WORD wsz[MAX_PATH]; + kiPath lnkfile( at ); + lnkfile += name, lnkfile += ".lnk"; + ::MultiByteToWideChar(CP_ACP,0,lnkfile,-1,wsz,MAX_PATH); + ppf->Save(wsz,TRUE); + ppf->Release(); + } + psl->Release(); + } +} + + +//-- メイン ------------------------------------------------------------------- + +class CKInstApp : public kiApp, kiDialog // kiAppのコンストラクタが先に呼ばれないと死ぬ。よろしくない。 +{ + CKInstApp() : kiDialog( IDD_MAIN ) {} + friend void kilib_create_new_app(); + +//-- メインルーチン --------- + + void run( kiCmdParser& cmd ) + { + if( cmd.option().len() ) + if( cmd.option()[0][1] == 'i' ) + { + install(); + return; + } + else if( cmd.option()[0][1] == 'u' && cmd.param().len() ) + { + uninstall( cmd.param()[0] ); + return; + } + boot_uninstaller(); + } + + void install() + { + doModal(); + if( IDCANCEL == getEndCode() ) + return; + + if( !copy() ) + { + msgBox( kiStr().loadRsrc(IDS_COPYFAIL) ); + return; + } + + if( !regist() ) + msgBox( kiStr().loadRsrc(IDS_REGISTFAIL) ); + + do_caldix(); + + msgBox( kiStr().loadRsrc(IDS_INSTALLFINISH),"Noah",MB_OK|MB_ICONINFORMATION ); + } + + void uninstall( const char* dir ) + { + m_destdir = dir; + for( int i=0; i!=sizeof(m_assoc)/sizeof(bool); i++ ) + m_assoc[i]=false; + Sleep(200); + unregist(); + remove(); + kill_later( kiPath(kiPath::Exe_name) ); + msgBox( kiStr().loadRsrc(IDS_UNINSTALLFINISH),"Noah",MB_OK|MB_ICONINFORMATION ); + } + + void boot_uninstaller() + { + if( IDNO==msgBox( kiStr(500).loadRsrc(IDS_UNINSTOK), "Noah", MB_YESNO|MB_ICONQUESTION ) ) + return; + + kiPath self(kiPath::Exe_name), to(kiPath::Tmp), pos(kiPath::Exe); + to += "noaunins.exe"; + ::CopyFile( self, to, FALSE ); + to += " -u \"", to += pos, to+='"'; + + PROCESS_INFORMATION pi; + STARTUPINFO si; ki_memzero( &si,sizeof(si) ); si.cb=sizeof(si); + if( !::CreateProcess( NULL,const_cast((const char*)to), + NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi ) ) + return; // 起動できなかった…。 + + ::CloseHandle( pi.hThread ); + ::CloseHandle( pi.hProcess ); + + // レジストリのアンインストール情報削除 + kiRegKey key; + if( key.open( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall" ) ) + key.delSubKey( "Noah" ); + } + +//-- メインダイアログの処理 -- + + bool onOK() + { + char str[MAX_PATH]; + sendMsgToItem( IDC_INSTALLTO, WM_GETTEXT, MAX_PATH, (LPARAM)str ); + if( str[1]!=':' || str[2]!='\\' ) + { + msgBox( kiStr().loadRsrc(IDS_BADPATH) ); + return false; + } + + m_destdir = str; + m_destdir.beBackSlash(true); + for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) + m_assoc[i-IDC_LZH] = (BST_CHECKED==sendMsgToItem( i, BM_GETCHECK )); + m_assoc[IDC_STT-IDC_LZH] = true; + + return true; + } + BOOL onInit() + { + for( int j=0; j<18; j++ ) + m_assoc[j] = true; + + kiPath prg; + getPrevPos( &prg ); + if( prg.len()==0 ) // 新規インストール + getProgramFiles( &prg ), prg.beBackSlash(true), prg += "Noah\\"; + else // 既に存在してる場合 + { + HINSTANCE hDLL = kiSUtil::loadLibrary( "NoahXt.dll" ); + if( hDLL ) + { + typedef bool (WINAPI * XT_IA)(); + XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); + if( Init() ) + { + typedef void (WINAPI * XT_LS)(bool*,bool*); + typedef void (WINAPI * XT_AS)(bool*); + typedef void (WINAPI * XT_LSEX)(const char*,bool*); + XT_LS LoadSE = (XT_LS)::GetProcAddress( hDLL, "LoadSE" ); + XT_AS LoadAssoc = (XT_AS)::GetProcAddress( hDLL, "LoadAS" ); + XT_LSEX LoadASEx = (XT_LSEX)::GetProcAddress( hDLL, "LoadASEx" ); + LoadSE( &m_assoc[13], &m_assoc[14] ); + LoadASEx( "7z\0", &m_assoc[12] ); + LoadAssoc( m_assoc ); + } + ::FreeLibrary( hDLL ); + } + m_assoc[15] = kiSUtil::exist( kiPath(kiPath::Snd)+="Noah.lnk" ); + m_assoc[16] = kiSUtil::exist( kiPath(kiPath::Dsk)+="Noah.lnk" ); + } + + sendMsgToItem( IDC_INSTALLTO, WM_SETTEXT, 0, (LPARAM)(const char*)prg ); + for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) + if( m_assoc[i-IDC_LZH] ) + sendMsgToItem( i, BM_SETCHECK, BST_CHECKED ); + return FALSE; + } + BOOL CALLBACK proc( UINT msg, WPARAM wp, LPARAM lp ) + { + if( msg != WM_COMMAND ) + return FALSE; + switch( LOWORD(wp) ) + { + case IDC_REF:{ + char str[MAX_PATH]; + sendMsgToItem( IDC_INSTALLTO, WM_GETTEXT, MAX_PATH, (LPARAM)str ); + if( kiSUtil::getFolderDlg( str, hwnd(), kiStr().loadRsrc(IDS_DIR), str ) ) + { + kiPath x(str); x.beBackSlash(true); x+="Noah\\"; + sendMsgToItem( IDC_INSTALLTO, WM_SETTEXT, 0, (LPARAM)(const char*)x ); + } + }break; + case IDC_ALL:{ + for( UINT i=IDC_LZH; i<=IDC_DSK; i++ ) + sendMsgToItem( i, BM_SETCHECK, BST_UNCHECKED ); + }break; + default: + return FALSE; + } + return TRUE; + } + +//-- インストール --------- + + bool m_assoc[18]; // LZH-JAK, 7Z, CMP MLT, SND DSK STT + kiPath m_destdir; + + bool copy() + { + kiPath exe(kiPath::Exe,false), inst(m_destdir); + inst.beBackSlash(false); + + // とりあえず全コピ + bool r = copy_dir2dir(exe,inst); + + // manualの言語をてけとーに調整 + kiPath manE(m_destdir), manJ(m_destdir); + manE.beBackSlash(true), manJ.beBackSlash(true); + manE += "manual-e.htm", manJ += "manual.htm"; + if( ::GetACP() != 932 ) + ::CopyFile( manE, manJ, FALSE ); + ::DeleteFile( manE ); + + return r; + } + + bool regist() + { + // NoahXt.dllによる処理 + kiPath xtdll( m_destdir ); + xtdll += "NoahXt.dll"; + HINSTANCE hDLL = kiSUtil::loadLibrary( xtdll ); + if( hDLL ) + { + typedef bool (WINAPI * XT_IA)(); + typedef void (WINAPI * XT_LS)(bool*,bool*); + typedef void (WINAPI * XT_SS)(bool,bool); + typedef void (WINAPI * XT_AS)(bool*); + typedef void (WINAPI * XT_SSEX)(const char*,bool); + XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); + if( Init() ) + { + XT_SS SaveSE = (XT_SS)::GetProcAddress( hDLL, "SaveSE" ); + XT_AS SaveAssoc = (XT_AS)::GetProcAddress( hDLL, "SaveAS" ); + XT_SSEX SaveASEx = (XT_SSEX)::GetProcAddress( hDLL, "SaveASEx" ); + SaveSE( m_assoc[13], m_assoc[14] ); + SaveASEx( "7z\0", m_assoc[12] ); + SaveAssoc( m_assoc ); + } + ::FreeLibrary( hDLL ); + } + + // ショートカット + ::CoInitialize( NULL ); + kiPath tmp(m_destdir); tmp += "Noah.exe"; + if( m_assoc[15] ) + createShortCut( tmp, kiPath(kiPath::Snd), "Noah" ); + if( m_assoc[16] ) + createShortCut( tmp, kiPath(kiPath::Dsk), "Noah" ); + if( m_assoc[17] ) + { + kiPath StartMenu( CSIDL_PROGRAMS ),rsrc; + StartMenu += "Noah\\"; + StartMenu.mkdir(); + + createShortCut( tmp, StartMenu, "Noah" ); + tmp = m_destdir, tmp += "caldix.exe"; + createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_CALDIX) ); + tmp = m_destdir, tmp += "manual.htm"; + createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_HELP) ); + tmp = m_destdir, tmp += "uninst.exe"; + createShortCut( tmp, StartMenu, rsrc.loadRsrc(IDS_UNINSTALLER) ); + } + ::CoUninitialize(); + + // アンインストール情報をレジストリへ + kiPath uninst( m_destdir ); + uninst += "uninst.exe"; + + kiRegKey key; + if( !key.create( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Noah", KEY_WRITE ) ) + return false; + key.set( "DisplayName", kiStr().loadRsrc(IDS_NOAH) ); + key.set( "UninstallString", uninst ); + return true; + } + + void do_caldix() + { + if( IDYES==msgBox( kiStr(1000).loadRsrc(IDS_DLLINST),"Noah",MB_YESNO|MB_ICONQUESTION ) ) + { + kiStr cld; + cld += '"'; + cld += m_destdir; + cld += "caldix.exe"; + cld += '"'; + + // プロセス開始 + PROCESS_INFORMATION pi; + STARTUPINFO si; ki_memzero( &si,sizeof(si) ); si.cb=sizeof(si); + if( !::CreateProcess( NULL,const_cast((const char*)cld), + NULL,NULL,FALSE,CREATE_NEW_PROCESS_GROUP|NORMAL_PRIORITY_CLASS,NULL,NULL,&si,&pi ) ) + return; + + // 終了待機 + ::CloseHandle( pi.hThread ); + ::WaitForSingleObject( pi.hProcess, INFINITE ); + ::CloseHandle( pi.hProcess ); + } + } + + bool copy_dir2dir( kiPath& from, kiPath& to ) + { + if( !kiSUtil::isdir(from) ) + { + if( ::CopyFile( from, to, FALSE ) ) + return true; + if( 0==ki_strcmpi( from.ext(), "dll" ) ) + return copy_later(from, to); + return false; + } + + from += '\\', to += '\\', to.mkdir(); + if( !kiSUtil::isdir(to) ) + return false; + + kiFindFile find; + WIN32_FIND_DATA fd; + kiPath src, dst, wild(from); wild+="\\*"; + for( find.begin( wild ); find.next(&fd); ) + { + src = from, src+='\\', src += fd.cFileName; + dst = to , dst+='\\', dst += fd.cFileName; + if( !copy_dir2dir( src, dst ) ) + return false; + } + return true; + } + + void getPrevPos( kiPath* path ) + { + *path = ""; + + kiRegKey key; + if( !key.open( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Noah", KEY_READ ) ) + return; + key.get( "UninstallString", path ); + path->beDirOnly(); + } + +//-- アンインストール --------- + + typedef bool (WINAPI * XT_IA)(); + typedef void (WINAPI * XT_LS)(bool*,bool*); + typedef void (WINAPI * XT_SS)(bool,bool); + typedef void (WINAPI * XT_AS)(bool*); + typedef void (WINAPI * XT_SAX)(const char*,bool); + typedef void (WINAPI * XT_LAX)(const char*,bool*); + bool unregist() + { + // NoahXt.dllによる処理 + kiPath xtdll( m_destdir ); + xtdll += "NoahXt.dll"; + HINSTANCE hDLL = kiSUtil::loadLibrary( xtdll ); + if( hDLL ) + { + XT_IA Init = (XT_IA)::GetProcAddress( hDLL, "Init" ); + if( Init() ) + { + XT_SAX SaveASEx = (XT_SAX)::GetProcAddress( hDLL, "SaveASEx" ); + XT_LAX LoadASEx = (XT_LAX)::GetProcAddress( hDLL, "LoadASEx" ); + unregist_b2e( SaveASEx, LoadASEx ); + + XT_SS SaveSE = (XT_SS)::GetProcAddress( hDLL, "SaveSE" ); + XT_AS SaveAssoc = (XT_AS)::GetProcAddress( hDLL, "SaveAS" ); + SaveSE( m_assoc[13], m_assoc[14] ); + SaveAssoc( m_assoc ); + } + ::FreeLibrary( hDLL ); + } + + // ショートカット + ::CoInitialize( NULL ); + kiPath snd(kiPath::Snd); snd += "Noah.lnk"; + kiPath dsk(kiPath::Dsk); dsk += "Noah.lnk"; + kiPath stt(CSIDL_PROGRAMS); stt += "Noah"; + ::DeleteFile(snd), ::DeleteFile(dsk), stt.remove(); + + return true; + } + + static void crack_str( char* p ) + { + for( ; *p; p=kiStr::next(p) ) + if( *p=='.' ) + *p++ = '\0'; + *++p = '\0'; + } + + void unregist_b2e( XT_SAX SaveASEx, XT_LAX LoadASEx ) + { + char* first_dot; + kiFindFile f; + WIN32_FIND_DATA fd; + kiPath b2ewild(m_destdir); + b2ewild.beBackSlash(true); + + f.begin( b2ewild+="b2e\\*.b2e" ); + while( f.next(&fd) ) + if( fd.cFileName[0] != '#' ) // # 付きは圧縮専用 + { + // 拡張子を切り出し + ::CharLower( fd.cFileName ); + first_dot = const_cast(kiPath::ext_all(fd.cFileName)-1); + *first_dot = '\0'; + crack_str( fd.cFileName ); + // 関連づけ削除 + SaveASEx( fd.cFileName, false ); + } + SaveASEx( "7z\0", false ); + } + + bool remove() + { + ::SetCurrentDirectory( kiPath(kiPath::Exe) ); + + kiPath tmp; + m_destdir.beBackSlash(true); + // インストールしたモノだけ全削除 + tmp=m_destdir, tmp+="Noah.exe", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="Noah.ini", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="uninst.exe", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="caldix.exe", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="caldix.ini", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="ReadMe.txt", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="manual.htm", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="html", tmp.remove(); + tmp=m_destdir, tmp+="b2e\\jak.b2e", ::DeleteFile(tmp); + tmp=m_destdir, tmp+="b2e\\aboutb2e.txt",::DeleteFile(tmp); + tmp=m_destdir, tmp+="b2e", ::RemoveDirectory(tmp); + tmp=m_destdir, tmp+="NoahXt.dll", ::DeleteFile(tmp); + ::RemoveDirectory(m_destdir); + // NoahXt.dllは再起動後に回すかも知れない + if( kiSUtil::exist(tmp) ) + { + kill_later(tmp); + tmp.beDirOnly(); + tmp.beBackSlash(false); + kill_later(tmp); + } + + return true; + } + + void kill_later( const char* pszFile ) + { + // "MoveFileEx Not Supported in Windows 95 But Functionality Is" + if( ::MoveFileEx( pszFile, NULL, MOVEFILE_DELAY_UNTIL_REBOOT ) ) + return; + char shortPath[MAX_PATH]; + ::GetShortPathName( pszFile, shortPath, sizeof(shortPath) ); + + kiPath inifile( kiPath::Win ); inifile+="wininit.ini"; + + char buf[30000]; + ::GetPrivateProfileSection( "Rename", buf, 30000, inifile ); + char* p = buf; + while(*p)while(*p++); + + ::lstrcpy( p, "NUL=" ); + ::lstrcat( p, shortPath ); + while(*p++); + *p='\0'; + + ::WritePrivateProfileSection( "Rename", buf, inifile ); + + // 確実に書き込む + ::WritePrivateProfileString( NULL, NULL, NULL, inifile ); + } + + bool copy_later( const char* from, const char* to ) + { + char from_temp[MAX_PATH]; + ::lstrcpy( from_temp, to ); + ::lstrcat( from_temp, ".new" ); + if( !::CopyFile( from, from_temp, FALSE ) ) + return false; + + char shortFrom[MAX_PATH]; + ::GetShortPathName( from_temp, shortFrom, sizeof(shortFrom) ); + char shortTo[MAX_PATH]; + ::GetShortPathName( to, shortTo, sizeof(shortTo) ); + kiPath inifile( kiPath::Win ); inifile+="wininit.ini"; + + char buf[30000]; + ::GetPrivateProfileSection( "Rename", buf, 30000, inifile ); + char* p = buf; + while(*p)while(*p++); + + ::lstrcpy( p, "NUL=" ); + ::lstrcat( p, shortTo ); + while(*p++); + *p++='\r',*p++='\n'; + ::lstrcpy( p, shortTo ); + ::lstrcat( p, "=" ); + ::lstrcat( p, shortFrom ); + while(*p++); + *p='\0'; + + ::WritePrivateProfileSection( "Rename", buf, inifile ); + + // 確実に書き込む + ::WritePrivateProfileString( NULL, NULL, NULL, inifile ); + return true; + } +}; + +void kilib_create_new_app() +{ + new CKInstApp; +} ADDED uninst/kinst.dsp Index: uninst/kinst.dsp ================================================================== --- uninst/kinst.dsp +++ uninst/kinst.dsp @@ -0,0 +1,245 @@ +# Microsoft Developer Studio Project File - Name="kinst" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** 編集しないでください ** + +# TARGTYPE "Win32 (x86) Application" 0x0101 + +CFG=kinst - Win32 Debug +!MESSAGE これは有効なメイクファイルではありません。 このプロジェクトをビルドするためには NMAKE を使用してください。 +!MESSAGE [メイクファイルのエクスポート] コマンドを使用して実行してください +!MESSAGE +!MESSAGE NMAKE /f "kinst.mak". +!MESSAGE +!MESSAGE NMAKE の実行時に構成を指定できます +!MESSAGE コマンド ライン上でマクロの設定を定義します。例: +!MESSAGE +!MESSAGE NMAKE /f "kinst.mak" CFG="kinst - Win32 Debug" +!MESSAGE +!MESSAGE 選択可能なビルド モード: +!MESSAGE +!MESSAGE "kinst - Win32 Release" ("Win32 (x86) Application" 用) +!MESSAGE "kinst - Win32 Debug" ("Win32 (x86) Application" 用) +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "kinst" +# PROP Scc_LocalPath ".." +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "kinst - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "../tmp/relui" +# PROP Intermediate_Dir "../tmp/relui" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "NDEBUG" +# ADD RSC /l 0x411 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /entry:"kilib_startUp" /subsystem:windows /machine:I386 /out:"../Release/uninst.exe" /opt:"nowin98" +# SUBTRACT LINK32 /pdb:none + +!ELSEIF "$(CFG)" == "kinst - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "../tmp/dbgui" +# PROP Intermediate_Dir "../tmp/dbgui" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "KILIB_LOG" /Yu"stdafx.h" /FD /GZ /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x411 /d "_DEBUG" +# ADD RSC /l 0x411 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /entry:"kilib_startUp" /subsystem:windows /debug /machine:I386 /out:"../Debug/uninst.exe" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "kinst - Win32 Release" +# Name "kinst - Win32 Debug" +# Begin Group "Source Files" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\kinst.cpp +# End Source File +# Begin Source File + +SOURCE=.\kinst.rc +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# End Group +# Begin Group "Header Files" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Source File + +SOURCE=.\resource.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Resource Files" + +# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" +# Begin Source File + +SOURCE=.\del.ico +# End Source File +# Begin Source File + +SOURCE=..\noah.ico +# End Source File +# Begin Source File + +SOURCE=.\noah.ico +# End Source File +# Begin Source File + +SOURCE=.\real.ico +# End Source File +# End Group +# Begin Group "kilib" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=..\kilib\kilib.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kilibext.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_app.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_app.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_carc.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_carc.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_cmd.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_cmd.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_dnd.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_dnd.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_file.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_file.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_find.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_find.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_misc.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_reg.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_reg.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_rythp.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_rythp.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_str.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_str.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_wcmn.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_wcmn.h +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_wnd.cpp +# End Source File +# Begin Source File + +SOURCE=..\kilib\kl_wnd.h +# End Source File +# End Group +# End Target +# End Project ADDED uninst/kinst.plg Index: uninst/kinst.plg ================================================================== --- uninst/kinst.plg +++ uninst/kinst.plg @@ -0,0 +1,78 @@ + + +
      +

      ビルドのログ

      +

      +--------------------構成: kinst - Win32 Release-------------------- +

      +

      コマンド ライン

      +Creating command line "rc.exe /l 0x411 /fo"../tmp/relui/kinst.res" /d "NDEBUG" "C:\Develop\Projects\Noah\uninst\kinst.rc"" +一時ファイル "C:\Users\kinaba\AppData\Local\Temp\RSP8E45.tmp" を作成し、次の内容を記録します +[ +/nologo /ML /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"../tmp/relui/kinst.pch" /Yu"stdafx.h" /Fo"../tmp/relui/" /Fd"../tmp/relui/" /FD /c +"C:\Develop\Projects\Noah\uninst\kinst.cpp" +"C:\Develop\Projects\Noah\kilib\kl_app.cpp" +"C:\Develop\Projects\Noah\kilib\kl_carc.cpp" +"C:\Develop\Projects\Noah\kilib\kl_cmd.cpp" +"C:\Develop\Projects\Noah\kilib\kl_dnd.cpp" +"C:\Develop\Projects\Noah\kilib\kl_file.cpp" +"C:\Develop\Projects\Noah\kilib\kl_find.cpp" +"C:\Develop\Projects\Noah\kilib\kl_reg.cpp" +"C:\Develop\Projects\Noah\kilib\kl_rythp.cpp" +"C:\Develop\Projects\Noah\kilib\kl_str.cpp" +"C:\Develop\Projects\Noah\kilib\kl_wcmn.cpp" +"C:\Develop\Projects\Noah\kilib\kl_wnd.cpp" +] +Creating command line "cl.exe @C:\Users\kinaba\AppData\Local\Temp\RSP8E45.tmp" +一時ファイル "C:\Users\kinaba\AppData\Local\Temp\RSP8E46.tmp" を作成し、次の内容を記録します +[ +/nologo /ML /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /Fp"../tmp/relui/kinst.pch" /Yc"stdafx.h" /Fo"../tmp/relui/" /Fd"../tmp/relui/" /FD /c +"C:\Develop\Projects\Noah\uninst\StdAfx.cpp" +] +Creating command line "cl.exe @C:\Users\kinaba\AppData\Local\Temp\RSP8E46.tmp" +一時ファイル "C:\Users\kinaba\AppData\Local\Temp\RSP8E57.tmp" を作成し、次の内容を記録します +[ +kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib /nologo /entry:"kilib_startUp" /subsystem:windows /incremental:no /pdb:"../tmp/relui/uninst.pdb" /machine:I386 /out:"../Release/uninst.exe" /opt:"nowin98" +\Develop\Projects\Noah\tmp\relui\kinst.obj +\Develop\Projects\Noah\tmp\relui\StdAfx.obj +\Develop\Projects\Noah\tmp\relui\kl_app.obj +\Develop\Projects\Noah\tmp\relui\kl_carc.obj +\Develop\Projects\Noah\tmp\relui\kl_cmd.obj +\Develop\Projects\Noah\tmp\relui\kl_dnd.obj +\Develop\Projects\Noah\tmp\relui\kl_file.obj +\Develop\Projects\Noah\tmp\relui\kl_find.obj +\Develop\Projects\Noah\tmp\relui\kl_reg.obj +\Develop\Projects\Noah\tmp\relui\kl_rythp.obj +\Develop\Projects\Noah\tmp\relui\kl_str.obj +\Develop\Projects\Noah\tmp\relui\kl_wcmn.obj +\Develop\Projects\Noah\tmp\relui\kl_wnd.obj +\Develop\Projects\Noah\tmp\relui\kinst.res +] +コマンド ライン "link.exe @C:\Users\kinaba\AppData\Local\Temp\RSP8E57.tmp" の作成中 +

      アウトプット ウィンドウ

      +リソースをコンパイル中... +コンパイル中... +StdAfx.cpp +コンパイル中... +kinst.cpp +kl_app.cpp +kl_carc.cpp +kl_cmd.cpp +kl_dnd.cpp +kl_file.cpp +kl_find.cpp +kl_reg.cpp +kl_rythp.cpp +kl_str.cpp +kl_wcmn.cpp +kl_wnd.cpp +コードを生成中... +リンク中... + + + +

      結果

      +uninst.exe - エラー 0、警告 0 +
      + + ADDED uninst/kinst.rc Index: uninst/kinst.rc ================================================================== --- uninst/kinst.rc +++ uninst/kinst.rc @@ -0,0 +1,289 @@ +//Microsoft Developer Studio generated resource script. +// +#include "resource.h" + +#define APSTUDIO_READONLY_SYMBOLS +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 2 resource. +// +#include "afxres.h" + +///////////////////////////////////////////////////////////////////////////// +#undef APSTUDIO_READONLY_SYMBOLS + +///////////////////////////////////////////////////////////////////////////// +// 日本語 resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) +#ifdef _WIN32 +LANGUAGE LANG_JAPANESE, SUBLANG_DEFAULT +#pragma code_page(932) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MAIN DIALOG DISCARDABLE 0, 0, 283, 195 +STYLE DS_ABSALIGN | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | + WS_CAPTION | WS_SYSMENU +CAPTION "圧縮解凍ソフト「Noah」のインストール" +FONT 9, "MS Pゴシック" +BEGIN + ICON IDI_NOAH,IDC_STATIC,7,9,20,20,SS_REALSIZEIMAGE + LTEXT " Noahのご利用ありがとうございます。\n「開始」ボタンを押すと、Noahをこのコンピュータへインストールします。\n「中止」ボタンを押すと作業は行われません。", + IDC_STATIC,32,7,238,28,SS_SUNKEN | WS_TABSTOP + DEFPUSHBUTTON "開始",IDOK,130,42,67,22 + PUSHBUTTON "中止",IDCANCEL,201,42,67,21 + GROUPBOX "詳細設定(上級者向け)",IDC_STATIC,7,80,269,108 + CTEXT "既にお勧めの設定になっておりますので、詳細設定は変更せずとも問題はありません。", + IDC_STATIC,16,91,253,19,SS_CENTERIMAGE | SS_SUNKEN + LTEXT "関連付け:",IDC_STATIC,29,117,31,8 + CONTROL "LZH",IDC_LZH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,63, + 116,22,10 + CONTROL "ZIP",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,63, + 128,20,10 + CONTROL "CAB",IDC_CAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,88, + 116,25,10 + CONTROL "RAR",IDC_RAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,88, + 128,24,10 + CONTROL "TAR",IDC_TAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116, + 116,24,10 + CONTROL "YZ1",IDC_YZ1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,116, + 128,21,10 + CONTROL "GCA",IDC_GCA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,143, + 116,25,10 + CONTROL "ARJ",IDC_ARJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,143, + 128,24,10 + CONTROL "BGA",IDC_BGA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171, + 116,25,10 + CONTROL "ACE",IDC_ACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,171, + 128,24,10 + CONTROL "CPT",IDC_CPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,199, + 116,24,10 + CONTROL "JAK",IDC_JAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,199, + 128,23,10 + CONTROL "7Z",IDC_7Z,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,228, + 116,23,10 + LTEXT "シェル拡張:",IDC_STATIC,24,143,36,8 + CONTROL "ここに圧縮",IDC_CMP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,63,142,47,10 + CONTROL "ここに解凍",IDC_MLT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,116,142,47,10 + LTEXT "ショートカット:",IDC_STATIC,18,157,42,8 + CONTROL "送る",IDC_SND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,63, + 156,23,10 + CONTROL "デスクトップ",IDC_DSK,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,116,156,46,10 + PUSHBUTTON "全OFF",IDC_ALL,239,151,24,14 + LTEXT "インストール先:",IDC_STATIC,13,172,47,8 + EDITTEXT IDC_INSTALLTO,62,171,176,12,ES_AUTOHSCROLL + PUSHBUTTON "指定...",IDC_REF,241,170,22,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_MAIN, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 276 + TOPMARGIN, 7 + BOTTOMMARGIN, 188 + END +END +#endif // APSTUDIO_INVOKED + + +#ifdef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// TEXTINCLUDE +// + +1 TEXTINCLUDE DISCARDABLE +BEGIN + "resource.h\0" +END + +2 TEXTINCLUDE DISCARDABLE +BEGIN + "#include ""afxres.h""\r\n" + "\0" +END + +3 TEXTINCLUDE DISCARDABLE +BEGIN + "\r\n" + "\0" +END + +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// Icon +// + +// Icon with lowest ID value placed first to ensure application icon +// remains consistent on all systems. +IDI_MAIN ICON DISCARDABLE "del.ico" +IDI_NOAH ICON DISCARDABLE "..\\noah.ico" + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DIR "ここで選んだフォルダの下に""Noah""フォルダを作って解凍します。" + IDS_BADPATH "インストール先は「C:\\Noah」のように、ドライブ名まで含めて指定してください。" + IDS_COPYFAIL "ファイルのコピーに失敗しました。インストールできませんでした。" + IDS_REGISTFAIL "登録に失敗しました。アンインストールは手動で行ってください。" + IDS_NOAH "圧縮解凍ソフト Noah" + IDS_HELP "Noah 利用手引書" + IDS_UNINSTALLER "Noah アンインストール" + IDS_CALDIX "DLL自動ダウンロード" + IDS_UNINSTOK "Noahのアンインストールを開始してよろしいですか?" + IDS_INSTALLFINISH "インストール完了しました。" + IDS_DLLINST "Noah本体のインストールを完了しました。次に、Noahの実行に必要な「DLL」を自動ダウンロードしますか?(この作業は後でもできます。)" + IDS_UNINSTALLFINISH "アンインストール完了しました。" +END + +#endif // 日本語 resources +///////////////////////////////////////////////////////////////////////////// + + +///////////////////////////////////////////////////////////////////////////// +// 英語 (アメリカ) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) +#ifdef _WIN32 +LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US +#pragma code_page(1252) +#endif //_WIN32 + +///////////////////////////////////////////////////////////////////////////// +// +// Dialog +// + +IDD_MAIN DIALOG DISCARDABLE 0, 0, 283, 177 +STYLE DS_ABSALIGN | DS_MODALFRAME | DS_SETFOREGROUND | DS_CENTER | WS_POPUP | + WS_CAPTION | WS_SYSMENU +CAPTION "Install Noah" +FONT 9, "MS Sans Serif" +BEGIN + ICON IDI_NOAH,-1,7,9,20,20,SS_REALSIZEIMAGE + LTEXT " Thank you for downloading Noah!\nClick the button 'Begin' if you are ready to install.\n* Before installation, you should terminate older version Noah.", + -1,32,7,238,28,SS_SUNKEN | WS_TABSTOP + DEFPUSHBUTTON "&Begin",IDOK,130,42,67,22 + PUSHBUTTON "&Cancel",IDCANCEL,201,42,67,21 + GROUPBOX "Advanced",-1,7,79,269,91 + LTEXT "Association:",-1,23,94,41,8 + CONTROL "LZH",IDC_LZH,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,67, + 94,28,10 + CONTROL "ZIP",IDC_ZIP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,67, + 106,26,10 + CONTROL "CAB",IDC_CAB,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,95, + 94,30,10 + CONTROL "RAR",IDC_RAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,95, + 106,30,10 + CONTROL "TAR",IDC_TAR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125, + 94,29,10 + CONTROL "YZ1",IDC_YZ1,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,125, + 106,27,10 + CONTROL "GCA",IDC_GCA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154, + 94,30,10 + CONTROL "ARJ",IDC_ARJ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,154, + 106,29,10 + CONTROL "BGA",IDC_BGA,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,185, + 94,30,10 + CONTROL "ACE",IDC_ACE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,185, + 106,29,10 + CONTROL "CPT",IDC_CPT,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,216, + 94,29,10 + CONTROL "JAK",IDC_JAK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,216, + 106,29,10 + LTEXT "Shell Extension:",-1,13,120,51,8 + CONTROL "Compress Here",IDC_CMP,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,67,120,71,10 + CONTROL "Extract Here",IDC_MLT,"Button",BS_AUTOCHECKBOX | + WS_TABSTOP,147,120,66,10 + LTEXT "ShortCut:",-1,32,135,32,8 + CONTROL "SendTo",IDC_SND,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 67,134,44,10 + CONTROL "Desktop",IDC_DSK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP, + 122,134,51,10 + PUSHBUTTON "all &off",IDC_ALL,244,129,22,14 + LTEXT "Install to:",-1,32,150,29,8 + EDITTEXT IDC_INSTALLTO,67,149,176,12,ES_AUTOHSCROLL + PUSHBUTTON "&ref...",IDC_REF,247,148,20,14 +END + + +///////////////////////////////////////////////////////////////////////////// +// +// DESIGNINFO +// + +#ifdef APSTUDIO_INVOKED +GUIDELINES DESIGNINFO DISCARDABLE +BEGIN + IDD_MAIN, DIALOG + BEGIN + LEFTMARGIN, 7 + RIGHTMARGIN, 276 + TOPMARGIN, 7 + BOTTOMMARGIN, 170 + END +END +#endif // APSTUDIO_INVOKED + + +///////////////////////////////////////////////////////////////////////////// +// +// String Table +// + +STRINGTABLE DISCARDABLE +BEGIN + IDS_DIR "Select Target Directory." + IDS_BADPATH "Target Directory must be specified in full path." + IDS_COPYFAIL "Failed To Copy Files. Installation Aborted." + IDS_REGISTFAIL "Failed." + IDS_NOAH "Noah Archiver" + IDS_HELP "Noah Manual" + IDS_UNINSTALLER "Noah Uninstall" + IDS_CALDIX "DLL Download" + IDS_UNINSTOK "Do you want to uninstall Noah?" + IDS_INSTALLFINISH "Finished installing Noah." + IDS_DLLINST "Download DLLs from Internet ? ( You can do this also after installation. )" + IDS_UNINSTALLFINISH "Uninstallation finished." +END + +#endif // 英語 (アメリカ) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + ADDED uninst/resource.h Index: uninst/resource.h ================================================================== --- uninst/resource.h +++ uninst/resource.h @@ -0,0 +1,52 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Developer Studio generated include file. +// Used by kinst.rc +// +#define IDS_DIR 1 +#define IDS_BADPATH 2 +#define IDS_COPYFAIL 3 +#define IDS_REGISTFAIL 4 +#define IDS_NOAH 5 +#define IDS_HELP 6 +#define IDS_UNINSTALLER 7 +#define IDS_CALDIX 8 +#define IDS_UNINSTOK 9 +#define IDS_INSTALLFINISH 10 +#define IDS_DLLINST 11 +#define IDS_UNINSTALLFINISH 12 +#define IDD_DIALOG1 101 +#define IDD_MAIN 101 +#define IDI_MAIN 102 +#define IDI_NOAH 103 +#define IDC_LZH 1001 +#define IDC_ZIP 1002 +#define IDC_CAB 1003 +#define IDC_RAR 1004 +#define IDC_TAR 1005 +#define IDC_YZ1 1006 +#define IDC_GCA 1007 +#define IDC_ARJ 1008 +#define IDC_BGA 1009 +#define IDC_ACE 1010 +#define IDC_CPT 1011 +#define IDC_JAK 1012 +#define IDC_7Z 1013 +#define IDC_CMP 1014 +#define IDC_MLT 1015 +#define IDC_SND 1016 +#define IDC_DSK 1017 +#define IDC_STT 1018 +#define IDC_INSTALLTO 1019 +#define IDC_REF 1020 +#define IDC_ALL 1022 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 104 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1024 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif