class LboxUnlha

  コンストラクタ



UNLHA32.DLL for windows32 をインストールする必要があります

事前定義
  
#define FNAME_MAX32		512
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, *LPINDIVIDUALINFO;

typedef HARC (WINAPI *LPFUNC_OPEN_ARC)
(const HWND _hwnd, LPCSTR _szFileName,const DWORD _dwMode);
typedef int (WINAPI *LPFUNC_CLOSE_ARC)
(HARC _harc);
typedef int (WINAPI *LPFUNC_FIND_FIRST)
(HARC _harc, LPCSTR _szWildName,INDIVIDUALINFO FAR *lpSubInfo);
typedef int (WINAPI *LPFUNC_FIND_NEXT)
(HARC _harc,INDIVIDUALINFO FAR *_lpSubInfo);

typedef int (WINAPI *LPFUNC_UNLHA)
(const HWND _hwnd,LPCSTR _szCmdLine,LPSTR _szOutput,const DWORD _dwSize);
typedef int (WINAPI *LPFUNC_UNZIP)
(const HWND _hwnd,LPCSTR _szCmdLine,LPSTR _szOutput,const DWORD _dwSize);
typedef int (WINAPI *LPFUNC_ZIP)
(const HWND _hwnd,LPCSTR _szCmdLine,LPSTR _szOutput,const DWORD _dwSize);
  

  
// *********************************************************
// コンストラクタ
// *********************************************************
LboxUnlha::LboxUnlha()
{
	LboxUnlha::hArc = NULL;
	LboxUnlha::lib = NULL;
	LboxUnlha::hOwner = NULL;
	LboxUnlha::Mode = M_REGARDLESS_INIT_FILE;
	this->Output.Resize( MAX_PATH );
}
LboxUnlha::LboxUnlha( HWND hWnd )
{
	LboxUnlha::hArc = NULL;
	LboxUnlha::lib = NULL;
	LboxUnlha::hOwner = hWnd;
	LboxUnlha::Mode = M_REGARDLESS_INIT_FILE;
	this->Output.Resize( MAX_PATH );
}

// *********************************************************
// デストラクタ
// *********************************************************
LboxUnlha::~LboxUnlha()
{
	if ( LboxUnlha::hArc != NULL ) {
		UnlhaCloseArchive( LboxUnlha::hArc );
	}
	if ( LboxUnlha::lib != NULL ) {
		FreeLibrary( LboxUnlha::lib ); 
	}
}
  



  Initialize



  
// *********************************************************
// 初期化
// 戻り値 : 無し
// *********************************************************
void LboxUnlha::Initialize( void )
{
	if ( LboxUnlha::lib != NULL ) {
		return;
	}

	LboxUnlha::lib = LoadLibrary( "UNLHA32.DLL" );
	if ( LboxUnlha::lib == NULL ) {
		return;
	}

	LboxUnlha::UnlhaOpenArchive =
		(LPFUNC_OPEN_ARC)GetProcAddress(
			LboxUnlha::lib, "UnlhaOpenArchive" 
		);

	LboxUnlha::UnlhaCloseArchive =
		(LPFUNC_CLOSE_ARC)GetProcAddress(
			LboxUnlha::lib, "UnlhaCloseArchive" 
		);

	LboxUnlha::UnlhaFindFirst =
		(LPFUNC_FIND_FIRST)GetProcAddress(
			LboxUnlha::lib, "UnlhaFindFirst" 
		);

	LboxUnlha::UnlhaFindNext =
		(LPFUNC_FIND_NEXT)GetProcAddress(
			LboxUnlha::lib, "UnlhaFindNext" 
		);

	LboxUnlha::UnlhaAction =
		(LPFUNC_UNLHA)GetProcAddress(
			LboxUnlha::lib, "Unlha" 
		);
}
  



  CheckDll

  
// *********************************************************
// DLL ロードが正常かどうか
// 戻り値 : OK true, NO false
// *********************************************************
BOOL LboxUnlha::CheckDll( void )
{
	if ( LboxUnlha::lib != NULL ) {
		return true;
	}
	else {
		return false;
	}
}
  



  OpenArchive

  
// *********************************************************
// アーカイブ オープン
// 戻り値 : 成功 true, 失敗 false
// *********************************************************
BOOL LboxUnlha::OpenArchive( LPTSTR szFileName )
{
	if ( LboxUnlha::lib == NULL ) {
		return false;;
	}

	if ( LboxUnlha::hArc != NULL ) {
		LboxUnlha::CloseArchive( );
	}

	LboxUnlha::hArc = UnlhaOpenArchive(
		LboxUnlha::hOwner,
		szFileName,
		LboxUnlha::Mode
	);
	if ( LboxUnlha::hArc == NULL ) {
		return false;
	}

	return true;
}
  



  CloseArchive

  
// *********************************************************
// アーカイブ クローズ
// 戻り値 : 無し
// *********************************************************
void LboxUnlha::CloseArchive( void )
{
	if ( LboxUnlha::lib == NULL ) {
		return;
	}
	if ( LboxUnlha::hArc == NULL ) {
		return;
	}

	UnlhaCloseArchive( LboxUnlha::hArc );
	LboxUnlha::hArc = NULL;
}
  



  EnumListbox

  
// *********************************************************
// リストボックスに列挙
// 戻り値 : 成功 true, 失敗 false
// *********************************************************
BOOL LboxUnlha::EnumListbox( HWND hList, int nIndex, LPTSTR szWildName )
{
	if ( LboxUnlha::lib == NULL ) {
		return false;
	}
	if ( LboxUnlha::hArc == NULL ) {
		return false;
	}

	INDIVIDUALINFO ivinfo;
	int ret;

	ret = UnlhaFindFirst(
		LboxUnlha::hArc,
		szWildName,
		&ivinfo
	);

	char *szBuffer = new char[1024];
	ZeroMemory( szBuffer, 1024 );
	FILETIME ft;
	SYSTEMTIME st;

	while( ret == 0 ) {

		lstrcpy( szBuffer, ivinfo.szFileName );
		wsprintf( szBuffer+lstrlen(szBuffer), "\t%d",
			ivinfo.dwOriginalSize );
		wsprintf( szBuffer+lstrlen(szBuffer), "\t%d",
			ivinfo.dwCompressedSize );
		wsprintf( szBuffer+lstrlen(szBuffer), "\t%d",
			ivinfo.wRatio );

		DosDateTimeToFileTime( ivinfo.wDate, ivinfo.wTime, &ft );
		FileTimeToSystemTime( &ft, &st );
		wsprintf(
			szBuffer+lstrlen(szBuffer),
			"\t%04d/%02d/%02d %02d:%02d:%02d",
			st.wYear,
			st.wMonth,
			st.wDay,
			st.wHour,
			st.wMinute,
			st.wSecond
		);
		wsprintf( szBuffer+lstrlen(szBuffer), "\t%s",
			ivinfo.szAttribute );
		wsprintf( szBuffer+lstrlen(szBuffer), "\t%s",
			ivinfo.szMode );

		LboxListInsert( hList, nIndex, szBuffer );
		ret = UnlhaFindNext(
			LboxUnlha::hArc,
			&ivinfo
		);
		nIndex++;
	}

	delete [] szBuffer;

	return true;
}
  



  Unlha

  
// *********************************************************
// 書庫一般
// 戻り値 : 0 正常終了, それ以外はエラー
// *********************************************************
int LboxUnlha::Unlha( LboxString *LCmdLine )
{
	return LboxUnlha::Unlha(
		LCmdLine->szLboxString,
		this->Output.szLboxString,
		this->Output.nLboxString
	);
}
int LboxUnlha::Unlha(
LPTSTR szCmdLine, LPTSTR szOutput, const DWORD dwSize )
{
	if ( LboxUnlha::lib == NULL ) {
		return 1;
	}

	return UnlhaAction(
		LboxUnlha::hOwner,
		szCmdLine,
		szOutput,
		dwSize
	);
}
  



  Enum

  
// *********************************************************
// リストビューに列挙
// 戻り値 : 成功 true, 失敗 false
// *********************************************************
BOOL LboxUnlha::Enum( LboxListview *Lview, LPTSTR szWildName )
{
	if ( LboxUnlha::lib == NULL ) {
		return false;
	}
	if ( LboxUnlha::hArc == NULL ) {
		return false;
	}

	Lview->Initialize();
	Lview->AddColumn( LVCFMT_LEFT, 100, "" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "ファイル名" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "サイズ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "圧縮サイズ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "圧縮率" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "タイムスタンプ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "属性" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "モード" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "ディレクトリ" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "フルパス" );
	Lview->AddColumn( LVCFMT_LEFT, 100, "ソート" );

	INDIVIDUALINFO ivinfo;
	int ret;

	ret = UnlhaFindFirst(
		LboxUnlha::hArc,
		szWildName,
		&ivinfo
	);

	FILETIME ft;
	SYSTEMTIME st;
	int nCount;
	LboxString LString;

	while( ret == 0 ) {

		Lview->AddRow();

		LString.operator = (ivinfo.szFileName );
		LString.Replace( "/", "\\" );
		LString.StripPath( );
		LString.Replace( "\\", "/" );
		Lview->SetColumnText( 1, &LString );

		Lview->SetColumnPrintf( 2, "%d", ivinfo.dwOriginalSize );
		Lview->SetColumnPrintf( 3, "%d", ivinfo.dwCompressedSize );
		LString.Printf( "%d", ivinfo.wRatio );
		if ( LString.Length() > 0 ) {
			LString.Insert( ".", LString.Length()-1 );
			Lview->SetColumnText( 4, &LString );
		}

		DosDateTimeToFileTime( ivinfo.wDate, ivinfo.wTime, &ft );
		FileTimeToSystemTime( &ft, &st );
		Lview->SetColumnPrintf( 5,
			"%04d/%02d/%02d %02d:%02d:%02d",
			st.wYear,
			st.wMonth,
			st.wDay,
			st.wHour,
			st.wMinute,
			st.wSecond
		);
		Lview->SetColumnText( 6, ivinfo.szAttribute );
		Lview->SetColumnText( 7, ivinfo.szMode );

		LString.operator = (ivinfo.szFileName );
		LString.Replace( "/", "\\" );
		LString.RemoveFileSpec( );
		LString.Replace( "\\", "/" );
		Lview->SetColumnText( 8, &LString );
		if ( LString.operator == ( "" ) ) {
			LString.operator = (" ");
			LString.operator += (ivinfo.szFileName);
			Lview->SetColumnText( 10, &(LString) );
		}
		else {
			Lview->SetColumnText( 10, ivinfo.szFileName );
		}

		Lview->SetColumnText( 9, ivinfo.szFileName );

		ret = UnlhaFindNext(
			LboxUnlha::hArc,
			&ivinfo
		);
	}

	Lview->Sort( 10, 0 );
	nCount = -1;
	while( Lview->FindNextRow( &nCount ) ) {
		Lview->SetColumnPrintf( 0, "%d", nCount+1 );
	}
	Lview->Fit();
	Lview->SetColumnWidth( 10, 0 );
	return true;
}
  



  Freeze

  
// *********************************************************
// ドラッグドロップされたファイルを書庫へ登録または更新
// 戻り値 : 0 正常終了, それ以外はエラー
// *********************************************************
int LboxUnlha::Freeze( HDROP hDrop )
{
	int i,nFiles;
	LboxString LFile;

	LFile.Resize( MAX_PATH );

	nFiles = DragQueryFile(
		hDrop,
		0xFFFFFFFF,
		LFile.szLboxString,
		LFile.nLboxString
	);

	this->Command.SetChar( 0, 0 );
	this->Command.operator = ( "U -r2x " );
	LFile.operator = (&(this->TargetPath));
	LFile.Enclose('"');
	this->Command.operator += ( &(LFile) );
	this->Command.operator += ( " " );
	for( i = 0; i < nFiles; i++ ) {
		if ( i != 0 ) {
			this->Command.operator += ( " " );
		}
		DragQueryFile(
			hDrop,
			i,
			LFile.szLboxString,
			LFile.nLboxString
		);
		LFile.RemoveFileSpec();
		LFile.AddBackslash();
		LFile.Enclose( '"' );
		this->Command.operator += ( &LFile );
		this->Command.operator += ( " " );

		DragQueryFile(
			hDrop,
			i,
			LFile.szLboxString,
			LFile.nLboxString
		);
		LFile.StripPath();
		LFile.Enclose( '"' );
		this->Command.operator += ( &LFile );
	}

	return LboxUnlha::Unlha(
		&(this->Command)
	);

}
// *********************************************************
// 複数のファイルを書庫登録または更新
// 戻り値 : 0 正常終了, それ以外はエラー
// LPath は、フルパスファイルリスト ( タブ区切り )
// *********************************************************
int LboxUnlha::Freeze( LboxString *LPath )
{
	return LboxUnlha::Freeze(
		LPath->szLboxString
	);
}
int LboxUnlha::Freeze( LPTSTR lpPath )
{
	LboxToken LToken;
	LboxString LString;
	
	LToken.CreateToken( lpPath, "\t" );

	int i;

	this->Command.operator = ( "U -r2x " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );
	for( i = 0; i < LToken.nCount; i++ ) {
		if ( i != 0 ) {
			this->Command.operator += ( " " );
		}
		LString.operator = (LToken.Token[i]);
		LString.RemoveFileSpec();
		LString.AddBackslash();
		LString.Enclose('"');
		this->Command.operator += (&LString);
		this->Command.operator += ( " " );
		LString.operator = (LToken.Token[i]);
		LString.StripPath();
		LString.Enclose('"');
		this->Command.operator += (&LString);
	}

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  



  Delete

  
// *********************************************************
// リストビューの選択されている行のファイルを削除
// 戻り値 : 0 正常終了, それ以外はエラー
// *********************************************************
int LboxUnlha::Delete( LboxListview *Lview )
{
	LboxString LString;
	int nRow;
	BOOL bFirst;

	this->Command.operator = ( "D -p2 " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	nRow = -1;
	bFirst = true;
	while( Lview->FindNextSelectedRow( &nRow ) ) {
		if ( bFirst ) {
			bFirst = false;
		}
		else {
			this->Command.operator += ( " " );
		}
		Lview->GetColumnText( 9, &LString );
		LString.Enclose('"');
		this->Command.operator += ( &(LString) );
	}

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  



  MeltDirect

  
// *********************************************************
// リストビューの選択されている行のファイルを解凍
// 戻り値 : 0 正常終了, それ以外はエラー
// 解凍先にパス情報を反映しない
// *********************************************************
int LboxUnlha::MeltDirect( LboxListview *Lview, LboxString *LDir )
{
	return LboxUnlha::MeltDirect(
		Lview,
		LDir->szLboxString
	);
}
int LboxUnlha::MeltDirect( LboxListview *Lview, LPTSTR lpDir )
{
	LboxString LString;
	int nRow;
	BOOL bFirst;

	this->Command.operator = ( "E -p2 " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );
	LString.operator = (lpDir);
	LString.AddBackslash();
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	nRow = -1;
	bFirst = true;
	while( Lview->FindNextSelectedRow( &nRow ) ) {
		if ( bFirst ) {
			bFirst = false;
		}
		else {
			this->Command.operator += ( " " );
		}
		Lview->GetColumnText( 9, &LString );
		LString.Enclose('"');
		this->Command.operator += ( &(LString) );
	}

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  



  MeltPath

  
// *********************************************************
// リストビューの選択されている行のファイルを解凍
// 戻り値 : 0 正常終了, それ以外はエラー
// 解凍先にパス情報を反映しない
// *********************************************************
int LboxUnlha::MeltPath( LboxListview *Lview, LboxString *LDir )
{
	return LboxUnlha::MeltPath(
		Lview,
		LDir->szLboxString
	);
}
int LboxUnlha::MeltPath( LboxListview *Lview, LPTSTR lpDir )
{
	LboxString LString;
	int nRow;
	BOOL bFirst;

	this->Command.operator = ( "X -p2 " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );
	LString.operator = (lpDir);
	LString.AddBackslash();
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	nRow = -1;
	bFirst = true;
	while( Lview->FindNextSelectedRow( &nRow ) ) {
		if ( bFirst ) {
			bFirst = false;
		}
		else {
			this->Command.operator += ( " " );
		}
		Lview->GetColumnText( 9, &LString );
		LString.Enclose('"');
		this->Command.operator += ( &(LString) );
	}

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  



  MeltAll

  
// *********************************************************
// ディレクトリを作成して全て解凍
// 戻り値 : 0 正常終了, それ以外はエラー
// *********************************************************
int LboxUnlha::MeltAll(
	int nType
)
{
	LboxString LString;

	this->Output.Resize( 4096 );
	// コマンドパラメータ
	if ( nType == 0 ) {
		this->Command.operator = ( "X -p2 " );
	}
	else {
		this->Command.operator = ( "E -p2 " );
	}

	// 書庫パラメータ
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	if ( this->TargetPath.operator == ("") ) {
		this->ErrMessage.operator = ("書庫が指定されていません");
		return -1;
	}

	// ディレクトリ作成
	LString.operator = (&(this->TargetPath));
	LString.RemoveExtension();
	CreateDirectory( LString.szLboxString, NULL );

	LString.AddBackslash();
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " *" );

	return this->Unlha(
		&(this->Command)
	);

}
  



  MeltDirectRow

  
int LboxUnlha::MeltDirectRow( LboxListview *Lview, int nTargetRow, LboxString *LDir )
{
	return LboxUnlha::MeltDirectRow(
		Lview,
		nTargetRow,
		LDir->szLboxString
	);
}
int LboxUnlha::MeltDirectRow( LboxListview *Lview, int nTargetRow, LPTSTR lpDir )
{
	LboxString LString;
	int nRow;
	BOOL bFirst;

	this->Command.operator = ( "E -p2 " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );
	LString.operator = (lpDir);
	LString.AddBackslash();
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	Lview->SetCurrentRow( nTargetRow );
	Lview->GetColumnText( 10, &LString );
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  



  MeltPathRow

  
int LboxUnlha::MeltPathRow( LboxListview *Lview, int nTargetRow, LboxString *LDir )
{
	return LboxUnlha::MeltPathRow(
		Lview,
		nTargetRow,
		LDir->szLboxString
	);
}
int LboxUnlha::MeltPathRow( LboxListview *Lview, int nTargetRow, LPTSTR lpDir )
{
	LboxString LString;
	int nRow;
	BOOL bFirst;

	this->Command.operator = ( "X -p2 " );
	LString.operator = (&(this->TargetPath));
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );
	LString.operator = (lpDir);
	LString.AddBackslash();
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );
	this->Command.operator += ( " " );

	Lview->SetCurrentRow( nTargetRow );
	Lview->GetColumnText( 10, &LString );
	LString.Enclose('"');
	this->Command.operator += ( &(LString) );

	return LboxUnlha::Unlha(
		&(this->Command)
	);
}
  










  infoboard   管理者用   
このエントリーをはてなブックマークに追加





フリーフォントWEBサービス
SQLの窓WEBサービス

SQLの窓フリーソフト

素材

一般WEBツールリンク

SQLの窓

フリーソフト

JSライブラリ